pax_global_header00006660000000000000000000000064151063444600014515gustar00rootroot0000000000000052 comment=715900394e02cb4940247976d9c22936505b48ff resources-1.9.1/000077500000000000000000000000001510634446000135375ustar00rootroot00000000000000resources-1.9.1/.github/000077500000000000000000000000001510634446000150775ustar00rootroot00000000000000resources-1.9.1/.github/ISSUE_TEMPLATE/000077500000000000000000000000001510634446000172625ustar00rootroot00000000000000resources-1.9.1/.github/ISSUE_TEMPLATE/bug_report.yaml000066400000000000000000000057461510634446000223320ustar00rootroot00000000000000name: "\U0001F41E Bug Report" description: Create a bug report to help us fix it labels: ["bug"] body: - type: checkboxes attributes: label: Is there an existing issue for this? description: Please search to see if an issue already exists for the bug you encountered. options: - label: I searched the existing issues and did not find anything similar. required: true - type: textarea attributes: label: Current Behavior description: A concise description of what you're experiencing. validations: required: false - type: textarea attributes: label: Expected Behavior description: A concise description of what you expected to happen. validations: required: false - type: textarea attributes: label: Steps to Reproduce description: Steps to reproduce the behavior. placeholder: | 1. Go to '…' 2. Click on '…' 3. Scroll down to '…' 4. See error validations: required: false - type: textarea attributes: label: Debug Logs description: | Please run Resources once with debug logs enabled (if possible) and include the terminal output here. This helps us to get hardware and software information in a streamlined way. You can do this by running `flatpak run --env=RUST_LOG=resources=debug net.nokyan.Resources` in your terminal if you've installed Resources using Flatpak. Otherwise run `RUST_LOG=resources=debug resources`. Especially during process and app detection, personally identifiable information may be printed in the debug logs, please double-check that there's nothing inside that you don't want to be public. If your issue is unrelated to process/app detection, you can safely omit any messages that start with `DEBUG resources::utils::app`. value: |
Expand logs ``` REPLACE THIS SENTENCE WITH THE TERMINAL OUTPUT OF THE AFOREMENTIONED COMMAND. ```
validations: required: true - type: textarea attributes: label: Environment description: | Please provide information about your environment if you were not able to include debug logs as described above. placeholder: | Resources version: 1.9.1 (you can find this in the 'About' dialog) Package type: Flatpak Operating system: Ubuntu 22.04 Hardware info: Intel i7-7700k, Nvidia GTX 1080, … … render: markdown validations: required: false - type: textarea attributes: label: Anything Else? description: | Links? References? Anything that will give us more context about the issue you are encountering! Tip: You can attach images or log files by clicking this area to highlight it and then dragging files in. validations: required: false resources-1.9.1/.github/ISSUE_TEMPLATE/feature_request.yaml000066400000000000000000000033071510634446000233540ustar00rootroot00000000000000name: "\U0001F680 Feature Request" description: Suggest an idea for this project labels: ["enhancement"] body: - type: checkboxes attributes: label: Is there an existing issue for this? description: Please search to see if an issue already exists for the bug you encountered. options: - label: I have searched the existing issues required: true - type: textarea attributes: label: Is your feature request related to a problem? Please describe. description: A clear and concise description of what the problem is. placeholder: I'm always frustrated when I have to press this small button. validations: required: false - type: textarea attributes: label: Describe the solution you'd like description: A clear and concise description of what you want to happen. placeholder: Make this button bigger validations: required: false - type: textarea attributes: label: Describe alternatives you've considered description: A clear and concise description of any alternative solutions or features you've considered. placeholder: I wanted to but bigger display, but it would be too expensive. validations: required: false - type: textarea attributes: label: Additional context description: | Add any other context or screenshots about the feature request here. Tip: You can attach images or log files by clicking this area to highlight it and then dragging files in. validations: required: false - type: markdown attributes: value: | --- The more thumbs up 👍 your idea gets, the more likely it is that we'll implement it. ✨ resources-1.9.1/.github/workflows/000077500000000000000000000000001510634446000171345ustar00rootroot00000000000000resources-1.9.1/.github/workflows/flatpak.yml000066400000000000000000000010671510634446000213050ustar00rootroot00000000000000name: Flatpak Build Test on: push: branches: [main] pull_request: env: CARGO_TERM_COLOR: always jobs: flatpak: runs-on: ubuntu-latest container: image: ghcr.io/flathub-infra/flatpak-github-actions:gnome-48 options: --privileged steps: - uses: actions/checkout@v4 - uses: flatpak/flatpak-github-actions/flatpak-builder@v6 with: manifest-path: build-aux/net.nokyan.Resources.Devel.json run-tests: true cache-key: flatpak-builder-${{ github.sha }} upload-artifact: false resources-1.9.1/.gitignore000066400000000000000000000002241510634446000155250ustar00rootroot00000000000000target/ build/ _build/ builddir/ build-aux/app build-aux/.flatpak-builder/ src/config.rs *.ui.in~ *.ui~ .flatpak/ .flatpak-builder/ .vscode/ vendor resources-1.9.1/.typos.toml000066400000000000000000000002021510634446000156620ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2022 Emmanuele Bassi # SPDX-License-Identifier: CC0-1.0 [files] extend-exclude = ["LICENSES/*", "po/*"]resources-1.9.1/CODE_OF_CONDUCT.md000066400000000000000000000253541510634446000163470ustar00rootroot00000000000000# GNOME Code of Conduct Thank you for being a part of the GNOME project. We value your participation and want everyone to have an enjoyable and fulfilling experience. Accordingly, all participants are expected to follow this Code of Conduct, and to show respect, understanding, and consideration to one another. Thank you for helping make this a welcoming, friendly community for everyone. ## Scope This Code of Conduct applies to all online GNOME community spaces, including, but not limited to: * Issue tracking systems - bugzilla.gnome.org * Documentation and tutorials - developer.gnome.org * Code repositories - git.gnome.org and gitlab.gnome.org * Mailing lists - mail.gnome.org * Wikis - wiki.gnome.org * Chat and forums - irc.gnome.org, discourse.gnome.org, GNOME Telegram channels, and GNOME groups and channels on Matrix.org (including bridges to GNOME IRC channels) * Community spaces hosted on gnome.org infrastructure * Any other channels or groups which exist in order to discuss GNOME project activities Communication channels and private conversations that are normally out of scope may be considered in scope if a GNOME participant is being stalked or harassed. Social media conversations may be considered in-scope if the incident occurred under a GNOME event hashtag, or when an official GNOME account on social media is tagged, or within any other discussion about GNOME. The GNOME Foundation reserves the right to take actions against behaviors that happen in any context, if they are deemed to be relevant to the GNOME project and its participants. All participants in GNOME online community spaces are subject to the Code of Conduct. This includes GNOME Foundation board members, corporate sponsors, and paid employees. This also includes volunteers, maintainers, leaders, contributors, contribution reviewers, issue reporters, GNOME users, and anyone participating in discussion in GNOME online spaces. ## Reporting an Incident If you believe that someone is violating the Code of Conduct, or have any other concerns, please [contact the Code of Conduct committee](https://wiki.gnome.org/Foundation/CodeOfConduct/ReporterGuide). ## Our Standards The GNOME online community is dedicated to providing a positive experience for everyone, regardless of: * age * body size * caste * citizenship * disability * education * ethnicity * familial status * gender expression * gender identity * genetic information * immigration status * level of experience * nationality * personal appearance * pregnancy * race * religion * sex characteristics * sexual orientation * sexual identity * socio-economic status * tribe * veteran status ### Community Guidelines Examples of behavior that contributes to creating a positive environment include: * **Be friendly.** Use welcoming and inclusive language. * **Be empathetic.** Be respectful of differing viewpoints and experiences. * **Be respectful.** When we disagree, we do so in a polite and constructive manner. * **Be considerate.** Remember that decisions are often a difficult choice between competing priorities. Focus on what is best for the community. Keep discussions around technology choices constructive and respectful. * **Be patient and generous.** If someone asks for help it is because they need it. When documentation is available that answers the question, politely point them to it. If the question is off-topic, suggest a more appropriate online space to seek help. * **Try to be concise.** Read the discussion before commenting in order to not repeat a point that has been made. ### Inappropriate Behavior Community members asked to stop any inappropriate behavior are expected to comply immediately. We want all participants in the GNOME community have the best possible experience they can. In order to be clear what that means, we've provided a list of examples of behaviors that are inappropriate for GNOME community spaces: * **Deliberate intimidation, stalking, or following.** * **Sustained disruption of online discussion, talks, or other events.** Sustained disruption of events, online discussions, or meetings, including talks and presentations, will not be tolerated. This includes 'Talking over' or 'heckling' event speakers or influencing crowd actions that cause hostility in event sessions. Sustained disruption also includes drinking alcohol to excess or using recreational drugs to excess, or pushing others to do so. * **Harassment of people who don't drink alcohol.** We do not tolerate derogatory comments about those who abstain from alcohol or other substances. We do not tolerate pushing people to drink, talking about their abstinence or preferences to others, or pressuring them to drink - physically or through jeering. * **Sexist, racist, homophobic, transphobic, ableist language or otherwise exclusionary language.** This includes deliberately referring to someone by a gender that they do not identify with, and/or questioning the legitimacy of an individual's gender identity. If you're unsure if a word is derogatory, don't use it. This also includes repeated subtle and/or indirect discrimination. * **Unwelcome sexual attention or behavior that contributes to a sexualized environment.** This includes sexualized comments, jokes or imagery in interactions, communications or presentation materials, as well as inappropriate touching, groping, or sexual advances. Sponsors should not use sexualized images, activities, or other material. Meetup organizing staff and other volunteer organizers should not use sexualized clothing/uniforms/costumes, or otherwise create a sexualized environment. * **Unwelcome physical contact.** This includes touching a person without permission, including sensitive areas such as their hair, pregnant stomach, mobility device (wheelchair, scooter, etc) or tattoos. This also includes physically blocking or intimidating another person. Physical contact or simulated physical contact (such as emojis like "kiss") without affirmative consent is not acceptable. This includes sharing or distribution of sexualized images or text. * **Violence or threats of violence.** Violence and threats of violence are not acceptable - online or offline. This includes incitement of violence toward any individual, including encouraging a person to commit self-harm. This also includes posting or threatening to post other people's personally identifying information ("doxxing") online. * **Influencing or encouraging inappropriate behavior.** If you influence or encourage another person to violate the Code of Conduct, you may face the same consequences as if you had violated the Code of Conduct. * **Possession of an offensive weapon at a GNOME event.** This includes anything deemed to be a weapon by the event organizers. The GNOME community prioritizes marginalized people's safety over privileged people's comfort. The committee will not act on complaints regarding: * "Reverse"-isms, including "reverse racism," "reverse sexism," and "cisphobia" * Reasonable communication of boundaries, such as "leave me alone," "go away," or "I'm not discussing this with you." * Criticizing racist, sexist, cissexist, or otherwise oppressive behavior or assumptions * Communicating boundaries or criticizing oppressive behavior in a "tone" you don't find congenial The examples listed above are not against the Code of Conduct. If you have questions about the above statements, please [read this document](https://github.com/sagesharp/code-of-conduct-template/blob/master/code-of-conduct/example-reversisms.md#supporting-diversity). If a participant engages in behavior that violates this code of conduct, the GNOME Code of Conduct committee may take any action they deem appropriate. Examples of consequences are outlined in the [Committee Procedures Guide](https://wiki.gnome.org/Foundation/CodeOfConduct/CommitteeProcedures). ## Procedure for Handling Incidents * [Reporter Guide](https://wiki.gnome.org/Foundation/CodeOfConduct/ReporterGuide) * [Moderator Procedures](https://wiki.gnome.org/Foundation/CodeOfConduct/ModeratorProcedures) * [Committee Procedures Guide](https://wiki.gnome.org/Foundation/CodeOfConduct/CommitteeProcedures) ## License The GNOME Online Code of Conduct is licensed under a [Creative Commons Attribution Share-Alike 3.0 Unported License](http://creativecommons.org/licenses/by-sa/3.0/) ![Creative Commons License](http://i.creativecommons.org/l/by-sa/3.0/88x31.png) ## Attribution The GNOME Online Code of Conduct was forked from the example policy from the [Geek Feminism wiki, created by the Ada Initiative and other volunteers](http://geekfeminism.wikia.com/wiki/Conference_anti-harassment/Policy), which is under a Creative Commons Zero license. Additional language was incorporated and modified from the following Codes of Conduct: * [Citizen Code of Conduct](http://citizencodeofconduct.org/) is licensed [Creative Commons Attribution Share-Alike 3.0 Unported License](http://creativecommons.org/licenses/by-sa/3.0/). * [Code of Conduct template](https://github.com/sagesharp/code-of-conduct-template/) is licensed [Creative Commons Attribution Share-Alike 3.0 Unported License](http://creativecommons.org/licenses/by-sa/3.0/) by [Otter Tech](https://otter.technology/code-of-conduct-training) * [Contributor Covenant version 1.4](https://www.contributor-covenant.org/version/1/4/code-of-conduct) (licensed [CC BY 4.0](https://github.com/ContributorCovenant/contributor_covenant/blob/master/LICENSE.md)) * [Data Carpentry Code of Conduct](https://docs.carpentries.org/topic_folders/policies/index_coc.html) is licensed [Creative Commons Attribution 4.0 License](https://creativecommons.org/licenses/by/4.0/) * [Django Project Code of Conduct](https://www.djangoproject.com/conduct/) is licensed under a [Creative Commons Attribution 3.0 Unported License](http://creativecommons.org/licenses/by/3.0/) * [Fedora Code of Conduct](http://fedoraproject.org/code-of-conduct) * [Geek Feminism Anti-harassment Policy](http://geekfeminism.wikia.com/wiki/Conference_anti-harassment/Policy) which is under a [Creative Commons Zero license](https://creativecommons.org/publicdomain/zero/1.0/) * [Previous GNOME Foundation Code of Conduct](https://wiki.gnome.org/action/recall/Foundation/CodeOfConduct/Old) * [LGBTQ in Technology Slack Code of Conduct](https://lgbtq.technology/coc.html) licensed [Creative Commons Zero](https://creativecommons.org/publicdomain/zero/1.0/) * [Mozilla Community Participation Guidelines](https://www.mozilla.org/en-US/about/governance/policies/participation/) is licensed [Creative Commons Attribution-ShareAlike 3.0 Unported License](https://creativecommons.org/licenses/by-sa/3.0/). * [Python Mentors Code of Conduct](http://pythonmentors.com/) * [Speak Up! Community Code of Conduct](http://web.archive.org/web/20141109123859/http://speakup.io/coc.html), licensed under a [Creative Commons Attribution 3.0 Unported License](http://creativecommons.org/licenses/by/3.0/) resources-1.9.1/Cargo.lock000066400000000000000000001371631510634446000154570ustar00rootroot00000000000000# This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 4 [[package]] name = "addr2line" version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" dependencies = [ "gimli", ] [[package]] name = "adler2" version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" [[package]] name = "aho-corasick" version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" dependencies = [ "memchr", ] [[package]] name = "anstream" version = "0.6.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" dependencies = [ "anstyle", "anstyle-parse", "anstyle-query", "anstyle-wincon", "colorchoice", "is_terminal_polyfill", "utf8parse", ] [[package]] name = "anstyle" version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" [[package]] name = "anstyle-parse" version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" dependencies = [ "windows-sys", ] [[package]] name = "anstyle-wincon" version = "3.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" dependencies = [ "anstyle", "once_cell_polyfill", "windows-sys", ] [[package]] name = "anyhow" version = "1.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" dependencies = [ "backtrace", ] [[package]] name = "async-channel" version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" dependencies = [ "concurrent-queue", "event-listener-strategy", "futures-core", "pin-project-lite", ] [[package]] name = "autocfg" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "backtrace" version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" dependencies = [ "addr2line", "cfg-if", "libc", "miniz_oxide", "object", "rustc-demangle", "windows-link", ] [[package]] name = "bitflags" version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" dependencies = [ "serde_core", ] [[package]] name = "block" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" [[package]] name = "bumpalo" version = "3.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" [[package]] name = "byteorder" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "cairo-rs" version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dfe4354df4da648870e363387679081f8f9fc538ec8b55901e3740c6a0ef81b1" dependencies = [ "bitflags", "cairo-sys-rs", "glib", "libc", ] [[package]] name = "cairo-sys-rs" version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "47d6c3300c7103eb8e4de07591003511aa25664438f8c6fc317a3a9902c103f8" dependencies = [ "glib-sys", "libc", "system-deps", ] [[package]] name = "cc" version = "1.2.46" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b97463e1064cb1b1c1384ad0a0b9c8abd0988e2a91f52606c80ef14aadb63e36" dependencies = [ "find-msvc-tools", "shlex", ] [[package]] name = "cfg-expr" version = "0.20.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9acd0bdbbf4b2612d09f52ba61da432140cb10930354079d0d53fafc12968726" dependencies = [ "smallvec", "target-lexicon", ] [[package]] name = "cfg-if" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "cfg_aliases" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "clap" version = "4.5.51" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c26d721170e0295f191a69bd9a1f93efcdb0aff38684b61ab5750468972e5f5" dependencies = [ "clap_builder", "clap_derive", ] [[package]] name = "clap_builder" version = "4.5.51" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75835f0c7bf681bfd05abe44e965760fea999a5286c6eb2d59883634fd02011a" dependencies = [ "anstream", "anstyle", "clap_lex", "strsim", ] [[package]] name = "clap_derive" version = "4.5.49" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a0b5487afeab2deb2ff4e03a807ad1a03ac532ff5a2cee5d86884440c7f7671" dependencies = [ "heck", "proc-macro2", "quote", "syn 2.0.110", ] [[package]] name = "clap_lex" version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d" [[package]] name = "colorchoice" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" [[package]] name = "concurrent-queue" version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" dependencies = [ "crossbeam-utils", ] [[package]] name = "const-random" version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359" dependencies = [ "const-random-macro", ] [[package]] name = "const-random-macro" version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" dependencies = [ "getrandom", "once_cell", "tiny-keccak", ] [[package]] name = "convert_case" version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" dependencies = [ "unicode-segmentation", ] [[package]] name = "crossbeam-utils" version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crunchy" version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" [[package]] name = "darling" version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" dependencies = [ "darling_core", "darling_macro", ] [[package]] name = "darling_core" version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", "strsim", "syn 2.0.110", ] [[package]] name = "darling_macro" version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ "darling_core", "quote", "syn 2.0.110", ] [[package]] name = "diff" version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" [[package]] name = "dlv-list" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "442039f5147480ba31067cb00ada1adae6892028e40e45fc5de7b7df6dcc1b5f" dependencies = [ "const-random", ] [[package]] name = "either" version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" [[package]] name = "env_logger" version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4cd405aab171cb85d6735e5c8d9db038c17d3ca007a4d2c25f337935c3d90580" dependencies = [ "humantime", "is-terminal", "log", "regex", "termcolor", ] [[package]] name = "equivalent" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "errno" version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1" dependencies = [ "errno-dragonfly", "libc", "winapi 0.3.9", ] [[package]] name = "errno-dragonfly" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" dependencies = [ "cc", "libc", ] [[package]] name = "event-listener" version = "5.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" dependencies = [ "concurrent-queue", "parking", "pin-project-lite", ] [[package]] name = "event-listener-strategy" version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" dependencies = [ "event-listener", "pin-project-lite", ] [[package]] name = "field-offset" version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f" dependencies = [ "memoffset", "rustc_version", ] [[package]] name = "find-msvc-tools" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3a3076410a55c90011c298b04d0cfa770b00fa04e1e3c97d3f6c9de105a03844" [[package]] name = "fnv" version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "futures-channel" version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", ] [[package]] name = "futures-core" version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] name = "futures-executor" version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" dependencies = [ "futures-core", "futures-task", "futures-util", ] [[package]] name = "futures-io" version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-macro" version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", "syn 2.0.110", ] [[package]] name = "futures-task" version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" [[package]] name = "futures-util" version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ "futures-core", "futures-macro", "futures-task", "pin-project-lite", "pin-utils", "slab", ] [[package]] name = "gdk-pixbuf" version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a3c64459f569154f37616fc28923bfac490d4aaa134aaf5eca58a2c0c13050f" dependencies = [ "gdk-pixbuf-sys", "gio", "glib", "libc", ] [[package]] name = "gdk-pixbuf-sys" version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3854ef7a6a8b8f3b4013a01d5f9cb0d1794ec4e810c6cb4e2cc6d980f1baf724" dependencies = [ "gio-sys", "glib-sys", "gobject-sys", "libc", "system-deps", ] [[package]] name = "gdk4" version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c7e292649dc26e3440c508a00f42ab39156008320dd6e962d63eaf626ba4d7f0" dependencies = [ "cairo-rs", "gdk-pixbuf", "gdk4-sys", "gio", "glib", "libc", "pango", ] [[package]] name = "gdk4-sys" version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4f3174fa4f1e0bf2a7e04469b65db8f4d1db89a6f5cdc57727b14e97ce438cf" dependencies = [ "cairo-sys-rs", "gdk-pixbuf-sys", "gio-sys", "glib-sys", "gobject-sys", "libc", "pango-sys", "pkg-config", "system-deps", ] [[package]] name = "getrandom" version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ "cfg-if", "libc", "wasi", ] [[package]] name = "gettext-rs" version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d5857dc1b7f0fee86961de833f434e29494d72af102ce5355738c0664222bdf" dependencies = [ "gettext-sys", "locale_config", ] [[package]] name = "gettext-sys" version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ea859ab0dd7e70ff823032b3e077d03d39c965d68c6c10775add60e999d8ee9" dependencies = [ "cc", "temp-dir", ] [[package]] name = "gimli" version = "0.32.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" [[package]] name = "gio" version = "0.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "daeff3dd716d1ba91850b976b76a1c2d28f99ef6c1602cd8fdaa8fab8017fd9c" dependencies = [ "futures-channel", "futures-core", "futures-io", "futures-util", "gio-sys", "glib", "libc", "pin-project-lite", "smallvec", ] [[package]] name = "gio-sys" version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "171ed2f6dd927abbe108cfd9eebff2052c335013f5879d55bab0dc1dee19b706" dependencies = [ "glib-sys", "gobject-sys", "libc", "system-deps", "windows-sys", ] [[package]] name = "glib" version = "0.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b9dbecb1c33e483a98be4acfea2ab369e1c28f517c6eadb674537409c25c4b2" dependencies = [ "bitflags", "futures-channel", "futures-core", "futures-executor", "futures-task", "futures-util", "gio-sys", "glib-macros", "glib-sys", "gobject-sys", "libc", "memchr", "smallvec", ] [[package]] name = "glib-macros" version = "0.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "880e524e0085f3546cfb38532b2c202c0d64741d9977a6e4aa24704bfc9f19fb" dependencies = [ "heck", "proc-macro-crate", "proc-macro2", "quote", "syn 2.0.110", ] [[package]] name = "glib-sys" version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d09d3d0fddf7239521674e57b0465dfbd844632fec54f059f7f56112e3f927e1" dependencies = [ "libc", "system-deps", ] [[package]] name = "glob" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" [[package]] name = "gobject-sys" version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "538e41d8776173ec107e7b0f2aceced60abc368d7e1d81c1f0e2ecd35f59080d" dependencies = [ "glib-sys", "libc", "system-deps", ] [[package]] name = "graphene-rs" version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e7749aaf5d3b955bf3bfce39e3423705878a666b561384134da0e7786a45ddc3" dependencies = [ "glib", "graphene-sys", "libc", ] [[package]] name = "graphene-sys" version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "250abaee850a90a276509890a78029c356173f9573412bded5f155b0e41fa568" dependencies = [ "glib-sys", "libc", "pkg-config", "system-deps", ] [[package]] name = "gsk4" version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6687e9f92ca89c000c376400cfaf7914d099413d72fdf4f84a25775a0b1fb2d" dependencies = [ "cairo-rs", "gdk4", "glib", "graphene-rs", "gsk4-sys", "libc", "pango", ] [[package]] name = "gsk4-sys" version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e76bcf64d9c4846f19651f45b400cc0c9c4c17b651849da520f3d77c6988c52" dependencies = [ "cairo-sys-rs", "gdk4-sys", "glib-sys", "gobject-sys", "graphene-sys", "libc", "pango-sys", "system-deps", ] [[package]] name = "gtk4" version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "58ea71795b91a0725b0e926e72e3d209d920ce60166e3a8f9f4dd46f287fee87" dependencies = [ "cairo-rs", "field-offset", "futures-channel", "gdk-pixbuf", "gdk4", "gio", "glib", "graphene-rs", "gsk4", "gtk4-macros", "gtk4-sys", "libc", "pango", ] [[package]] name = "gtk4-macros" version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "821160b4f17e7e4ed748818c23682d0a46bed04c287dbaac54dd4869d2c5e06a" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", "syn 2.0.110", ] [[package]] name = "gtk4-sys" version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d274cbaf7d9aa55b7aff78cb21b43299d64e514e1300671469b66f691cc5a011" dependencies = [ "cairo-sys-rs", "gdk-pixbuf-sys", "gdk4-sys", "gio-sys", "glib-sys", "gobject-sys", "graphene-sys", "gsk4-sys", "libc", "pango-sys", "system-deps", ] [[package]] name = "hashbrown" version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" [[package]] name = "hashbrown" version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" [[package]] name = "heck" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hermit-abi" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" [[package]] name = "humantime" version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "135b12329e5e3ce057a9f972339ea52bc954fe1e9358ef27f95e89716fbc5424" [[package]] name = "ident_case" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "indexmap" version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f" dependencies = [ "equivalent", "hashbrown 0.16.0", ] [[package]] name = "is-terminal" version = "0.4.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3640c1c38b8e4e43584d8df18be5fc6b0aa314ce6ebf51b53313d4306cca8e46" dependencies = [ "hermit-abi", "libc", "windows-sys", ] [[package]] name = "is_terminal_polyfill" version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" [[package]] name = "js-sys" version = "0.3.82" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65" dependencies = [ "once_cell", "wasm-bindgen", ] [[package]] name = "kernel32-sys" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" dependencies = [ "winapi 0.2.8", "winapi-build", ] [[package]] name = "kinded" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ce4bdbb2f423660b19f0e9f7115182214732d8dd5f840cd0a3aee3e22562f34c" dependencies = [ "kinded_macros", ] [[package]] name = "kinded_macros" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a13b4ddc5dcb32f45dac3d6f606da2a52fdb9964a18427e63cd5ef6c0d13288d" dependencies = [ "convert_case", "proc-macro2", "quote", "syn 2.0.110", ] [[package]] name = "lazy-regex" version = "3.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "191898e17ddee19e60bccb3945aa02339e81edd4a8c50e21fd4d48cdecda7b29" dependencies = [ "lazy-regex-proc_macros", "once_cell", "regex", ] [[package]] name = "lazy-regex-proc_macros" version = "3.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c35dc8b0da83d1a9507e12122c80dea71a9c7c613014347392483a83ea593e04" dependencies = [ "proc-macro2", "quote", "regex", "syn 2.0.110", ] [[package]] name = "lazy_static" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libadwaita" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4df6715d1257bd8c093295b77a276ed129d73543b10304fec5829ced5d5b7c41" dependencies = [ "gdk4", "gio", "glib", "gtk4", "libadwaita-sys", "libc", "pango", ] [[package]] name = "libadwaita-sys" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdf8950090cc180250cdb1ff859a39748feeda7a53a9f28ead3a17a14cc37ae2" dependencies = [ "gdk4-sys", "gio-sys", "glib-sys", "gobject-sys", "gtk4-sys", "libc", "pango-sys", "system-deps", ] [[package]] name = "libc" version = "0.2.177" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" [[package]] name = "libloading" version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" dependencies = [ "cfg-if", "windows-link", ] [[package]] name = "locale_config" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d2c35b16f4483f6c26f0e4e9550717a2f6575bcd6f12a53ff0c490a94a6934" dependencies = [ "lazy_static", "objc", "objc-foundation", "regex", "winapi 0.3.9", ] [[package]] name = "log" version = "0.4.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" [[package]] name = "malloc_buf" version = "0.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" dependencies = [ "libc", ] [[package]] name = "memchr" version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" [[package]] name = "memoffset" version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" dependencies = [ "autocfg", ] [[package]] name = "miniz_oxide" version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" dependencies = [ "adler2", ] [[package]] name = "neli" version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "93062a0dce6da2517ea35f301dfc88184ce18d3601ec786a727a87bf535deca9" dependencies = [ "byteorder", "libc", "log", "neli-proc-macros", ] [[package]] name = "neli-proc-macros" version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c8034b7fbb6f9455b2a96c19e6edf8dc9fc34c70449938d8ee3b4df363f61fe" dependencies = [ "either", "proc-macro2", "quote", "serde", "syn 1.0.109", ] [[package]] name = "neli-wifi" version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a72cd90a5d1ab54ed62cfe032972cb78303cfffd7d82c87c5da889a353fc451" dependencies = [ "neli", "neli-proc-macros", ] [[package]] name = "nix" version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" dependencies = [ "bitflags", "cfg-if", "cfg_aliases", "libc", ] [[package]] name = "num-traits" version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", ] [[package]] name = "num_cpus" version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" dependencies = [ "hermit-abi", "libc", ] [[package]] name = "nutype" version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "70587a780088c67dad31bf722b875c5616096b4d8c0ded8b7de03294ffb9bbb5" dependencies = [ "nutype_macros", ] [[package]] name = "nutype_macros" version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "148934b975faeddd8f0679d7cf11280b50c4c5495d6fe72bdaf07c932874b404" dependencies = [ "cfg-if", "kinded", "proc-macro2", "quote", "rustc_version", "syn 2.0.110", "urlencoding", ] [[package]] name = "nvml-wrapper" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d5c6c0ef9702176a570f06ad94f3198bc29c524c8b498f1b9346e1b1bdcbb3a" dependencies = [ "bitflags", "libloading", "nvml-wrapper-sys", "static_assertions", "thiserror 1.0.69", "wrapcenum-derive", ] [[package]] name = "nvml-wrapper-sys" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd23dbe2eb8d8335d2bce0299e0a07d6a63c089243d626ca75b770a962ff49e6" dependencies = [ "libloading", ] [[package]] name = "objc" version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" dependencies = [ "malloc_buf", ] [[package]] name = "objc-foundation" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9" dependencies = [ "block", "objc", "objc_id", ] [[package]] name = "objc_id" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b" dependencies = [ "objc", ] [[package]] name = "object" version = "0.37.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" dependencies = [ "memchr", ] [[package]] name = "once_cell" version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "once_cell_polyfill" version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" [[package]] name = "ordered-multimap" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49203cdcae0030493bad186b28da2fa25645fa276a51b6fec8010d281e02ef79" dependencies = [ "dlv-list", "hashbrown 0.14.5", ] [[package]] name = "pango" version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e37b7a678e18c2e9f2485f7e39b7b2dac99590d5ddef08a7f56eae38a145402e" dependencies = [ "gio", "glib", "libc", "pango-sys", ] [[package]] name = "pango-sys" version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4f5daf21da43fba9f2a0092da0eebeb77637c23552bccaf58f791c518009c94" dependencies = [ "glib-sys", "gobject-sys", "libc", "system-deps", ] [[package]] name = "parking" version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" [[package]] name = "paste" version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "path-dedot" version = "3.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07ba0ad7e047712414213ff67533e6dd477af0a4e1d14fb52343e53d30ea9397" dependencies = [ "once_cell", ] [[package]] name = "pin-project-lite" version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" [[package]] name = "pin-utils" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" [[package]] name = "plotters" version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5aeb6f403d7a4911efb1e33402027fc44f29b5bf6def3effcc22d7bb75f2b747" dependencies = [ "num-traits", "plotters-backend", "wasm-bindgen", "web-sys", ] [[package]] name = "plotters-backend" version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df42e13c12958a16b3f7f4386b9ab1f3e7933914ecea48da7139435263a4172a" [[package]] name = "plotters-cairo" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "413f5b51670e5e60d1f981e142bc7156bf73f5b015313fedc2c8e94f09be2aa3" dependencies = [ "cairo-rs", "plotters-backend", ] [[package]] name = "pretty_assertions" version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3ae130e2f271fbc2ac3a40fb1d07180839cdbbe443c7a27e1e3c13c5cac0116d" dependencies = [ "diff", "yansi", ] [[package]] name = "pretty_env_logger" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "865724d4dbe39d9f3dd3b52b88d859d66bcb2d6a0acfd5ea68a65fb66d4bdc1c" dependencies = [ "env_logger", "log", ] [[package]] name = "proc-macro-crate" version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" dependencies = [ "toml_edit", ] [[package]] name = "proc-macro2" version = "1.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" dependencies = [ "unicode-ident", ] [[package]] name = "process-data" version = "1.9.1" dependencies = [ "anyhow", "glob", "lazy-regex", "libc", "num_cpus", "nutype", "nvml-wrapper", "serde", "syscalls", "sysconf", "thiserror 2.0.17", "unescape", "uzers", ] [[package]] name = "quote" version = "1.0.42" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" dependencies = [ "proc-macro2", ] [[package]] name = "regex" version = "1.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" dependencies = [ "aho-corasick", "memchr", "regex-automata", "regex-syntax", ] [[package]] name = "regex-automata" version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" dependencies = [ "aho-corasick", "memchr", "regex-syntax", ] [[package]] name = "regex-syntax" version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" [[package]] name = "resources" version = "1.9.1" dependencies = [ "anyhow", "async-channel", "clap", "gettext-rs", "glob", "gtk4", "lazy-regex", "libadwaita", "libc", "log", "neli-wifi", "nix", "num_cpus", "nvml-wrapper", "paste", "path-dedot", "plotters", "plotters-cairo", "pretty_assertions", "pretty_env_logger", "process-data", "rmp-serde", "ron", "rust-ini", "strum", "strum_macros", "sysconf", ] [[package]] name = "rmp" version = "0.8.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "228ed7c16fa39782c3b3468e974aec2795e9089153cd08ee2e9aefb3613334c4" dependencies = [ "byteorder", "num-traits", "paste", ] [[package]] name = "rmp-serde" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "52e599a477cf9840e92f2cde9a7189e67b42c57532749bf90aea6ec10facd4db" dependencies = [ "byteorder", "rmp", "serde", ] [[package]] name = "ron" version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fd490c5b18261893f14449cbd28cb9c0b637aebf161cd77900bfdedaff21ec32" dependencies = [ "bitflags", "once_cell", "serde", "serde_derive", "typeid", "unicode-ident", ] [[package]] name = "rust-ini" version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "796e8d2b6696392a43bea58116b667fb4c29727dc5abd27d6acf338bb4f688c7" dependencies = [ "cfg-if", "ordered-multimap", ] [[package]] name = "rustc-demangle" version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" [[package]] name = "rustc_version" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" dependencies = [ "semver", ] [[package]] name = "rustversion" version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] name = "semver" version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" [[package]] name = "serde" version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" dependencies = [ "serde_core", "serde_derive", ] [[package]] name = "serde_core" version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", "syn 2.0.110", ] [[package]] name = "serde_repr" version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" dependencies = [ "proc-macro2", "quote", "syn 2.0.110", ] [[package]] name = "serde_spanned" version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e24345aa0fe688594e73770a5f6d1b216508b4f93484c0026d521acd30134392" dependencies = [ "serde_core", ] [[package]] name = "shlex" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "slab" version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" [[package]] name = "smallvec" version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" [[package]] name = "static_assertions" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "strsim" version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "strum" version = "0.27.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf" [[package]] name = "strum_macros" version = "0.27.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7" dependencies = [ "heck", "proc-macro2", "quote", "syn 2.0.110", ] [[package]] name = "syn" version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] [[package]] name = "syn" version = "2.0.110" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a99801b5bd34ede4cf3fc688c5919368fea4e4814a4664359503e6015b280aea" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] [[package]] name = "syscalls" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90db46b5b4962319605d435986c775ea45a0ad2561c09e1d5372b89afeb49cf4" dependencies = [ "serde", "serde_repr", ] [[package]] name = "sysconf" version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "59e93f5d45535f49b6a05ef7ac2f0f795d28de494cf53a512751602c9849bea3" dependencies = [ "errno", "kernel32-sys", "libc", "winapi 0.2.8", ] [[package]] name = "system-deps" version = "7.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48c8f33736f986f16d69b6cb8b03f55ddcad5c41acc4ccc39dd88e84aa805e7f" dependencies = [ "cfg-expr", "heck", "pkg-config", "toml", "version-compare", ] [[package]] name = "target-lexicon" version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df7f62577c25e07834649fc3b39fafdc597c0a3527dc1c60129201ccfcbaa50c" [[package]] name = "temp-dir" version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "83176759e9416cf81ee66cb6508dbfe9c96f20b8b56265a39917551c23c70964" [[package]] name = "termcolor" version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" dependencies = [ "winapi-util", ] [[package]] name = "thiserror" version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ "thiserror-impl 1.0.69", ] [[package]] name = "thiserror" version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" dependencies = [ "thiserror-impl 2.0.17", ] [[package]] name = "thiserror-impl" version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", "syn 2.0.110", ] [[package]] name = "thiserror-impl" version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" dependencies = [ "proc-macro2", "quote", "syn 2.0.110", ] [[package]] name = "tiny-keccak" version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" dependencies = [ "crunchy", ] [[package]] name = "toml" version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0dc8b1fb61449e27716ec0e1bdf0f6b8f3e8f6b05391e8497b8b6d7804ea6d8" dependencies = [ "indexmap", "serde_core", "serde_spanned", "toml_datetime", "toml_parser", "toml_writer", "winnow", ] [[package]] name = "toml_datetime" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533" dependencies = [ "serde_core", ] [[package]] name = "toml_edit" version = "0.23.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6485ef6d0d9b5d0ec17244ff7eb05310113c3f316f2d14200d4de56b3cb98f8d" dependencies = [ "indexmap", "toml_datetime", "toml_parser", "winnow", ] [[package]] name = "toml_parser" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0cbe268d35bdb4bb5a56a2de88d0ad0eb70af5384a99d648cd4b3d04039800e" dependencies = [ "winnow", ] [[package]] name = "toml_writer" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df8b2b54733674ad286d16267dcfc7a71ed5c776e4ac7aa3c3e2561f7c637bf2" [[package]] name = "typeid" version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" [[package]] name = "unescape" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ccb97dac3243214f8d8507998906ca3e2e0b900bf9bf4870477f125b82e68f6e" [[package]] name = "unicode-ident" version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" [[package]] name = "unicode-segmentation" version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" [[package]] name = "urlencoding" version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" [[package]] name = "utf8parse" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uzers" version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4df81ff504e7d82ad53e95ed1ad5b72103c11253f39238bcc0235b90768a97dd" dependencies = [ "libc", "log", ] [[package]] name = "version-compare" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "03c2856837ef78f57382f06b2b8563a2f512f7185d732608fd9176cb3b8edf0e" [[package]] name = "wasi" version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasm-bindgen" version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60" dependencies = [ "cfg-if", "once_cell", "rustversion", "wasm-bindgen-macro", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2" dependencies = [ "quote", "wasm-bindgen-macro-support", ] [[package]] name = "wasm-bindgen-macro-support" version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc" dependencies = [ "bumpalo", "proc-macro2", "quote", "syn 2.0.110", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76" dependencies = [ "unicode-ident", ] [[package]] name = "web-sys" version = "0.3.82" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3a1f95c0d03a47f4ae1f7a64643a6bb97465d9b740f0fa8f90ea33915c99a9a1" dependencies = [ "js-sys", "wasm-bindgen", ] [[package]] name = "winapi" version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" [[package]] name = "winapi" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" dependencies = [ "winapi-i686-pc-windows-gnu", "winapi-x86_64-pc-windows-gnu", ] [[package]] name = "winapi-build" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" [[package]] name = "winapi-i686-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ "windows-sys", ] [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows-link" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" [[package]] name = "windows-sys" version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" dependencies = [ "windows-link", ] [[package]] name = "winnow" version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" dependencies = [ "memchr", ] [[package]] name = "wrapcenum-derive" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a76ff259533532054cfbaefb115c613203c73707017459206380f03b3b3f266e" dependencies = [ "darling", "proc-macro2", "quote", "syn 2.0.110", ] [[package]] name = "yansi" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" resources-1.9.1/Cargo.toml000066400000000000000000000025501510634446000154710ustar00rootroot00000000000000[package] name = "resources" version = "1.9.1" authors = ["nokyan "] edition = "2024" rust-version = "1.85.0" homepage = "https://apps.gnome.org/app/net.nokyan.Resources/" license = "GPL-3.0-or-later" [profile.dev] opt-level = 1 [profile.release] codegen-units = 1 lto = true strip = true opt-level = 3 [dependencies] adw = { version = "0.8.0", features = ["v1_8"], package = "libadwaita" } anyhow = { version = "1.0.100", features = ["backtrace"] } async-channel = "2.5.0" clap = { version = "4.5.51", features = ["derive"] } gettext-rs = { version = "0.7.7", features = ["gettext-system"] } glob = "0.3.3" gtk = { version = "0.10.2", features = ["v4_12"], package = "gtk4" } lazy-regex = "3.4.1" libc = { version = "0.2.177", features = ["extra_traits"] } log = "0.4.28" neli-wifi = { version = "0.6.1", features = ["default"] } nix = { version = "0.30.0", default-features = false, features = [ "signal", "sched", ] } num_cpus = "1.17.0" nvml-wrapper = "0.11.0" paste = "1.0.15" path-dedot = "3.1.1" plotters = { version = "0.3.7", default-features = false, features = [ "area_series", ] } plotters-cairo = "0.8.0" pretty_env_logger = "0.5" process-data = { path = "lib/process_data" } rmp-serde = "1.3.0" ron = "0.12.0" rust-ini = "0.21.3" strum = "0.27.2" strum_macros = "0.27.2" sysconf = "0.3.4" [dev-dependencies] pretty_assertions = "1.4.1" resources-1.9.1/LICENSE000066400000000000000000001044341510634446000145520ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Resources — Keep an eye on system resources Copyright (C) 2023 nokyan This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Resources Copyright (C) 2023 nokyan This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . resources-1.9.1/README.md000066400000000000000000000123571510634446000150260ustar00rootroot00000000000000# Resources Download on Flathub [![GNOME Circle](https://circle.gnome.org/assets/button/badge.svg )](https://apps.gnome.org/app/net.nokyan.Resources/) [![Please do not theme this app](https://stopthemingmy.app/badge.svg)](https://stopthemingmy.app) Resources is a simple yet powerful monitor for your system resources and processes, written in Rust and using GTK 4 and libadwaita for its GUI. It’s capable of displaying usage and details of your CPU, memory, GPUs, NPUs, network interfaces and block devices. It’s also capable of listing and terminating running graphical applications as well as processes. Resources is *not* a program that will try to display every single possible piece of information about each tiny part of your device. Instead, it aims to strike a balance between information richness, user-friendliness and a balanced user interface — showing you most of the information most of you need most of the time.
Click me for screenshots! ![Apps View](data/resources/screenshots/1.png?raw=true "Apps View") ![Processes View](data/resources/screenshots/2.png?raw=true "Processes View") ![Processor View](data/resources/screenshots/3.png?raw=true "Processor View") ![Memory View](data/resources/screenshots/4.png?raw=true "Memory View") ![GPU View](data/resources/screenshots/5.png?raw=true "GPU View") ![Drive View](data/resources/screenshots/6.png?raw=true "Drive View") ![Network Interface View](data/resources/screenshots/7.png?raw=true "Network Interface View") ![Battery View](data/resources/screenshots/8.png?raw=true "Battery View")
## Installing The **official** and **only supported** way of installing Resources is using Flatpak. Simply use your graphical software manager like GNOME Software or Discover to install Resources from Flathub or type ``flatpak install flathub net.nokyan.Resources`` in your terminal. Please keep in mind that you need to have Flathub set up on your device. You can find out how to set up Flathub [here](https://flathub.org/setup). ### Unofficial Packages Resources has been packaged for some Linux distributions by volunteers. Keep in mind that these are not supported. If you’re packaging Resources for another distribution, feel free to send a pull request to add your package to this list! #### Arch Linux Unofficially packaged in the [extra](https://archlinux.org/packages/extra/x86_64/resources/) repository. You can install Resources using `pacman` with no further configuration required. ```sh pacman -S resources ``` #### Fedora Unofficially packaged in [Copr](https://copr.fedorainfracloud.org/coprs/atim/resources/) for Fedora 39 and newer. You first need to enable the `atim/resources` Copr repository and then use `dnf` to install Resources. ```sh dnf copr enable atim/resources dnf install resources ``` ## Building You can also build Resources yourself using either Meson directly or preferably using Flatpak Builder. ### Build Dependencies - `glib-2.0` ≥ 2.66 - `gio-2.0` ≥ 2.66 - `gtk-4` ≥ 4.12 - `libadwaita-1` ≥ 1.8 - `cargo` Other dependencies are handled by `cargo`. Resources’ minimum supported Rust version (MSRV) is **1.85.0**. ### Runtime Dependencies These dependencies are not needed to build Resources but Resources may lack certain functionalities when they are not present. - `systemd` (needed for app detection using cgroups) - `polkit` (needed for executing privileged actions like killing certain processes) ### Building Using Flatpak Builder ```sh flatpak install org.gnome.Sdk//49 org.freedesktop.Sdk.Extension.rust-stable//25.08 org.gnome.Platform//49 org.freedesktop.Sdk.Extension.llvm21//25.08 flatpak-builder --user flatpak_app build-aux/net.nokyan.Resources.Devel.json ``` If you use [GNOME Builder](https://apps.gnome.org/app/org.gnome.Builder/) or Visual Studio Code with the [Flatpak extension](https://marketplace.visualstudio.com/items?itemName=bilelmoussaoui.flatpak-vscode), Resources can be built and run automatically. ### Building Natively Using Meson ```sh meson . build --prefix=/usr/local ninja -C build install ``` ## Running Running Resources is as simple as typing `flatpak run net.nokyan.Resources` into a terminal or running it from your app launcher. If you’ve built Resources natively or installed it from a traditional package manager such as `apt` or `dnf`, or if you’ve built Resources yourself, typing `resources` in a terminal will start Resources. If you’ve built Resources as a Flatpak, type `flatpak-builder --run flatpak_app build-aux/net.nokyan.Resources.Devel.json resources` into your terminal or use one of the aforementioned IDEs to do that automatically. ## Contributing If you have an idea, bug report, question or something else, don’t hesitate to [open an issue](https://github.com/nokyan/resources/issues)! Translations are always welcome but need to go through [GNOME Damned Lies](https://l10n.gnome.org/module/resources/), ordinary pull requests for translation changes cannot be accepted anymore. ## Code of Conduct Resources follows the [GNOME Code of Conduct](/CODE_OF_CONDUCT.md). All communications in project spaces are expected to follow it. resources-1.9.1/build-aux/000077500000000000000000000000001510634446000154315ustar00rootroot00000000000000resources-1.9.1/build-aux/checks.sh000066400000000000000000000276451510634446000172430ustar00rootroot00000000000000#!/bin/bash # # SPDX-FileCopyrightText: 2021 Alejandro Domínguez # SPDX-FileCopyrightText: 2022 Kévin Commaile # SPDX-License-Identifier: GPL-3.0-or-later export LC_ALL=C # Usage info show_help() { cat << EOF Run conformity checks on the current Rust project. If a dependency is not found, helps the user to install it. USAGE: ${0##*/} [OPTIONS] OPTIONS: -f, --force-install Install missing dependencies without asking -v, --verbose Use verbose output -h, --help Display this help and exit ERROR CODES: 1 Check failed 2 Missing dependency EOF } # Style helpers act="\e[1;32m" err="\e[1;31m" pos="\e[32m" neg="\e[31m" res="\e[0m" # Common styled strings Installing="${act}Installing${res}" Checking=" ${act}Checking${res}" Failed=" ${err}Failed${res}" error="${err}error:${res}" invalid="${neg}Invalid input${res}" ok="${pos}ok${res}" fail="${neg}fail${res}" # Initialize variables force_install=0 verbose=0 # Helper functions # Sort to_sort in natural order. sort() { local size=${#to_sort[@]} local swapped=0; for (( i = 0; i < $size-1; i++ )) do swapped=0 for ((j = 0; j < $size-1-$i; j++ )) do if [[ "${to_sort[$j]}" > "${to_sort[$j+1]}" ]] then temp="${to_sort[$j]}"; to_sort[$j]="${to_sort[$j+1]}"; to_sort[$j+1]="$temp"; swapped=1; fi done if [[ $swapped -eq 0 ]]; then break; fi done } # Remove common entries in to_diff1 and to_diff2. diff() { for i in ${!to_diff1[@]}; do for j in ${!to_diff2[@]}; do if [[ "${to_diff1[$i]}" == "${to_diff2[$j]}" ]]; then unset to_diff1[$i] unset to_diff2[$j] break fi done done } # Check if rustup is available. # Argument: # '-i' to install if missing. check_rustup() { if ! which rustup &> /dev/null; then if [[ "$1" == '-i' ]]; then echo -e "$Installing rustup…" curl https://sh.rustup.rs -sSf | sh -s -- -y --default-toolchain nightly export PATH=$PATH:$HOME/.cargo/bin if ! which rustup &> /dev/null; then echo -e "$Failed to install rustup" exit 2 fi else exit 2 fi fi } # Install cargo via rustup. install_cargo() { check_rustup -i if ! which cargo >/dev/null 2>&1; then echo -e "$Failed to install cargo" exit 2 fi } # Check if cargo is available. If not, ask to install it. check_cargo() { if ! which cargo >/dev/null 2>&1; then echo "Unable to find cargo" if [[ $force_install -eq 1 ]]; then install_cargo elif [ ! -t 1 ]; then exit 2 elif check_rustup; then echo -e "$error rustup is installed but the cargo command isn't available" exit 2 else echo "" echo "y: Install cargo via rustup" echo "N: Don't install cargo and abort checks" echo "" while true; do echo -n "Install cargo? [y/N]: "; read yn < /dev/tty case $yn in [Yy]* ) install_cargo break ;; [Nn]* | "" ) exit 2 ;; * ) echo $invalid ;; esac done fi fi if [[ $verbose -eq 1 ]]; then echo "" rustc -Vv && cargo +nightly -Vv fi } # Install rustfmt with rustup. install_rustfmt() { check_rustup -i echo -e "$Installing rustfmt…" rustup component add --toolchain nightly rustfmt if ! cargo +nightly fmt --version >/dev/null 2>&1; then echo -e "$Failed to install rustfmt" exit 2 fi } # Run rustfmt to enforce code style. run_rustfmt() { if ! cargo +nightly fmt --version >/dev/null 2>&1; then if [[ $force_install -eq 1 ]]; then install_rustfmt elif [ ! -t 1 ]; then echo "Unable to check the project's code style, because rustfmt could not be run" exit 2 else echo "Rustfmt is needed to check the project's code style, but it isn’t available" echo "" echo "y: Install rustfmt via rustup" echo "N: Don't install rustfmt and abort checks" echo "" while true; do echo -n "Install rustfmt? [y/N]: "; read yn < /dev/tty case $yn in [Yy]* ) install_rustfmt break ;; [Nn]* | "" ) exit 2 ;; * ) echo $invalid ;; esac done fi fi echo -e "$Checking code style…" if [[ $verbose -eq 1 ]]; then echo "" cargo +nightly fmt --version echo "" fi if ! cargo +nightly fmt --all -- --check; then echo -e " Checking code style result: $fail" echo "Please fix the above issues, either manually or by running: cargo fmt --all" exit 1 else echo -e " Checking code style result: $ok" fi } # Install typos with cargo. install_typos() { echo -e "$Installing typos…" cargo install typos-cli if ! typos --version >/dev/null 2>&1; then echo -e "$Failed to install typos" exit 2 fi } # Run typos to check for spelling mistakes. run_typos() { if ! typos --version >/dev/null 2>&1; then if [[ $force_install -eq 1 ]]; then install_typos elif [ ! -t 1 ]; then echo "Unable to check spelling mistakes, because typos could not be run" exit 2 else echo "Typos is needed to check spelling mistakes, but it isn’t available" echo "" echo "y: Install typos via cargo" echo "N: Don't install typos and abort checks" echo "" while true; do echo -n "Install typos? [y/N]: "; read yn < /dev/tty case $yn in [Yy]* ) install_typos break ;; [Nn]* | "" ) exit 2 ;; * ) echo $invalid ;; esac done fi fi echo -e "$Checking spelling mistakes…" if [[ $verbose -eq 1 ]]; then echo "" typos --version echo "" fi if ! typos --color always; then echo -e " Checking spelling mistakes result: $fail" echo "Please fix the above issues, either manually or by running: typos -w" exit 1 else echo -e " Checking spelling mistakes result: $ok" fi } # Check if files in POTFILES are correct. # # This checks, in that order: # - All files exist # - All files with translatable strings are present and only those # - Files are sorted alphabetically # # This assumes the following: # - POTFILES.in is located at 'po/POTFILES.in' # - UI (Glade) files are located in 'data/resources/ui' and use 'translatable="yes"' # - Rust files are located in 'src' and use 'i18n' methods or macros check_potfiles() { echo -e "$Checking po/POTFILES.in…" local ret=0 # Check that files in POTFILES exist. while read -r line; do if [[ -n $line && ${line::1} != '#' ]]; then if [[ ! -f $line ]]; then echo -e "$error File '$line' in POTFILES does not exist" ret=1 fi if [[ ${line:(-3):3} == '.ui' ]]; then ui_potfiles+=($line) elif [[ ${line:(-3):3} == '.rs' ]]; then rs_potfiles+=($line) fi fi done < po/POTFILES.in if [[ ret -eq 1 ]]; then echo -e " Checking po/POTFILES.in result: $fail" echo "Please fix the above issues" exit 1 fi # Get UI files with 'translatable="yes"'. ui_files=(`grep -lIr 'translatable="yes"' data/resources/ui/*.ui data/resources/ui/*/*.ui`) # Get Rust files with regex 'i18n[!]?\('. rs_files=(`grep -lIrE 'i18n[!]?\(' --exclude=src/i18n.rs src/*`) # Remove common files to_diff1=("${ui_potfiles[@]}") to_diff2=("${ui_files[@]}") diff ui_potfiles=("${to_diff1[@]}") ui_files=("${to_diff2[@]}") to_diff1=("${rs_potfiles[@]}") to_diff2=("${rs_files[@]}") diff rs_potfiles=("${to_diff1[@]}") rs_files=("${to_diff2[@]}") potfiles_count=$((${#ui_potfiles[@]} + ${#rs_potfiles[@]})) if [[ $potfiles_count -eq 1 ]]; then echo "" echo -e "$error Found 1 file in POTFILES without translatable strings:" ret=1 elif [[ $potfiles_count -ne 0 ]]; then echo "" echo -e "$error Found $potfiles_count files in POTFILES without translatable strings:" ret=1 fi for file in ${ui_potfiles[@]}; do echo $file done for file in ${rs_potfiles[@]}; do echo $file done let files_count=$((${#ui_files[@]} + ${#rs_files[@]})) if [[ $files_count -eq 1 ]]; then echo "" echo -e "$error Found 1 file with translatable strings not present in POTFILES:" ret=1 elif [[ $files_count -ne 0 ]]; then echo "" echo -e "$error Found $files_count with translatable strings not present in POTFILES:" ret=1 fi for file in ${ui_files[@]}; do echo $file done for file in ${rs_files[@]}; do echo $file done if [[ ret -eq 1 ]]; then echo "" echo -e " Checking po/POTFILES.in result: $fail" echo "Please fix the above issues" exit 1 fi # Check sorted alphabetically to_sort=("${potfiles[@]}") sort for i in ${!potfiles[@]}; do if [[ "${potfiles[$i]}" != "${to_sort[$i]}" ]]; then echo -e "$error Found file '${potfiles[$i]}' before '${to_sort[$i]}' in POTFILES" ret=1 break fi done if [[ ret -eq 1 ]]; then echo "" echo -e " Checking po/POTFILES.in result: $fail" echo "Please fix the above issues" exit 1 else echo -e " Checking po/POTFILES.in result: $ok" fi } # Check if files in data/resources/resources.gresource.xml are sorted alphabetically. check_resources() { echo -e "$Checking data/resources/resources.gresource.xml…" local ret=0 # Get files. regex="(.*)" while read -r line; do if [[ $line =~ $regex ]]; then files+=("${BASH_REMATCH[1]}") fi done < data/resources/resources.gresource.xml # Check sorted alphabetically to_sort=("${files[@]}") sort for i in ${!files[@]}; do if [[ "${files[$i]}" != "${to_sort[$i]}" ]]; then echo -e "$error Found file '${files[$i]#src/}' before '${to_sort[$i]#src/}' in amberol.gresource.xml" ret=1 break fi done if [[ ret -eq 1 ]]; then echo "" echo -e " Checking data/resources/resources.gresource.xml result: $fail" echo "Please fix the above issues" exit 1 else echo -e " Checking data/resources/resources.gresource.xml result: $ok" fi } # Check arguments while [[ "$1" ]]; do case $1 in -f | --force-install ) force_install=1 ;; -v | --verbose ) verbose=1 ;; -h | --help ) show_help exit 0 ;; *) show_help >&2 exit 1 esac; shift; done # Run check_cargo echo "" run_rustfmt echo "" run_typos echo "" check_potfiles echo "" check_resources echo "" resources-1.9.1/build-aux/dist-vendor.sh000066400000000000000000000003601510634446000202220ustar00rootroot00000000000000#!/bin/bash export DIST="$1" export SOURCE_ROOT="$2" cd "$SOURCE_ROOT" mkdir "$DIST"/.cargo cargo vendor | sed 's/^directory = ".*"/directory = "vendor"/g' > $DIST/.cargo/config # Move vendor into dist tarball directory mv vendor "$DIST" resources-1.9.1/build-aux/gen-pot.sh000077500000000000000000000012041510634446000173360ustar00rootroot00000000000000#!/bin/sh shopt -s nullglob rm po/resources.pot 2> /dev/null xtr src/lib.rs -k i18n -k i18n_f -k i18n_k -k ni18n_f:1,2 -k ni18n:1,2 -k ni18n_k:1,2 -o po/rust.tmp.pot xgettext data/resources/ui/**/*.ui -o po/ui.tmp.pot xgettext data/resources/ui/*.ui -o po/ui_root.tmp.pot mv data/net.nokyan.Resources.gschema.xml.in data/net.nokyan.Resources.gschema.xml.in.bak xgettext data/*.in -o po/in.tmp.pot mv data/net.nokyan.Resources.gschema.xml.in.bak data/net.nokyan.Resources.gschema.xml.in sed -i 's/charset=CHARSET/charset=UTF-8/g' po/*.tmp.pot xgettext po/*.tmp.pot -o po/resources.pot msgmerge -N -U po/$1 po/resources.pot rm po/*.tmp.potresources-1.9.1/build-aux/net.nokyan.Resources.Devel.json000066400000000000000000000062531510634446000234250ustar00rootroot00000000000000{ "id": "net.nokyan.Resources.Devel", "runtime": "org.gnome.Platform", "runtime-version": "49", "sdk": "org.gnome.Sdk", "sdk-extensions": [ "org.freedesktop.Sdk.Extension.rust-stable", "org.freedesktop.Sdk.Extension.llvm21" ], "command": "resources", "finish-args": [ "--device=dri", "--env=G_MESSAGES_DEBUG=none", "--env=RUST_BACKTRACE=full", "--env=RUST_LOG=resources=debug", "--env=XDG_DATA_DIRS=/app/share:/usr/share:/usr/share/runtime/share:/run/host/user-share:/run/host/usr/share:/run/host/share:/app/local/share:/usr/local/share:/usr/local/share/runtime/share:/run/host/usr/local/share:/run/host/local/share:/var/lib/flatpak/exports/share:~/.local/share/flatpak/exports/share:/var/lib/snapd/desktop", "--filesystem=/var/lib/snapd:ro", "--filesystem=/var/lib/flatpak/app:ro", "--filesystem=/var/lib/flatpak/exports/share:ro", "--filesystem=xdg-data/flatpak/app:ro", "--filesystem=xdg-data/flatpak/exports/share:ro", "--filesystem=host:ro", "--share=ipc", "--share=network", "--socket=fallback-x11", "--socket=wayland", "--talk-name=org.freedesktop.Flatpak" ], "cleanup": [ "/include", "/lib/pkconfig", "/man", "/share/gtk-doc", "/share/man", "/share/pkgconfig", "*.la", "*.a", "/share/doc" ], "build-options": { "append-path": "/usr/lib/sdk/rust-stable/bin:/usr/lib/sdk/llvm21/bin", "env": { "CARGO_HOME": "/run/build/resources/cargo", "CARGO_REGISTRIES_CRATES_IO_PROTOCOL": "sparse", "CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_LINKER": "clang", "CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_RUSTFLAGS": "-C link-arg=-fuse-ld=/usr/lib/sdk/rust-stable/bin/mold", "CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER": "clang", "CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_RUSTFLAGS": "-C link-arg=-fuse-ld=/usr/lib/sdk/rust-stable/bin/mold" }, "build-args": [ "--share=network" ], "test-args": [ "--socket=x11", "--share=network" ] }, "modules": [ { "name": "dmidecode", "buildsystem": "simple", "build-commands": [ "mkdir /app/bin", "make install-bin prefix=/app", "install -v -p -m 755 /app/sbin/dmidecode /app/bin/dmidecode" ], "sources": [ { "type": "archive", "url": "https://download-mirror.savannah.gnu.org/releases/dmidecode/dmidecode-3.6.tar.xz", "sha256": "e40c65f3ec3dafe31ad8349a4ef1a97122d38f65004ed66575e1a8d575dd8bae" } ] }, { "name": "resources", "buildsystem": "meson", "run-tests": true, "config-opts": [ "-Dprofile=development" ], "sources": [ { "type": "dir", "path": "../" } ] } ] }resources-1.9.1/data/000077500000000000000000000000001510634446000144505ustar00rootroot00000000000000resources-1.9.1/data/icons/000077500000000000000000000000001510634446000155635ustar00rootroot00000000000000resources-1.9.1/data/icons/meson.build000066400000000000000000000004241510634446000177250ustar00rootroot00000000000000install_data( '@0@.svg'.format(application_id), install_dir: iconsdir / 'hicolor' / 'scalable' / 'apps' ) install_data( '@0@-symbolic.svg'.format(base_id), install_dir: iconsdir / 'hicolor' / 'symbolic' / 'apps', rename: '@0@-symbolic.svg'.format(application_id) ) resources-1.9.1/data/icons/net.nokyan.Resources-symbolic.svg000066400000000000000000000065251510634446000241700ustar00rootroot00000000000000 resources-1.9.1/data/icons/net.nokyan.Resources.Devel.svg000066400000000000000000000453611510634446000234100ustar00rootroot00000000000000 resources-1.9.1/data/icons/net.nokyan.Resources.svg000066400000000000000000000220271510634446000223440ustar00rootroot00000000000000 resources-1.9.1/data/meson.build000066400000000000000000000052371510634446000166210ustar00rootroot00000000000000subdir('icons') subdir('resources') # Desktop file desktop_conf = configuration_data() desktop_conf.set('icon', application_id) desktop_file = i18n.merge_file( type: 'desktop', input: configure_file( input: '@0@.desktop.in.in'.format(base_id), output: '@BASENAME@', configuration: desktop_conf ), output: '@0@.desktop'.format(application_id), po_dir: podir, install: true, install_dir: datadir / 'applications' ) # Validate Desktop file if desktop_file_validate.found() test( 'validate-desktop', desktop_file_validate, args: [ desktop_file.full_path() ], depends: desktop_file, ) endif # Appdata appdata_conf = configuration_data() appdata_conf.set('app-id', application_id) appdata_conf.set('gettext-package', gettext_package) appdata_file = i18n.merge_file( input: configure_file( input: '@0@.metainfo.xml.in.in'.format(base_id), output: '@BASENAME@', configuration: appdata_conf ), output: '@0@.metainfo.xml'.format(application_id), po_dir: podir, install: true, install_dir: datadir / 'metainfo' ) # Validate Appdata if appstreamcli.found() test( 'validate-appdata', appstreamcli, args: [ 'validate', '--no-net', '--explain', appdata_file.full_path() ], depends: appdata_file, ) endif # GSchema gschema_conf = configuration_data() gschema_conf.set('app-id', application_id) gschema_conf.set('gettext-package', gettext_package) configure_file( input: '@0@.gschema.xml.in'.format(base_id), output: '@0@.gschema.xml'.format(application_id), configuration: gschema_conf, install: true, install_dir: datadir / 'glib-2.0' / 'schemas' ) # Validate GSchema if glib_compile_schemas.found() test( 'validate-gschema', glib_compile_schemas, args: [ '--strict', '--dry-run', meson.current_build_dir() ], ) endif # DBus service # install_data('net.nokyan.Resources.conf', install_dir : datadir / 'dbus-1' / 'system.d') # systemd Service file #service_conf = configuration_data() #service_conf.set('bindir', bindir) #configure_file( # input: '@0@.service.in'.format(base_id), # output: '@0@.service'.format(application_id), # configuration: service_conf, # install: true, # install_dir: prefix / 'lib' / 'systemd' / 'system' #) # polkit Policy file policy_conf = configuration_data() policy_conf.set('libexecdir', libexecdir) policy_conf.set('gettext-package', gettext_package) i18n.merge_file( input: configure_file( input: '@0@.policy.in.in'.format(base_id), output: '@BASENAME@', configuration: policy_conf, ), output: '@0@.policy'.format(application_id), po_dir: podir, data_dirs: podir, install: true, install_dir: datadir / 'polkit-1' / 'actions' ) resources-1.9.1/data/net.nokyan.Resources.desktop.in.in000066400000000000000000000010071510634446000231100ustar00rootroot00000000000000[Desktop Entry] Name=Resources Comment=Keep an eye on system resources Type=Application Exec=resources Terminal=false Categories=System; # Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! Keywords=System;Resources;Monitor;Processes;Usage;Task;Manager;CPU;RAM;Memory;GPU; # Translators: Do NOT translate or transliterate this text (this is an icon file name)! Icon=@icon@ StartupNotify=true X-Purism-FormFactor=Workstation;Mobile; resources-1.9.1/data/net.nokyan.Resources.gschema.xml.in000066400000000000000000000204051510634446000232430ustar00rootroot00000000000000 1024 Window width 900 Window height false Window maximized state "Celsius" Temperature unit "Decimal" Unit Prefix Base "Normal" Refresh Speed false Show virtual block devices such as LVM containers false Show virtual network interfaces such as Docker interfaces false Show usage details in the sidebar false Show device description in the sidebar "Graph" Sidebar Meter Type false Display network speeds in bits per second true Display memory usage in Applications view true Display CPU usage in Applications view false Display drive read speed in Applications view false Display drive read total in Applications view false Display drive write speed in Applications view false Display drive write total in Applications view true Display GPU usage in Applications view false Display video encoder usage in Applications view false Display video decoder usage in Applications view false Display GPU memory usage in Applications view false Display swap usage in Applications view false Display combined memory usage in Applications view true Display process ID in Processes view true Display user name in Processes view true Display memory usage in Processes view true Display CPU usage in Processes view false Display drive read speed in Processes view false Display drive read total in Processes view false Display drive write speed in Processes view false Display drive write total in Processes view true Display GPU usage in Processes view false Display video encoder usage in Processes view false Display video decoder usage in Processes view false Display GPU memory usage in Processes view false Display total CPU time in Processes view false Display user CPU time in Processes view false Display system CPU time in Processes view false Display priority in Processes view false Display swap usage in Processes view false Display combined memory usage in Processes view false Display commandline in Processes view false Display logical CPU graphs in Processor view false Show grids in graphs 60 Amount of data points that should be shown in a graph 0 Which column the Applications column view should be sorted by true Sort direction for the Applications column view 3 Which column the Processes column view should be sorted by false Sort direction for the Processes column view "applications" Page that was last viewed before the last session was ended true Whether the CPU usage should be normalized (divided by the number of threads) false Whether to show niceness values for CPU priorities resources-1.9.1/data/net.nokyan.Resources.metainfo.xml.in.in000066400000000000000000000363461510634446000240560ustar00rootroot00000000000000 @app-id@ Resources Keep an eye on system resources CC0-1.0 GPL-3.0-or-later 360 keyboard pointing touch

Resources allows you to check the utilization of your system resources and control your running processes and apps. It’s designed to be user-friendly and feel right at home on a modern desktop by using GNOME’s libadwaita.

Resources supports monitoring the following components:

  • CPU
  • Memory
  • GPU
  • Network Interfaces
  • Storage Devices
  • Batteries
https://apps.gnome.org/app/net.nokyan.Resources/ https://welcome.gnome.org/app/Resources/ https://github.com/nokyan/resources/issues https://github.com/nokyan/resources https://l10n.gnome.org/module/resources/ nokyan hello@nokyan.net @gettext-package@ @app-id@.desktop #94c4ff #2d5e9a https://raw.githubusercontent.com/nokyan/resources/main/data/resources/screenshots/1.png Apps page in light theme https://raw.githubusercontent.com/nokyan/resources/main/data/resources/screenshots/2.png Processes page in dark theme https://raw.githubusercontent.com/nokyan/resources/main/data/resources/screenshots/3.png Processor page in light theme https://raw.githubusercontent.com/nokyan/resources/main/data/resources/screenshots/4.png Memory page in dark theme https://raw.githubusercontent.com/nokyan/resources/main/data/resources/screenshots/5.png GPU page in light theme https://raw.githubusercontent.com/nokyan/resources/main/data/resources/screenshots/6.png Drive page in dark theme https://raw.githubusercontent.com/nokyan/resources/main/data/resources/screenshots/7.png Network Interface page in light theme https://raw.githubusercontent.com/nokyan/resources/main/data/resources/screenshots/8.png Battery page in dark theme https://github.com/nokyan/resources/releases/tag/v1.9.1

Resources 1.9.1 is here with a small bugfix:

  • Less unnecessary warnings in Resources’ console logs
https://github.com/nokyan/resources/releases/tag/v1.9.0

After quite some time since the last update, Resources 1.9 has been released featuring lots of more languages and a bunch of small new features! These are the highlights:

  • Thanks to the volunteers of GNOME Damned Lies, Resources is now available in many more languages
  • Support for the new “xe” driver for Intel GPUs
  • Link information is now also shown for Wi-Fi interfaces
  • Resources can now halt graphical updates when its window is not in view to save on power
  • Internal changes for less code complexity and clearer architecture
https://github.com/nokyan/resources/releases/tag/v1.8.0

Resources 1.8 has landed with new features, quality of life updates and better support for more hardware. Here are the highlights:

  • GPUs, drives and network interfaces can now show their link types and speeds
  • Added support for Raspberry Pi’s GPUs
  • Type to search is now supported in the Apps and Processes views
  • Holding Ctrl now pauses updates to the Apps and Processes views
  • Added a column for combined memory and swap usage to the Apps and Processes views
https://github.com/nokyan/resources/releases/tag/v1.7.1

Resources 1.7.1 has been published including a hotfix for a critical bug and a small improvement for network interface detection:

  • GPU, encoder and decoder usage stats for NVIDIA GPUs were displayed as 0% most of the time
  • Improved detection for VPN tunnels
https://github.com/nokyan/resources/releases/tag/v1.7.0

Resources 1.7 has been released with a new supported device category and other improvements. Here are some highlights:

  • Support for monitoring Intel Neural Processing Units (NPUs)
  • Multiple processes can now be selected in the Processes view
  • Added a column for swap usage in the Apps and Processes view
  • Added temperature graphs
  • Improved handling of media engines on newer AMD GPUs
https://github.com/nokyan/resources/releases/tag/v1.6.0

Resources 1.6 has landed and contains mainly internal changes and further preparations for GNOME Circle. Here are some highlights:

  • Introduction of commandline arguments for Resources
  • New dialog for changing a process’ priority and processor affinity
  • Improved application detection
  • Reduced memory usage over time
  • Added context menus in the Apps and Processes views

Resources 1.5.1 is a small bugfix and GNOME Circle preparation release.

🐛 Bug fixes

  • AMD GPU usage could be displayed to be higher than 100 %
  • Resources detected HID batteries resulting in unnecessary battery pages with little to no information
  • AMD GPU power usage couldn’t be determined sometimes

📈 Improvements

  • Smaller GNOME Circle related fixes and improvements

Resources 1.5 has landed and brings with it monitoring for batteries along with the usual bug fixes and improvements. Enjoy!

🐛 Bug fixes

  • If the Processes view was the last opened view and the “Show search fields on launch” setting was enabled, the search bar was not automatically focused
  • Graphs in the sidebar were reset when a drive or network interface was added or removed
  • App icons were not shown for user-wide installed Flatpaks
  • The calculated amount of logical CPUs was wrong for systems with multiple CPU sockets

✨ New features

  • Resources can now monitor connected batteries
  • CPU usage normalization can now be toggled off
  • Total read and write stats for drives

📈 Improvements

  • Graph colors have been revamped to avoid low contrast situations and improve consistency within views
  • Some keyboard shortcuts were changed to avoid clashes with standard shortcuts
  • More stability when performance statistics could not be determined
  • Some entries in the settings dialog now have subtitles
  • If a drive has no model name, its block device name will now be shown in the titlebar
  • Small accessibility improvements

Resources 1.4 is here and brings with it some quality of life features and bug fixes along with an upgrade to the new GNOME 46 runtime. Enjoy!

🐛 Bug fixes

  • Users other than the current user were mistakenly shown as root in the Processes view
  • The titlebar for GPU views was inconsistent with the other titlebars
  • Some widgets did not have accessibility labels
  • RAM size was calculated wrongly
  • Dialogs regarding process manipulation (such as ending a process) still said “Application”
  • App names in the Applications view were not localized into the user’s language

✨ New features

  • Resources can now show graphs in the sidebar too (this is enabled per default but can be toggled back to the old bars in the settings)
  • CPU time of processes can now be shown in the Processes view
  • Read speed and write speed in Drive views now also have graphs
  • When launched, Resources will now start with the view that was last opened
  • When launched, Resources will now sort the items in the Applications and Processes views by what they were last sorted by
  • Added device descriptions for better distinction between similar devices (disabled by default)
  • There are now keyboard shortcuts for manipulating processes and applications

📈 Improvements

  • Upgraded the Flatpak runtime to GNOME 46, allowing Resources to use libadwaita 1.5’s new and improved dialogs
  • Added brand colors and changed Resources’ summary to adhere to new Flathub guidelines
  • The column views in the Applications and Processes views now have undershoot and their backgrounds now looks less out of place
  • The power usage properties in GPU views are now more compact
  • Widgets with graphs in them now look closer to libadwaita’s not-that-new-anymore action rows
  • Improved app detection for GNOME Terminal and Google Chrome

Resources 1.3 has been a long time in the making and brings a number of new and exciting features as well as many bug fixes. Enjoy!

🐛 Bug fixes

  • Snap applications were not properly detected and categorized as system processes, this fix requires an additional Flatpak permission (read-only access to /var/lib/snapd/)
  • CPU usage of processes and applications was not calculated correctly
  • Newer AMD GPUs were not properly detected
  • The counting for multiple GPUs started at 0
  • bash was recognized as an application if there was a detected .desktop file using bash to start the app
  • “simple-framebuffers” were recognized as GPU
  • Displayed stock speed instead of overclocked speed for RAM using AMD EXPO or Intel XMP

✨ New features

  • GPU usage (including video encoder, video decoder and VRAM usage) is now tracked per-process
  • The amount of datapoints in graphs is now configurable
  • A grid can now be displayed for graphs
  • The counting for multiple GPUs started at 0
  • More statistics for Intel GPUs
  • The info window for applications and processes now shows the launch date

📈 Improvements

  • Vastly improved memory usage over time
  • Non-Wireguard VPNs are now recognized as such
  • Memory properties can now be accessed without root privileges
  • Resources needs less time to load after launch
  • Resources’ companion process “resources-processes” is now launched once to run for as long as Resources itself is running, rather than being launched on every refresh
  • Better recognition of Chromium-based applications and their many processes
  • AMD GPUs have a more precise name in the titlebar
  • Processes and applications refresh now as fast as the rest of the UI does
  • The scrollbar doesn’t jump around anymore when scrolling the processes or applications list during a refresh
mobile
resources-1.9.1/data/net.nokyan.Resources.policy.in.in000066400000000000000000000014001510634446000227330ustar00rootroot00000000000000 The Nalux Team net.nokyan.Resources Control Process Authentication is required to control superuser’s or other users’ processes no no auth_admin_keep @libexecdir@/resources-kill resources-1.9.1/data/resources/000077500000000000000000000000001510634446000164625ustar00rootroot00000000000000resources-1.9.1/data/resources/icons/000077500000000000000000000000001510634446000175755ustar00rootroot00000000000000resources-1.9.1/data/resources/icons/app-symbolic.svg000066400000000000000000000007401510634446000227160ustar00rootroot00000000000000 resources-1.9.1/data/resources/icons/battery-symbolic.svg000066400000000000000000000015341510634446000236120ustar00rootroot00000000000000 resources-1.9.1/data/resources/icons/bluetooth-symbolic.svg000066400000000000000000000020721510634446000241430ustar00rootroot00000000000000 resources-1.9.1/data/resources/icons/bridge-symbolic.svg000066400000000000000000000037241510634446000233770ustar00rootroot00000000000000 resources-1.9.1/data/resources/icons/cd-dvd-bluray-symbolic.svg000066400000000000000000000021711510634446000245730ustar00rootroot00000000000000 resources-1.9.1/data/resources/icons/device-settings-symbolic.svg000066400000000000000000000046721510634446000252430ustar00rootroot00000000000000 resources-1.9.1/data/resources/icons/docker-bridge-symbolic.svg000066400000000000000000000037241510634446000246440ustar00rootroot00000000000000 resources-1.9.1/data/resources/icons/emmc-symbolic.svg000066400000000000000000000036371510634446000230670ustar00rootroot00000000000000 resources-1.9.1/data/resources/icons/ethernet-symbolic.svg000066400000000000000000000012321510634446000237510ustar00rootroot00000000000000 resources-1.9.1/data/resources/icons/flash-storage-symbolic.svg000066400000000000000000000007251510634446000247000ustar00rootroot00000000000000 resources-1.9.1/data/resources/icons/floppy-symbolic.svg000066400000000000000000000011141510634446000234430ustar00rootroot00000000000000 resources-1.9.1/data/resources/icons/generic-process-symbolic.svg000066400000000000000000000047121510634446000252310ustar00rootroot00000000000000 resources-1.9.1/data/resources/icons/generic-settings-symbolic.svg000066400000000000000000000067651510634446000254250ustar00rootroot00000000000000 resources-1.9.1/data/resources/icons/gpu-symbolic.svg000066400000000000000000000013411510634446000227270ustar00rootroot00000000000000 resources-1.9.1/data/resources/icons/hdd-symbolic.svg000066400000000000000000000015351510634446000227000ustar00rootroot00000000000000 resources-1.9.1/data/resources/icons/infiniband-symbolic.svg000066400000000000000000000012321510634446000242340ustar00rootroot00000000000000 resources-1.9.1/data/resources/icons/info-symbolic.svg000066400000000000000000000004361510634446000230730ustar00rootroot00000000000000resources-1.9.1/data/resources/icons/loop-device-symbolic.svg000066400000000000000000000044131510634446000243450ustar00rootroot00000000000000 resources-1.9.1/data/resources/icons/mapped-device-symbolic.svg000066400000000000000000000101221510634446000246340ustar00rootroot00000000000000 resources-1.9.1/data/resources/icons/memory-symbolic.svg000066400000000000000000000011671510634446000234520ustar00rootroot00000000000000 resources-1.9.1/data/resources/icons/npu-symbolic.svg000066400000000000000000000060541510634446000227440ustar00rootroot00000000000000 resources-1.9.1/data/resources/icons/nvme-symbolic.svg000066400000000000000000000016241510634446000231050ustar00rootroot00000000000000 resources-1.9.1/data/resources/icons/options-symbolic.svg000066400000000000000000000013501510634446000236270ustar00rootroot00000000000000 resources-1.9.1/data/resources/icons/processor-symbolic.svg000066400000000000000000000016571510634446000241650ustar00rootroot00000000000000 resources-1.9.1/data/resources/icons/raid-symbolic.svg000066400000000000000000000054751510634446000230670ustar00rootroot00000000000000 resources-1.9.1/data/resources/icons/ram-disk-symbolic.svg000066400000000000000000000044601510634446000236500ustar00rootroot00000000000000 resources-1.9.1/data/resources/icons/search-symbolic.svg000066400000000000000000000012411510634446000234000ustar00rootroot00000000000000 resources-1.9.1/data/resources/icons/select-all-symbolic.svg000066400000000000000000000033331510634446000241640ustar00rootroot00000000000000 resources-1.9.1/data/resources/icons/shell-symbolic.svg000066400000000000000000000021601510634446000232430ustar00rootroot00000000000000 resources-1.9.1/data/resources/icons/slip-symbolic.svg000066400000000000000000000012321510634446000231020ustar00rootroot00000000000000 resources-1.9.1/data/resources/icons/ssd-symbolic.svg000066400000000000000000000016241510634446000227310ustar00rootroot00000000000000 resources-1.9.1/data/resources/icons/system-processes-symbolic.svg000066400000000000000000000012031510634446000254610ustar00rootroot00000000000000 resources-1.9.1/data/resources/icons/unknown-drive-type-symbolic.svg000066400000000000000000000015351510634446000257260ustar00rootroot00000000000000 resources-1.9.1/data/resources/icons/unknown-network-type-symbolic.svg000066400000000000000000000012321510634446000263000ustar00rootroot00000000000000 resources-1.9.1/data/resources/icons/virtual-ethernet-symbolic.svg000066400000000000000000000012321510634446000254350ustar00rootroot00000000000000 resources-1.9.1/data/resources/icons/vm-bridge-symbolic.svg000066400000000000000000000037241510634446000240170ustar00rootroot00000000000000 resources-1.9.1/data/resources/icons/vpn-symbolic.svg000066400000000000000000000032601510634446000227410ustar00rootroot00000000000000 resources-1.9.1/data/resources/icons/wlan-symbolic.svg000066400000000000000000000031211510634446000230730ustar00rootroot00000000000000 resources-1.9.1/data/resources/icons/wwan-symbolic.svg000066400000000000000000000010241510634446000231060ustar00rootroot00000000000000 resources-1.9.1/data/resources/icons/zfs-symbolic.svg000066400000000000000000000074541510634446000227510ustar00rootroot00000000000000 resources-1.9.1/data/resources/icons/zram-symbolic.svg000066400000000000000000000024361510634446000231130ustar00rootroot00000000000000 resources-1.9.1/data/resources/meson.build000066400000000000000000000003161510634446000206240ustar00rootroot00000000000000# Resources resources = gnome.compile_resources( 'resources', 'resources.gresource.xml', gresource_bundle: true, source_dir: meson.current_build_dir(), install: true, install_dir: pkgdatadir, ) resources-1.9.1/data/resources/resources.gresource.xml000066400000000000000000000145621510634446000232230ustar00rootroot00000000000000 icons/app-symbolic.svg icons/battery-symbolic.svg icons/bluetooth-symbolic.svg icons/bridge-symbolic.svg icons/cd-dvd-bluray-symbolic.svg icons/device-settings-symbolic.svg icons/docker-bridge-symbolic.svg icons/emmc-symbolic.svg icons/ethernet-symbolic.svg icons/flash-storage-symbolic.svg icons/floppy-symbolic.svg icons/generic-process-symbolic.svg icons/generic-settings-symbolic.svg icons/gpu-symbolic.svg icons/hdd-symbolic.svg icons/infiniband-symbolic.svg icons/info-symbolic.svg icons/loop-device-symbolic.svg icons/mapped-device-symbolic.svg icons/memory-symbolic.svg icons/npu-symbolic.svg icons/nvme-symbolic.svg icons/options-symbolic.svg icons/processor-symbolic.svg icons/raid-symbolic.svg icons/ram-disk-symbolic.svg icons/select-all-symbolic.svg icons/search-symbolic.svg icons/shell-symbolic.svg icons/slip-symbolic.svg icons/ssd-symbolic.svg icons/system-processes-symbolic.svg icons/unknown-drive-type-symbolic.svg icons/unknown-network-type-symbolic.svg icons/virtual-ethernet-symbolic.svg icons/vm-bridge-symbolic.svg icons/vpn-symbolic.svg icons/wlan-symbolic.svg icons/wwan-symbolic.svg icons/zfs-symbolic.svg icons/zram-symbolic.svg style.css ui/dialogs/app_dialog.ui ui/dialogs/process_dialog.ui ui/dialogs/process_options_dialog.ui ui/dialogs/settings_dialog.ui ui/pages/applications.ui ui/pages/battery.ui ui/pages/cpu.ui ui/pages/drive.ui ui/pages/gpu.ui ui/pages/memory.ui ui/pages/network.ui ui/pages/npu.ui ui/pages/processes.ui ui/shortcuts.ui ui/widgets/application_name_cell.ui ui/widgets/double_graph_box.ui ui/widgets/graph_box.ui ui/widgets/process_name_cell.ui ui/widgets/stack_sidebar.ui ui/widgets/stack_sidebar_item.ui ui/window.ui resources-1.9.1/data/resources/screenshots/000077500000000000000000000000001510634446000210225ustar00rootroot00000000000000resources-1.9.1/data/resources/screenshots/1.png000066400000000000000000003300321510634446000216710ustar00rootroot00000000000000PNG  IHDRb6%gAMA asRGB, cHRMz&u0`:pQ< pHYs   IDATxwxTULI2$$ ^ *RuQ"*bZUPPDDł*͂@hJHH3H%y̹޹s$9炈HdPEDDDDDD jBHu(9 ^"""""""JL)XP$2PȠ6M fP蠶 dPEDDDDDD5PƠ-"""""""2^gM&1u6+4sao$۬;^_oK4&:^ՠjd [DDDDDD)RFb ]DDDDDDDΰP\8BC-EDDDDDDrs\^[6& 5M6""""""r>ycl ch~$""""""M}^EIL#?P%""""""f@bjpcPPSÆ 5N{55f:CWCQի&)tz8S^2}(ks.Lu4""""""r>\0s97!8PR#""""""u^^Y5޹S3vAGoTv뜗LC evEMU mEDDDDDD*Ygnu'k7 1,LEesW3""""""Ր*l2MЂݟjc(glG5""""""R쵼zT%hSOz~Չm00gTw+""""""ҘTWKy&N ӨØrP)YME9TgQeC* m:\l'0!T PzEAۊ JoլW~4011UXꔵiRն Sتg4 6B+US0l_սtYu* Qj"JFgP!Lyˋ)ΘL[S""""""" IuBz)맭TWaL}u”5*LEg Uܿv\DDDDDDbmUe>{9+ d*t^1!Jc,d/C+X MEDDDDDDjCyaEYÏ bEI*ٯ1M"i(!:FJ)y^$*qh8SK%Ö&8HJջXdY *s(xQYa}"%C[(JnU X a@pu)o>z ]J/TκeOYEDDDDDD+{%bxxbxQPb]Cz5ԙ bjz2۪^ɨF/F ctt# ڀf;(𥥥ҪU+5H] |kTnnή ={v_EAbt S8|营B{s˜$˞jԫ7LEÃb^0"73~i0/v]Y"HJJ m"""""h4$r=w-XlY:OARxS<)T㦢4TbΫ :cd$7'Ly!L0?~%WWm6QH FDDDDa0IQ/kn9!K@0 |Tɼ\a@C b!LɉxaNnOAHÒ1s!g~{Ŝ's[ސ$(/yY뒽b o΀Srro aDDDDDDDj׊sDsvJ?\{6 Sށ)o2ޢC礤?X aDDDDDDDj'8W/|df`<5 ԫze]@;A=aDDDDDDDꆻLt!Sֹ=d5+VvcmT/:'LvzGZOR#""""""Rwڵkظq㼋}+Ly!\jhSۉPUo`&-XO7Ĥ%` FzEDDDDgԷަ`^k[[T|Y&j-,06RQףe`h0){~~>7R0Fʟl6db]v"""""""un֭ۆrfKɉz+:ׯ,'hÓ@j`2ce||/^DDDDDD8Jnn5`$h\]M899sBpST^lz5!1UI ToYeW' z{pee%heFD,**˿"2r;O'C^=?JvF+''sNVV&F=crً)kQybjGLpn/U5)Kj=299(z}52QH]ZGgER-z]0YZĉW+suu%,,k%\Fjb[zŋ0wW3aUڵ ӦM孷aٲ߿H%֬)b|||HMMe͚\w5j:WQЭ[Wzj&>>>s/kןnlv?,y|u/?(09'ʂzH-2L\tEl۶Ǐ;?.d}L&wԩShݺOfزe+2f\}bXp{nӵkWL;ko?1z(~A, ?O̙΄ Wq)6nīΡ{n] _|%QQј 4Sod,kזn~ NY֬$|||?qSЛڶmW\1zW\1zmj4JrAz_̚  O:y$MüysC֭+&]Kll=7of˖H|2Vb Yr%N%ː!q=w""Mbpyhhvc嗟`00c>|qVT@#8_t!RSl6C7paOmMzOdf~UVȑWpP6n$$%Zb֭L~Z-i^x%:Lǎpq1O??n'++bUx{{ӣGw<Č3ٶm; K,%''a.ח9s^+|WXwwwQÉTpXRhh(_>࿇'-YЬ͛7g=tN:Uλ43<`Y#5j$͚W/`HgW矡e`;cfrx>o_ϣRuǎI-ѲeKbcc'L (bp#i|Ï,_>CpM7peCc˖H œO>)F~xxDFnO0k֓_777.\/63 ֿ曘<&)=z={p! W_ɉ͛73gΫ,\>}zspk yO+1Μэq^oooNredddU""(4t%\z,]5k~+U[ok&==kӧO?r뭓uK/+ӧ?̦MY /fƌGפfSI@@sȣرc@/;FDD*a3&ә/]\LL $UehRT_Az4.Z⦛n!9942k1Jɠ}߿?:t_~kaӦ̜9Q^WvE*7s~ ٩S'N2'''F~78mؼy3~ ߋ1N{UWbw| 2=ϼy0ax‹T`m^ڵp ſϷ_OZnkػw[X~_~K|4YFž+}Odffif?NzzBll,>/,x{-oonno[V8[ClXV- ׷ Z3I ~9wC={ЧOo|||شi3w۷3nX~M{Ǐ7Hչs'Z,^1oLFF~oѣMD <0sZ^lbb[5׶mX:VncXju:K.cH&NG}1:("Ҥ99U%O<ay9s^uViۍ4#hsT IOKӥ}x DDlaٷo?fmF.l(^^lذC믿ѱcp47x7G;Gb2ۏ˿СL|v|K09qM7;sY6mɓ'IOO]vtڕPԩw; !$_}5+V|O߾}Ciݺ C^^˗ܹ;wnnn䜙vɈ4UQQю9{޽/p,۴i3ӧ?̞={8qD[r96lx1ͥfw!Fl6;11WOĉ,[˗̀9z(-Z#"M K>|0xَ/sO̪(...z_\s[Pjd㭷gҤtԑ_E>b߾XVwƭNs2/< .""b \s$n`믲pG۷}0em u|rRSS<":vܹ*a6|W;v wwwFw܎`ӓ7|?`֭DDle˖\uՕOs^^^^_lfK:uJ]Wq^#<İaCωFff&كWwt>w˻M@@~ED(ϗ^z[֯__`-㧕/"? ]NeEOK>D|!G" Xc,%2w<梐WDDDDLnn5/0u4 =1z""ˢE`FDDDD'''<==Ȩyzzg ]tXЇ&(/94XO' O$&&o+/*fkITP$["OI"""""""RfwFT?k0遛RD"""""""u <+f1 o0Õ[5"""""""5 ///$5 0 899₫0j_ M )]QK"""""""" AgFHP#"""""""RGĈ1""""""""u1WDDDDDDiiYzĈԑ1Q/7H#"""""""RGĈ1""""""""uDAHQ#"""""""RGĈ1""""""""uDAHqVT,//_BVVAz{{6VZCff& >L*""RǒNn re.>TdvTf3;w&$%6+'09DGGã';w$55@h$77]$!$t ggg~m)))tڙ}3d`6o // F#b=ѝv͛5k`M$$$11Dի'İGn4oe999ybbbӓݻӼy'Nb8l6cݗ㒒0 4ba}899qΝHJJ"9938>xZh?z9'Dl||X6bbb'V ??_G<6lDVV:tٙ[rWkRRN~z|}}qww#>㋘-ӪU9v,yѣ D-Zm>{W2d IDAT}DϟⲆ>|͛ž}9p ^kזSYǩSDFnjѮ][rssش)\N:ŶmqqqCdffifV+Nb}޽V͛#Zdb׮?9~x a a0&ʱcQر(<==w|B߾}hݺaaJbbb֭+nnnח4֮zA\\<[l%33 N_nB\\ 9zt__fsnh !$&AS `ǎ8991p%::Sq|6j޼9?~[nɓ_nh4:psvv& #r縁46X Fadggj;ϙY_-[cGCAHAKJJÓGW[шl&''Rj'P%C3e cDD)iӦ wӭ[Wrss˳Fd6Gyo...8999N>dg8zLIff99©SIOppyɈ?={vwUAx:-''OOG_vvhDAϫ=off mCLL,@V:thOjj*Gȑ8ӥKڶ p_Kdr{_ އnnn ЏĤ_KS8YoΝs*Ա@AHV8<;;:ڵqJff&؜4iii4k֌C1""tٳ={b0hӦ5r,www] ?ߊR)8 @AτƮUwS6ndg琟m ']vxyy΀(ja6Kvmڵ nch*ك=zIl߾?6KC1,}xyy[KA3#F / 7߅Ăx...\UØĈ4,deeӼy]t|ݺ$%%9zsBNNyh<3VdvͫXe!i\]]i"OТEP/8ٽ{/qqqL.dddGn]5aËضm;,ZnaQ`bc8r(q kþ}ظq3>>ay ۶e`bccZmt֕6ų~ZlIBBO's%C!"b ͚Ѳec8;Gȑn1F}):<<///ujGϞ1 KcСC{\]M>|]h6nݺV7Kػwqq$'`6i6Q_ū)1 /Zf,RVVq}KLLXXۧ6˪4J /{ؾ}x /_=f~s&"""_\|5SɥXil%ۋܧ7,HSc$5lB.\i222ٹsx{{)s U5qr2K?`ފsa۹{xt DDDDDjPRR"QQЯ__5V믿Kp56ӧILL$..5Y dq.!j$&$44P5NNF.]s~}}SN:5H1j9zD|6lĝwN#--++V箻k&"b ;vۛ/ c08yw}/<4~80c;'/!::oooFUWA1`ϫ\jsmv۷999|BON[SMGyX^}5ګu.\K֭ٺ5M|ݻw#--^xn/BllBBB5"""""""R6 M:[ꊏ={v/sxҠA4h NNN2yXVG ",, '''Y;`2< LJnݺo+"1\vv6[F2x`Gٰac(CsNdffqTb:K9v[fР<#\*ФFnMYx饗qrrb`ǎ{z-(c0x#ܹ7Nj9s]tFnݺu\pA/LX[oQ,\vP;wA$%.R'Qg׮]m@nn. #<&\+ƪUkĈTF,99O?EHHHeW^9wޙKNNnnn@Aw?0p`bbbO3柎4+V|7mڴf˖:fzssѥKb9pW\1ZC'""""" 4gKQӈz|||ڵke`0if.j/>S<==QL4zSNaO&8= ݺu{n~T>l'OǛ.ʕWG """"Ҁ &4bcǎa1e.3L,Yq2777z ٲe0sTÇ1|054xE{zHã FYPP '8X7H (RĈ4lM4QS^~{. '^A{=j@TǛHf*_XpyN%;xzn/cW߿YBCۨqDDDDD8ɥXil%ۋܧ7,Hc׬EDDDDDDDꈂ: FDDDDDDD(# bprRswVDDDDD,gg][D""""""GAL&I YZKԹ8c1D8 bV+99ٞ`'''()FAL f45H#] yyyNJ WWڦS'O_vDDDDD1%//O3" g'S> &P# FORRR l&"""""# & o\\S4$..xh/Նd *ŀdjꠉH1Jkgg#//|VF99qv.F|DDDDDSS Z+Kt """""գ FD;YvD#[~j1"" vX-#"""""դ FDFADDDDDjBM "Ұ= 4Gg_1iҵdgg0~$~g54ۘ6..2ƌςbPƉ'x v9cƌ旪S~Y?.XoYW_eX~Cۻw f޼}΅ ?bРl۶: / fDo߾)SKsu7z [,xMFˈxꩧIII)n~~>3f= CV!%%ٳ/s-7cxiѢE|ϫEAް'|UVe.ѣ;=ztAFi 6iӦЮ];bbbY{GHFF:g? ڵߣtӍ 믿'1|0Bٿߏ1yyy[^zI- hZlP>̪U5ߏn6mZςDG+Y:u/>ǸqX~cubccܹ^9z(}9\uՕM= Mi~Ltmˣ>a1W2gk91yQÊHx1k<<<0|˿y.b\\\pVvOx!:c3|g-aׁ:gصO.|kKHHHaaƖ'HOcذ˹ɬ\ q\\<AǏc-HJ:ͺusy/"b _} cǎv 99VBJgWjRڶ + ~m?~V ^;5a1j{ MTrN*_W_}Ê+?bߌei׮>ï2G!**6?~HPPoFI;?$V/5Lr,ǻ:nnndffvdeeq%C SOİaCKǟą mC^=i|tоW]UZX,\s |Qu^ʝpqq)MV㏟}dR?~\~ĈTj֖.be0aV1bpLXYpppݻmU[7 mmK/ʕӧ7^z aa:""RȱcQ|ɧ< ^{mff0eno„L0k.dddx'ObS3+2mT +V|7[ܷnh^y5yg륭 ,''XyNNs\cP(**O> +yOҡC&>W (QIhم#ƍۧ*eKذa#۶`;kuEDNOP O\q8K׮] !::X}Q>}z+Kϙ*Q.k7`2HNNG[d["00o'NPOOO|}}}pGyᰘ-KiHH[JUx s]_/}N^y5^z4Gycǎ踙fbpvvfo~?<>[: / G]0 8pL]v_|qߏ8D˖-}"֮7|-...\q(f_-#Gݽʯ83L> ПU+U߬Gȑ#t6lĀ}O? wwwrH8v,I FDHΫ[C1aU9r_(:SO`{sDb_i۶""R'35[9BD|aڶ g\q(L&|r$"b / &\Ef'?3cΌ6mZorj/L|㹿,Ƒ#G8r11Wq&~}]so<lj?Ύ;=YZn혠>L|3o``+V|ϲe3mZA/ڜc693b۶۷mø!e>GTTK,uWܒDRSSٿz3OI""99m@?.oS܁B߾}쌧'o*.K.d2qᅃ>)DDNLz,[<==<".0Lu׽=V$8ITT̍7^`SiӚ~a.s`xᅗShh- GХKJN N ۇ3h۷_ay,^-11., ǎEqTc7o=|+駟*ul6}`XLaO#//O^nVL&fϞ$j{1 /Zf,RVVq}KLL<ěbhǬZUp#s-qqqѻOڦJu?A?.y#F}9Lp.(""""RɥXil%ۋܧ7,HSc!zԢ|f~M6;>s:3<Ê4k!R,!әVwXDDDDDGAL-c֬lٲQCJJ*[F2klfϞua̙Oyӓ={pwRB$Gd١F8"""""R- aHKKw c˖̚5ssa|B>h!/NNN<#: d֖.q:m֖.j615ds9r8˼ c<<< iIHHKv,cHM4yYf4yaDDDDD44Y,R!Lhh"#2k֓u1I;'N$QzZu'|%\<ôj¼y̙O:N"o3<ѣ{,Yq=T|aZ˳>Gxg;{p|u㏳pGg|.K?㫯fÆ=Y||> /J*͆ >Y#7ϷaEDDDDAx睹\㠠 x5~7222?~"|#_zjMz',!??.Q޳grg}N`` w쩧kg׮?ի'K|ʕWsעE fϞEzz:+V|OXX*>;I!&&֭[qD_Ix>}<___|}}Yx,Y)_cǎxxL|3@ HriOfiF||fXDDDDDQS wNnnCxyygٵOn( IDAT}L2 o]#P0'66qr!nzǩSx9$%%2qƍG}_0b~/b4kW:a=F=zwJQ>>=&N`],Y)Sĉ̚$$22u1Yzdbݻw7s {_Y#_%"""""g5[&slʊ߱`кukxqnu ƍSY [&Ӻujӱc6mT,--X:t@ٶm;sϿD?iLoL8/l6C;c7+Xs&N@nn.tٻ(ٖ^-H Hi"(D) BņRm" ( " @(ZһJI&-dIBрv̙ݳ9Up}2jhVZMڵV* isd_"j4Xo! 6 ))cƼLb̝;~$6lQ/ڌIC`Д)oo΋/fG]G?!11_ȑ/rbbڳNٷo?/ &M񐞞SO aΜy>|{ڵk7>W_/ 66p:v^:..gmv;գ/^w;3ٻw/ 0`@?QVaٲ:tpڴiEݱ~dERX8-ZDݼmvhJJJDDDDD\;[nZ' ̧ZA;%~B ˆH2(sy+ŨQ߱X4h/*#r(#""""re( { l6Fxy6mZѽ{>&#"s#""""re(15IDDDDDDD2Q FDDDDDDD2Q FDDDDDDD2Q FDDDDDDD2Q FDDDDDDD2Q FDDDDDDD2Q FDDDDDDD2Q FDDDDDDD2Q FDDDDDDD2Q FDor:4M5\bDDcǎz|1a>;G""""""@E:z(LTJ,F:!IJJRÈy)#"rRRRd$0M0D8O}KZZHDDDDDI vI>;>t &{ Zȉq\j()1"R9N}799Pp ,ơ/FDDDDD @iɤn9v8 nғzpg1?_%x<"+%%)sڌرoK=zԻoVVM^rg/nxNj~cwL5x"RC6@rP"UXFXzKcm4M\.ɩ'wجಂV FBvfL1O$BD>ٓ q8jtQ FDу)~;ԔHpiY?nYyiUJ˖fٱc'o=GEDD.w䓃̝;zg}N8>AttyfΜγOW[o['xNs)_\))) 5k:Ç?ǚ51yܶm;wG̷|'ywY]F xՉi֬ ϡk{y1|yW_7eN'4hiϿ )$WLRX}k3f0EWۋ1"RdeeaٽL6 a&7 `Cy:7uD]M)g(_<"IqUl΄0!d 33o? |#]c;vZjժ(Q\\}-[һCTX-n駫|wCR2M6o|ɪ|Oh|?~p\5kgSt)}v*UӃu8| 7ʗ_!!y/ATTEq _,ڋ1o6l@Ϟ=(_11>fΜqqY3^xa8uԦjժ;??>>իPJexeѹs"{ͫE)rbqOgc2AP&ƒI HsIwɰȴe=u';Nv7teB$OWTwԅ ӻw?4ɛzwѣ7Ԓ.]ew:uv4jԔw]@jj*/eAAAX,Fw SߩSx>I^c޼DEEѷ?bagO㏽$k&""u6̙GNsApI.\LFFqq1c111k]W/A9'""1cr1t|gvxL7_OөS>8&OJ.y &55'*S^BsL|||7"Vn!:<:uvs3e]Ũ4k!Nv 2 *!É| 6inɞ( < ],8Vl02!=0{F?#Vاlƌ>֥˝4jt9ѣw2eӃ0a"? ݎ.=p;g4xlݺ>EժU瞻yܹ# L.6h_ =7ͭx+V/[ox]=ӧ;w~de9yIjՒW_GBB*Ǐ穧{jCm{+۶mkז_ݘ瘑#G3zx<233z%o[CCCzVv;N &sX*T棏VҢMc=7fprDӧࡇz`\/Y[ԝ;@FFN|INNS|…3g&k~;?#SJ"uEˠU[Ynm[l y2{X@L)~ߐL̐T p`iǍ͝,Lw9RFЩ{g=ACB*>4 \o*83:ҧ]DDwVTJ*QkΝYӧ;;d\{m=ڶO?̍76aM8v;\w{fZvILtէ_| ʰakO?~,AAA||>/A˖w>ƎGN14mδi߿9MJJ"!!OWt)uލ^z3slZj֭Xt/U駟ut :bw~w= jժ2ikJRʕ8UNƂ,СТM@$rQ1=,o9{ 74d1zrx<-&243j EWۋ/gg=w%WK9ֳmg=z|iQ﹧+ǎcשYFر'xŋt}aFY{[t:λyy) .6ŷKRg"+9;_Hrv ipB]tvW0\`L gBi,~6MaGH^p|nMȽnZ' ̧ZA1cǀ1r#-gcǎy)A|v;QQeIHH` 638qڴiMllӦMgǎ86mB߾}h~'ΝO\\ԩ#]~AN};v@ƍAofbb"SNcӦvn?(lڴ3f~ԩ#{~yzӁӱcn={a.]JOf#qM_b*᥏a30n<؊55:i0!2 [)@ , pXp ;;$r5aDDDDDDTP| {%4IL<3Ӻu_ҧOoKPP Ǐ's-7IKKc 6'`6mзon!gp8tɓ<`6mc ԩ4Ly#_^`Ԩє+W9sfĉo0g<ɓ'6lz=HVc̘/_ƍo_7/#i:g9u={>}n~ARZUu!yWS~NRx9Y2V,4F=`3zLHLkv&~.GB8X*(b SN@b2…p\4i[^Nm:v(U>:[6bs}lݺuhb:vɨQ/ʕPBx1oѣn\(ѩSGJ, q/p88~8YYY4mڄpY`.~~h,^o=/4כUӱc 6(ߟrwo?Eݘ@ph: >1j,ۜ0 d0n)৒Ѹ] /""""" +#fŊZ&**1cFQX1>%J9#,,rߩ[{ƽO{a-y>ɡC(W.ʤIoGݺuiڴ1gQB5kJ>ԭ[f͚x1w٧Z!33TZsS\0V _>Tav[ 0]X,n fv7kݛsz=#{q p)l~~yU)-nU^DDDDD)SMy ((b=4f{sGԶmt-OyXX(wyM6f˖,Z^;0 ^xa8;6loeƌhj׮Uܷ"nQ&|z(SŋS\:j*>e<O*ٙ&UTfM>~mNjj*7؈ʕ+m6Jװa#,c=R>Oj2x>9Wo߾AfM۷ #<<c|cl۶Nz߿/ŋg۲}yg&{pаa Gxx8Vaٲ:tpڴiEݱX_ccc)^<"{AV-,^IIIDGM$99rM\wqX\x 7&LNϘdXL+ibZ6 amܼ.Љa w>&9k̵Nrm'WO~mP ?q\̛7>[DZcݧDiӚfSbHa@ dcN'b$ԖّL 0L̜>A~U3uy]eԩADb!IDDDDB(syĜU[Ynm[4N &tr29p#GnUWERUc۔#""""rb F""X,(YŊQx<|4X V+VU ʈ9$#FDDDDD.c."""""""ry(#"""""""r(#"""""""r(#"""""""rh֤B@.đ|D vB"""""RkP!ry %$KA@;oQ{HѢ@L!p \ ߌHQ@L!r")1HoFDDDDD\LLLLLljLtrpx<L3{'0X,XVl6v0h"""""r^ Ĉv$++}Lvv9ZjD)1"""++ ???Ԙ"""""/bDsݤvq]\.#"""""yh^)\.vIMMrEDDDDć1"RdnN:0ɩS 5#"""""W>bDJKK$Ai/bDHJOO,*nt5WD)/d|:ڴiEݰt|ff&C1"R\LrcǟeK.?/p8.j|"N)RL$++b˯޲0N<Ɇ 9r4#G`LVVwff& ,b͚:tŋӡtvB||<ϧߞ-[6MobѢ%ZD"""Ճzu|5kֲdRO`` H~}(U~9s{Kupv:u_vۭ#ό3??9,[ʖ-?D˖7ݎouU^sgmժ5,_{# MпJ(>W. \+n=O=5$m]?ϨQcضm;+W~}?>;v.n3f, 4Pz.6laϞ Szz%!'Oawg„4mاС<=F6x'|K1{ ek+#"ry8΋+t7"99z/zQy4\.xbٳ;+^̞=)S&oOqqq<`*W_%p"{fΜNhhO0h͚uםy/HMMS^\9&Mzէ\+?aҤ70/^{-)))̞=~a"r8 ֮իqС]]fϞǓO>AYFIũ[~~~,^|wZjjb,\8O{.۷'ӭ :;ƃvϳw}v>ev楗^!:|gΜEA>ZjIڵ8zSśoNR_zE} ̫uV,YW_}W_Gb`̅d\ȹˈe֬w1ڵkӞߞxe>WVec˖w?5k;wvZzkkfx???LHH0+V̷>?Sn峔-[гg +Wk1a8ٵk.`1Ǐ,\8f͚s5k>GӮm\}u>!VbcPbEr{u?O};wbѢL0^n:tSsNLTT}/Y#G'!!;w^qlJhh(v&/ӧxWFٲWaG#55W^ϰaCCY>l-[wX"-ZtOWy^[nioFV|T^ WW >O^yewu'*Uҋ@sNg Lttyv#Gy1DG9_ߝ?k(^<§<24=暣vZs]ֻbJv%ӻC|>zkر޽{ٵk7>vD_C={^[ϧ|ԩ ͛#<Οf& .shѢ={>R."" %J`ɔ)SΛ7Nb|ʂX δ={͛7bū}ᆆ4lxOfc~ddd}4'nw\dѢ%t'vҤ ԯPZ,+Ŏ;ٷo?%KoҼy<= /<Qrn_σw{ttyvIVV*Dj9JP FDx<>w0KbÆL:5k <<&;3wtW{CׯVSk߾۰a222󖅇sM7G+|4n|#%KǯOnbJ{n8|->v8_}56N⥗zϚ5%Kgbɒkw>;_ݠ?җoɪUko{۷o={Ͽ͵cڴ7 HJ:رV*UT_+?f,9&Mz!C2rp~g6o€}u_gӭ[1g<:uxA̙3&MSr-}f˖u׽tp;%K`ʔ1b$Gh)RL<)L=tRL4St܅?|֭[l{[{Oθ+j#ѧOZ)O'Oހl6w:S0pڵ #Shf6mC=M75cΜ,]ѣ_"33Mү_ʗ/Q#cׇA񐕕ŢEK8UpwՅX1 \?+Ofٲ4h \S3ΝGF7PZ|r裕ޮ#*Uq^_l]. ,k{ ԩ͒% ];F.IsqzkkykfΜ^>Ŋcڴ)O=5.I Ĉժu TRvEll[ncڴի7Jd#,, d JV9kjr1f<`rכ[zz:.+OSD ֮;ĺu_Hƍ DEE1a+>eAA|UVaan6n…۷?g/3qDDLbcHOOgȐ>3dffˑ\9w[omî]9s6<@W}YKOzBCCINN)ѣޟ:u2kUz322Yc;LzjWl{^ts7idZʕ+1p`-`ua̟?bYp1C ƟsӰaj֬qAXj5GoG xEP FD3 㜙)mڴbILL{~6l#GxW9zwy:μy hݺy}*T`M_BBBX`.s<Aw3y}jzs۰a#2ѱcVXwt⣏V>ߩ!{ނf8JÆѠA}vgGn|y٬g=DDpDDDPFu3evhԯ-k*իq&|ǎ} 3dzO@@w[`9 ȡCY}lK 瞻_[le¹̚5L0n_~as RJTT]vU`寿ϙ:uޯ/O?xՉ,X~zEh)Z,ףG76l@RR+W~ŒoӬYS)WÆ ĉtp;/8_|.HX];'::h6oBݺ bb:dRo92331c[$ ?dzo~>t;vCڜ{bS6իs]ȧ+]Of0 233 |}'--Go}ك6cxc#J.U]. y. gYb%wG ==;p}0zˬ_ YY""Wի#s)BCC߱>lƽJLL{Rf<㣝- SO alٲ 6o2e[<ģ>iiij7ovEi̛73݆c/=ԇݻ\T}7$*~lٲO+UǿƇ`߾}/<`ud6q>S>|UV7OWqqoWTTYLdϞ=DE7kz6YYYp0rp4O?, *D3eL<?=^ɹwo Y] a̛7'M =ԓ>O`_cE,\D"""h޼9?wؑu3ҹ]y?|χ#F<ܹY` A vϥo3q9rƍ{AxTXgѢ%XVjԨΤItYj V9YNTTO<mzE__%pW8r z˺w!&35QtQ\ҥ˙8uhڴ pc.\L*U?KԩoxkҤ1_ѡC'"##0a^/gg=w%WK9ֳmg=z|ߙ|D.RDQu&%%Jlf Ƅˣ@""""">^ FcĈ\bGRM2j 1{/ν͋/pA=RFL!RFgnT10ʔ"""""k#".!$G g1VUAҬI"XBӭv/ $55K!`ƅʈ3Lҳ$/Z] ((d݈ȕCK`˟6닷dKHpĭII6B XVٔt("""""~=Xb\&2!aHj%$$Pf6#$$D0"""""/\[Ȝ& YPeR!, < a}p8$+:sҷB;C@* uO:!, ,WJ`` aaap8Z>jp 2b x7e,:X7M*YQ (+s%1 Áá6)<ʈ)dM {ewQ&ߠXA\NBwƒm`` M(KH  ƈe M;\1fO*%{;=O X#"""""R)S~s~f@OuO*ڒ3LL Q$"NBlR:I?PVLRX\@GUMDDDDD(ӬIl[V9wԱaɵ}g}R6Ԡ^9+l~DDbDDDDDD2b QJV7R"ؠ}M sǚqX-,ds0nmvq׵v( s3Cp@Lt 'J""""""R(SF-6լlOX-&bj۰[ J z`rI WbgDY8JI )m21 e/o sa \15T,n0+'յRs?$Au`r+Ɖ)”s FP,7u\kX3R8vrWN 5Xf) ְ]tDŽc<]rI nuaPDDDDDDe\A1H͂e)fYxOۊ hu͵){vvgo`ȸl`sizpt흾jb[* G {dzNY u{{r7׍A:=7j1""""" (@?7s ,2 dr7/9 =ץ?Hd܏*/9[@EEjDb'<bƔrYb.:8{r7Kp"svm1""""" (@̿?#r:qʅDj%"FDDDD$'ˉ +r(V 2QBCC)R$*U*kٰaN3gStEIFmLiY#(UF رclCqqq)S %K纮y9W݋1"/BÑvW-_2-s-/řٜ}__ m|n!!xŝpYVN:Vˋi>G+WJ%*Uz<ö:wēO>n0 fϞK歨^i^xۿ5DDTжm{W]2Æ` =ڵSv}ƍpILLdԨ1ԯߐڵ}8v,mbbbٳ7uW!G%99d""r1Fist?1y,X0|Ʉ-2cqTh۷۷uKs8LY5jĪUk2t^j!!!<#}}XLiuqKSŋ tR4T?|XX޽'&&ٳҿ;9W݋dBC^|% 0>ø|$#F 6Ҷm{Z~M驃[Dv\4h(S4!!!,Y3gY3ӠGVܞ8q-[{#\'`Æl-QQ\˖}Mfٹs-=&&>LF @իWx1nŝ o޼nyqqq+=k?Ν;i֬%>XgikKstս(#"9^Þ=pa,Yjݷoƍh޼)_~yӵ͑#m[zs\OOO<==TFD_c_h9f3fwDPP=3%%~<YX4nܐZ o?~ 2 2aFt:IMMG+СË]^łj%111e2δl_?[_̝4k$GӪ{Q FDrdMJJ/$pҕ>ܹ@@@SK>˗]i.]qf7=uJd8vÜ9sҥӦ}Nɝ۟˗o:cbbHII|y?²exA|}]iϝ;'ؿW\pD㯗ٟ+U…hժb)I߾HNNfܸ1c:ty*: fcР-ߤIcOItt a|rj֬=zt'x1O?^zٳg{}IIIuKOIIf+ox=r˗obbb3gӧOa͚|}2d %KQǵ^/%%-Re0 o4h8 ?a…X~͚|}}j<== g׮cru Qe˖ӱc֯ĉ,}^P&NGӦ-شi3 D7uG<RDqWq  pӎ 'NȴuӵψXxwر쳏sq`""Yj>oΟqI8vΟ?רQ͛t̄ƞ=P|9 L:3 fxyyиqCo;ΰ)Smxxx7[_KҥK*gȕ+ȑʔ)Ν;o8ɒ%_h$f^^]N}}}ILz6m7nbҤ 5kʕYk rܶXVHLLrJ[-m͚u/^< ?v,W\a۶ݺ+l޼дi "88e&::&G۪{Q FDrv_/l&휞~mv&~KTlwm˙3gx<ر=޽ ?g0)00ݲ53>C1q$]ݕ'?ߞ[1e4cX,X/wһѓӻ#n?]vsAHbT^-m0wJ ,Ĺstek3սkx sNNRiv$ii0q>8 o7Nx~>f/s)TqfΜj 0hf̘s9u4r+ҷ'nt܉p_s\rLk].]:+/Gs+V#ߗe6?~ }݇TJ*O&<dnaaEY`mS7dΜy4lxEcƌwҥK1qxsDL0ɓ?f칄o߷Y6ΞfÇN_TĐ!2dذn1[ ѣGwڵ{OO+;8G۪{1gin_~}rӼ͏]E{%$$Vǟ&00a¸^u?] >\J(XP #Gp4o0 o!ҌLnJ5IDp8=[L)XM צy)Y-""""ékx.cZZ˃-6nٔ9i`38M)XL)h(YMta>+7R/b6|0)8=ZuO2@HN@x^X8a>+77Rһ )X ZxREDDDDr4bD$ %%<==a>+7EZ&e7fƈb6\ <\/c1%c"nI鷲6)M)lNf._%oL&SS'`b !.S ś%]oEOC&.gϜ0 `2OOӮϧkiD=*)%{͹ 6p;Z&00kצCAٳ !?55g%JgzDDDDDDD"&M> q ,X3fvSSSY~cy~D9"""""""F6l`Ҥ}>?z~z{/^믿ԩSnm {\eN_a!|R z_aɒET8#Fr߹gAF 6s^5.]ҥh9-OAԭ[~˹s\e6mLHH+H%""""""o@̿DÆ شi3III@16lanRSSYp1R )@fMiذ+Wr+۱c<==P<%KJʔ(Q///5kٳgIHH`޼/hҤ15$$$JG,^:6mBJ;wnf3JH"lڴUo7Qnm""""""@̿D dÆoV%>>>T\ɭ\LL,))) ~a+/7lŊ+iܸ!+V"*fs汶?Zp0LnYUӦĉl=ʕ#$(Q &ծ] zS^]Oɚ5k9pPHP8u4*w۷=Qd GժO݇ErP<~͛e:DDDDDD_I]ы/>Orm< /<SO=ĉTPLJ-alNf ӗ;m?\[/oYSٱc'|-[שSKqd<իW$""""""JjV+/ ,:uz)a(6mLFQYr1yǜ?B kR^{cUd~̜9ɓ?&00͛7Uw|jU4CW&W2gin_~}rӼ͏]0Z֮]ʯ_&iiinݖA裏)IBBaaEU"""""9OOky82y4M Ɖ!$d[A-b X;GeժRBU p`;p:dd2a6[`Xn;((#cϟW_#,(}?t:IMMs|ewcq>w۵xQ (!bYj>8Ne""""""I"/t]u!/Xηvfr^V"|mS7ADDDDkHp8;q-˕p8w|j՛~d;hѠ&=:pBj#"""""(#"9ZZZ;vJSi]v_oGy ?ZɱRSSٴe; mt{M.Dr;2G4w[cM"""""3Zɑv;;vBpj-Z-P|J[qMD1u2\^DDDDDNd0"wʸv~ KVm fSm@;8t4y9{6]\w@;׾!}78r,ө]DDDD$S &;W3sUf,Ix>'y}rSd3m"y\{u[Wn'Lɐfcʼ\|EoH@LTϟ08}e6w|*׼y =ztIII1m{BN]^i5k9<7w>nY7x߽{;vfڴiӎ7ܲfcIDE5N 4Lv@TTcw$W^lqsԩ{RRRشu'i6;#4B<NJOtYFi5h3m8i6߾{,%m4u… ˯\otRf.t`,X0kn!3tpu UXyfMӦ}7ŊtrYF]2_m9} ^^ٳ7+WbΜ*scEz_k'Ozq?z(={Z5k:m۶alٲ-eFx;v2zH&O .ҫWLYm !V}Mpp0}z?IΝ ɑǽ^#--w@O~nLFy`ږ2o=[ ߏe˖gWG7AAABCC)ZUx>lٲ?`Ο??gΜa֬9:EDS<n/Jܹ_..\nCꚂ2oÆo&MjZsN-ZZ"el=rC=Ȑ!?~_̙Tq:txEФI#ڶSLʹ|lq֬Yyr*UQs1n!C8ʔ)@ɒ%Ko4Bh޼i=U@6#'HJILxAlWkeR02<{W۲9~o׫WXs;ranu5j۶=˗}mkSLsK[v=O?]k/QF-4y?… 0ZQ^[kƍߺ'99[Q^[.[DqNwx~睷:u:G@Dq1woH9} fn|iѢ9&)C^fM1b[ȴ콞3cFgzWuO;[[Z:8p /^̴|hh(K\O*3 t:ٻw2{\'G{Q FDr ιlbq 3wZhYo]3G|$]ŨEQ %-XEX&'#u;RU̦M O\r3g3d0:wƍIMMr9r0~VrQhӦv\?Q~ HTIӦ0jLG~o3c,:^D>jiѢ[V`wiڴ = 6`~,[+WӶ̙k3f~~~z]gO6͠Ft܍7u &)))l6rtԔ /_v/+11̙3fZZx{Çqǹ^d2e,Iҋ#+NzLJAx{{Z1nӦ]~r4i|g뼛[g7lźu0 uUՇ~͚utЉ/ګ2׷tfVfi7{;vif\rʽJWfϞܹXn5~>Y7" D1tl6> ""ɬYshݺYX"vSN֬Yǧ~ΨQ︻ݜoDՓ'pݹ~G<ƺ_SPn0 &6x'Ndmvt2s3b(>#cǎqǺ^b _@z]I5^pnJSLʱǁy"́׭ yk͒5jѣXb%Nƍ2-ŋ 63gvWFRR6mwUߕjj7nH^S^ʖ}m[%K 66sλmvVZ"Y~or„Qh;cTϞ=z*SNׇAD>n.\@V-3}RÇcX1v#F1p`[ s߬͛%~Qr%*^82-X4Gmʕ+eyCӦM#((`ʖ}yE1VʺDR<ʍG'?Zib.>۷ X'w"}j5'@_O Yp1Ntt 1Ԫ4GGQp!W^XXQ~y'N2k~i+Ryb7CqX4C eÆoٹg׭K/ "r1 3gѪULKbѢ/6mǎEu6 J@JJ =zGF )Q=n7!}ois.r7 )dQ"w#'יs `O;isi6{yhםO١bN^kQcVDDDDDr:OOky82y4M Ɖ!$d[A]D$0L,QGJ߲x{Dg)_J> H@(i٠&,t`1RØ5;2]b1Ӫa$zDDDDDr8bD$G <؃wƣY#5CzՊY;VDDDDD@tnی"!A *Z(.횑?~U(#"9d'н}c}bkݷ\q`t[T\YcÈWHNIxO%`Z/j<`mu ;b-LJ?ctnEF ZU+"""""~ D$ʕ+Ӓ<|*Oqm>w<gha;{r+f8g WR[)έӴqrEDDDDEhբ|=[vN-6ԆΛ8vzGXT{!Ӥ65kV[,"""""nˋ:u&,5ẘobGwՃGJScT{2eʔl\"""""1""lL+N paGs$jJ\.HbT,[%JPD |}}T"""""%bDDnEreyΝ;˗INNfKXV|||M``X,<-bDD2rP`A ,lA DDDDDDDD& ĈM(#"""""""7Q FDDDDDDDo@D1""""""""bDDDDDDDD& ĈM(#"""""""7PN]%u9S|Ss{`?U3FҮS%22iU( 2 b/ 0yz2Ti_y(?^`R H=py{zcu1"""""(7sA{gE@=,㼒F+$;{?ޯN*],wk: !_0Y-pHoEUAI{6; 7=)7F.Ajj*vξH=?L% efL`rv FS (XZƈH׭5W^6m6͘R1K'bN|c"0Kri摘;dH"FDdo7aʓi`Ml\H4#ELF'f6&K'txɜ1""vީagW1{zb0ӉjHNŸiiq}(sgqjɔ1""nv0>11&O, .-j; *f8 H;{xzzREDDDD$bDD=*y0y;0{cƣ`E,!0Sq^MO+81؏V_ɔ1""b1a ;?L􀌿@^TLޞfp:fHM߱Pɔ1vGdžs.oL~^aʍ%8@^AcΓ /&?Lb۲uzCDDUTN}zΝݲ̊+iٲ~̝kQ/ԙ~>hٲ5 ,҇JD.,[֭Rfm^x#6|LRR7:uÀ8[={~S.T4͚`ΜyvO:v>M>ӭqٛ5kӠA>nK||<U9sLی㶭F3wCǎY6mڴc ,o٘8qQQS> !!!!k+;} *1ݻbc՘SNc^u@1v;^Wb0y:0'f_+f_y0zʚ<1+=O>IIKJE߽_gL0Bn=շ.R5O+Ww>ݻq&0xPsOOOjz2eJC%"r,1c쳭1c*M4fР!l[s1&LpEzz,\s̤GW;w-O:\Z|Uʕ+JBB 0u ؏ի5gѢ 2رz?z(={Z5k:m۶alٲ-eFx;v2zH&O .ҫWL{֭@B%V`-HA#ܹ!!!9W݋&Hgīx%fLVLV+&O3&/L^Vui=ӊ9(TEhh( 6zyw4h|_Vk(Q8{ce-}ݺuчJD.̚5];ӢEsøz*}65-]vKȝ;7#G?iǯF Yj5ŋ?@Ν(Z/_f/iL}i77[K wPxqz#GGWZwYH(֝}3p`΋3gΦRW}^9rKl=5jTsa+P&1m=ɔϜ9Cpp-qhܸ[ZjUYal6zEn=HIIɲV-5֭VN-8ŋ3- SJLq:ݻpbbb={.{ս(#" =0c8:lpbfN'8 q4 cA|)܂)ʕcԪ4_k)̙Ә8q<۽ktt We„qL9>JS2n>}fL> vΥK\bcsE/_ʘ1X`}WYv% 8_3ɛ7}vN!̚5qpa~2) gu?oYԩ]~:Ed4k֔~O;ֳl793ӗOhҤ5.;~ۊ~AΝ;w cƌYvsz0İ0RɩV2׃iv #)#% #͆ac`7c=(11if`۩Q+G˻i5k!! WȑiԨ)wqСC`4oޒ7Ұam fɒE}۲q&WSWDn]*Rtiʖ-KR/^$o޼}6m~2t`r)<}p;v4QQ%,(5 7ѣ;Çf3 Po޼)111L>ʕ+WQTIsՊkʊb7{aX]n̙3-ZЬY *ș34#}8E$Gh޼)&}DXX>X;v2g\`Ǖ+WXl9%J`8>p2֓ӧ`X2w$'g ))5w}ϠACX,ԪIJJ ii6Əgxۀ{e7BB (T@TV^TzA"E@ v@@IHH%=پ~Ybr͕3gʞݝyڵkIJJb„ddd+CK\˥2zddd2s4L& p\XV6}.2y_,^_bقIk4`4we@BNM|2779yp:TСCxOFĉ/3fLkמ|hq:-[m;X`.v]޽y:cem{qF/xyy7oG͡Cٸq&_⮻ bx~,]x_܆bHX,vm{QNNU9..eVxBo 1M=ի]^H F!(OŦU` \:-ZgE(_ rqe-( hCeŞ3$ƴmӦՅN`|}})_>>*sњ%(ILL43gNōb4Yh|ypxܹ=Le=oQEVU=\UbިF!n^/KHH~??_*T(ljLttG\rW*֔c̟'OK75d@VIrrJNLL4'OaҤ :-YoDDӧOK|ץ /SZUwŲTx3bvKl6Sb̘q<|?;vƎȑ#7EOrwpщPR%ƍo_9}NGXXˬw,ӦMYë^ϗR+MsbAUxѴiΜ\Zb%&.]:@pp0v[]bc9/e/$rp+J!q=q_Ӊ31ʼnj6{pepeLƕ3%l83pfJ•+35Ljk@B7`;r9jwFJJ SN'>,ǎgԫw ;8qӧ0jFblԨ!իW7FpQ7o&i:t0?{uӧO3mLS6'NO|*ΝKbϞ=}zzNdWG;vǧ㏗һm?to6m?\Lllw;k|Q c̘wXt_~,HJJĉL>$k) {?޽߱p"bcشsVZM~5M- q71b(?ྮU%n#..?qWVt9~ksI ito W8Ar8N`6ӣѨZ=ņjBͷ d(rZ9P󌸲` .ŚĔ僘;w3gG>`0hӦ5Z^~yf69sfXRԩ=} { Jՙ;wQQ=ԉ3fѬYS3̚5gqF̛7ǣF̳>;w>}BQOIff&5j`ƌDFVv1L̝3gCPU-3h@w?!??uֳnzml޼HMM%..cO<(̟4"#+3z(ڶ׽l͚59se+b'5iҘyg,QQTRIz5k0}T=jժ2md̙ҥ˩Xo/6Nlliieޛop8i֬ G*Vw \ϗ_'`W&y){ ShHڥ_|/ߡ:\TT9(@kјt(R^VV֫ihD1[cAюbp~(dעZtf=j5 5ۈj) X*iMtEڵ'?ߏ;p8W_JjUILmOU9q5jT`fB!Bu2|Lr8x{{BllfY ]!B!!D٤iپ N6cmvp8<&ӁtO.ˉrOiiKLK ]!B!MeS`` &ΝKfϞo٬h +O+ ѓso+W!BH FQFz:vC*_q '*9K&22իK !B! eU@?-[B!B#F!B!H F!B!H F!B!H F!B!H F!B!H F!B!H F!B!H F!B!H F!B!EڤB!4J|R#F!B!H F!B!H F!B!H F!B!H F!B!H F!B!H F!B!H F!B!H ֭'3gfB!B!D1:)'77>Jqs98\N'*( ZVFB!B\_XrE4E..οc%uOO8xF:tCz]˔+Wҷ]ʪUٵ  c< w#F?R~= Oxx%>t ۷`Ŷkزe/weeemXqϨC-Hr8]mr  /B!5ix7*Z1E(2"ij i>D17P{LV^h^pIMM'#**x-[}2e":ݟ]<ԓdggk6U-ooo9LsdRΤ]AgXmI)dddHŰ @{7$|Y9|ˡAU!B!b!vm|;e׮)nzΞ=˂ *@ݺuhܸȚ5w~wJ =z<ž={rDޕGJ>حF9~<@ՠQ4(JaeӉlZQO;2bkyU냏_B!鬷kסui[ngϞ E<ԓ$%zp@2+3#Z̙>vx{(:|}}602ehd-{{gOdeI !B!1aڵp͵f.l6sY4(IT]UUINN| 9XLLOr}^xZMDtd8$>!gY?I9^t~V?fcԫMO\pB!M1|,[w7eNNv&!>ݻԈaI ! ;=(b>ԅi~ʙLϮOfR}T B!BL~2'G}ܝG7nĖ-[DDD0f۔+WN T)V/Lz?џ3>>(ޭo@.t Qç@ZQ+ }ٰn3GKꅗI ]!B!ڮ]͐.w "##9t0k ^`.?+V|Lw}b}F %nd*nyN>L<3F1xsK8YBŅ|qԌr|y̌.mѣnm^{y4>ޜ,3p(> ܝ^ɯ~K:xP)BB[֯?1KwGRX<~Eaӻyٗ/q&7$ƔF>V^C *Fr|"֭㑿|%Y9r:uj~_[ٜOu[6yh4ɂߋ$fqe'!ބtҵ׬->]ki|}^]^Yb"JF1eۡCKwލo?ދU͖-[׃̚5WF ڴiȑOZjdeev:<VUC>6Vkq0gXN:,:wgi~hJuؒpVDŽqSy{[[oo*A΋';=T!$KE7}?֤8|g /^|e@+/N`ПY$%1fa5Њԫ~?\ۇo*:D'վ}vu:&MʕYf)))ҨQCΝCxx^ofZ֯@RR2>>>4ir 26L:AO?G(DC|YRq*F^:5#\i…|zďǠUm^$wگ?ϺIJ\P0vL.=Q‹#zN@NycϝcŇs8y7zwՒG~@`Z-U2KϤ ?CG̰~1_Keʂ ؽe#ٙT9{^_ !opl]{?_IA~>%#/{jZ׺sWw}@rszfjԩOXxeqﮢEDٲ~-ݬ]!CGdLի?GN9̘ ٰr xy8F~+#MYd4yU*Ԫ׀A}zp1\M'Iޚpmu+UIۯ@Sn}^{Ia_"B-*,Z(PU%%y@u8lV+>XΩSW^ڨ².ӝ!"2hy9ش=JZ#|{( 6DWAO;Sڱj58q6rsHJ bQp8rPUTq۹XvI8[ſu 'U~ǁ\..r8 ګWLVF:=$[ׯ⋭IKI;mWG{|IVF:GcSrvT.EĞ:쉣V56F?d._ę?]q_F:t~%shߏ&cO?c<B[|2= ob#cغa5' 8;7s պpѽ_`[C1_v;/#^^FǑCH?9S?5Tis߃[AZ]6 =5dR%ǽY-eƿE˶]3t gsGV‰?"^UA,7/FB~:*GSV2=>;ͽ̷aG)J܆fベ=`0>$V '>9YdgeVO& !Jxx~U0Prс .'ţ@̗ G-o;b { W?cG0t6WGq|x.hzԀ[dѲ<Э:w@ Ɋ0nEϻ_Sӻ ϙhhAs~e2dt27uWk.ֶ=$ѡs#v֩ߐ#dzqڼEz 7 fn⶞,ocZRo^ϕպ+?WINNL`X¡5 傂irwkz<-q<.-˭Va.(bF>Z[l䪃~<7;>[˲0Ұ]<ܻ I$%3еnb\.Ex+,26֮XDt4jd|0sNVcO{y{|ǝw(q5kvu [%77mY,ڵ / Xz﹧=/ g&ܴ~;2jhJp8xͷxAǟ"99̞R-sr^Oٳl߾ *wӦϙ8q :=E ?~,ii6 5g}ws֭CݺuhnzN19rE`wڱڬsظԩ{u[v:Z4lx;SL$00@ znH6B!qƲlGlc޾}fҏzmK/t$&&'xMe6Rt!ƍJaF|ADDuf$%%s#%KiCdde:w?…?>,۷o$ףF?3gΰw'$$PV Wgxyyѭ[2{K .mX4pcVU 43ރt)3!n0J~~>~DU쑮h=Gnnv{O5CF/ڵkK:- 11 Fju牊KדŢEа={Oghݺ-={bŊ\.f͚#IKK;[0ng^7o޵kO֬YChݺ-;w/vaȑi۶:<ʕyݱL>ӝOУ#juO<ћ{Q!ʸ`̙EXXXymk d2^Í"vFn|'<>.ա}%5O:ѣx_Zw+~k־}[;Nfff#""Y;Ϗf͚?ő#Gq\DGGҥ12}K Ĕ&e"hU{u렝:6)[ %Tp:lUfINFùsM>4kk֬)ZL4 ./H*rrIszI6n#o17G}ty+1l-[EK/0zH/xWiN6mZ'.˖gٵk>4&LԩS@a5a^%##ypa"A|^}u6孷3B|3Ѹk^JkXVl޽ѩӃ%ٴs\.;?tҺuk6l葾~F7+GVV6OfT^*<235 !!2 %6h|QvI׮=q:tލ1c1`@2,F^T>^+V jZ2w!nU?~ШM ?rަ:4 TVty{fFѠgdBբ3yc2yznݒŋjUa-J-x/O޽0^}u(SLAb0Eׅ"УG7ի@.YbJժUٿǏ`FI.'%%Q|y1:N]F9)B03fb5 :up8Xt9?uڙW^y!CjDdqqqoذ͛0qxw͘[<ҵZ-z):h4_0|//XRY#e/$S~Gjk9Y4[ڼ R /Qp6.7ߜE5KBŊaGF!<G[c6ѣU׸q#پ}'ݻwe׮ݘL4o~gvs}/blsUMSN},b`.qjw9qq,[ŋ},Xhb7]m!){Q*R7~}Ppf37jqif#GQ R7TQdeeb)/(vӡh!;;~l6Mh4a v2×z}} Z4ǐS dǎ]ǨQ#Xt{Zc6mZv_+U/}EYXϏ ?{uao!F vZtޕa^Kxч+@.F۰a;w5E;V*CᮻfK``TTLxx8g'&&^qT#<|?;v'Gu?$%%f͚ϳl =rR ![rrr2dﲋ =vcxߝ;wwOa-zu_rߑ7MsnwRjUʗ*13>}uP.}M6vVXdK$$$Lhh(Vظ2yJ @꽭(A`4/4B?];JIEyMya0(_~S؊w+FD&bnZ;Ц=4hА"5kcYIHHhGVT -h4ZtEj%$~is:tKh֬);7qq7Lx,_ ܹ֭$++ .|7hd%r-5kJDD8#G?cܸef: ÇIMMedgg%'B6mL&N ?6G{8s&;v1qd:wUU%K>{8vے'q]wRBeDRRgIJnlFH IDATV-o2) ǦMjj{(l*3p6m H#Fb;vG}埸+ Dzz:?~9ˤsUcj ݎժ\ˬ[i \jnth ~~P$%6 A(kqYrMKP]V FBBm64JaMFV- Ƹ\vڅ(TRooow5dEAA KV:tZ4m<Tf$'w475f6~3gDvm_գo>;VZ[oxQ̘;v`ݺODc֬L<_@ӧSۇ|-s\9Qޢ^Bqq:9ix,XȤIS̤BPuJ>O|7;D^^t®]_\-[e6FNDD;teXZUM̜9sYt9+Vٻ(ٖMH!KhHA\E) zAE:X@DHQ"F,&JQ ydɦp!5dLٙ3e}9SL[}H]w,3u˼N}Jva̘ZMl6gۛÝgǣ>g]Xry4yr>νw_|| 4Qv+(?6L.?OXE]H^F& NU|ai%j۾ʤ$nZz*pq1AHHÄb2>..@uԮ]j9T&&$wL7iB*^9 ewC6N5݈ b)͸qѼy3F~Js!BQ(AB-}5}<{#t򔩅_D?_ gaVlɾSWh}AߔQoZ[r4nX`D=}EUQKMM%## 7Bł^CQ͊?0gϝNxzzR3 ǯR3squ5r5*nTRYf{Ν;1x@4 ?ǏgB!y$#_E(pw0Pzn]9o9v\ݠpʷ;QC˱01-/啙( PuۧϠy]p ̖]Ȉsr:=r0Z1j Mq+i/);}?Fn]1ؗٳ裏9}4'Fйs'y/B!E1'bd"#awrT@@<`4nH,x9 diih&LF^e==)9 [cP4.AvFILB:53MTL8} Q zM4Mַ<̴>|O׷:uj"::4B!@bၘ\Wb}؊ wUQq?wf&ʚp8X-n]1 [&>l[Xʞ>@GF9y [F&O Ԯ^ߗ?`~i7_7긱7?Ϋף;և,Y@.b~7UZjO Euki29qڵ3.D@ժtA>aB!@b*L &'!MCNy/1ndtlYY76>8ǟ(" Nv~ ⯣@v-eQ.WQΜE9xΜE: (ƶoPφl43 9MZ ^ocxxc"gw<==1egsAZn!I!B H F1e{PUlجELf{MaAԪic(E妢/ۛ[,A>dU 4y^V(WGҺpA|Ԁ;@DGGĕث4mڌPΝ o/xٷ5)1)ԫW>￟ϷQѩ=I!B H F1 } }ISL?␿jznb6DECJ>wmS fq_DDDDF K4iS?{i ^+#B!@L٬O1w5(E>i_Gu3kj}ԯQf.)bᛯ&55Oz郮#+ !B!U@\ETSμ2+ kj cQf_=o:w/_O0B!B[*QnhR=w*snݺ8p]O矧f-Z#<6"+::Q|_A p˞>};+?}N=zi[ǎ]_l'F0tBCвe ,x*UpTZ'S!Db6yyŊSҥ3kf„ Î;Qرc'ӧOYԫWpE~=,\&G?T@DDk|BΝn&}~.P~!j@pp0{bڵLOWֆ'APP eذl¿~iРu g}  Խ@BB5|j:}N^k +V|L˖-e|> ʚ5̞=)S^%>>;KS̤}N\pypeϟ&'Ou7)):t2/]Kff&gϞ&ңG/{1s85k1jX#eĈtڝ!CaݺϤɔBTPoLJ.] ?9;ڵu)ҥ0bpgS@@sAvmֹhZjYZ5,y?hѷo_nV|˖put: }3ܩ,<;gΜ%11KSil6NAHHQ^W^yBRB1ByܦCiRuKxo!Ȉiξ([nciݻ̂͑8+Lc|Z&Oo⣏)S&3c4*W޽{7o6ݻ ݻ:wġCX,ukZ?x~;@֭quu%%%gy|2>yqM<|6|||8|S€5Y+>P!*p)cǎǧ:رXSӳF;A4oތ[3f(ouC24jX0>yfIGVVSyVVfJ ]V7225kֱr2vҥ0]1cuV]^H 8s, ,$22. &MXd\qgxU.rZV)n&5Jb'ޖjMV 6;w;O}\\;wbM^Gڵر$==Qzu.^`qn݊ҳgbb.oyIiӺN>Xh1=4&իW׷#iԨ115kC)Yt}p;˯ "JhM0|ƖIwwwTLTTub ׭oH=cǎӃsi;[o-d*.u/@zk!7 JDD$ ,QU.zus¤,8p!G2rqۖd{MUUY' N<;FWQZ;ԩ#}бc?opEb߾Vͦ~nщoq5jHLe|||LSn)x$˜<;k׮c.t؅Afhݺ׮ty Ѷmøx1 .8IMM_Ӷm^O޽زe_~=quu-^^^f+em0vީlǎ]ԩSǩqo~׭ WWW Ott4ժULJ&MY!{{!?9fQQQ|7EbЫWEpjw'=#,X6UV:M&+W~ߓAӦM7|]v[h4ҡC{F|o7n⣏>vpU+QE߾ʲ#hZi׮-Æ=(ΝcڴL>F(nC}፥XU5#T6-ӝrʴkזٳ1fSԯ_x֭L{8^'N&((iOs׿յloooGF W.Eƍشi3ͣTUe}c`._?Bhh('֭=c+x{W}\r_&M3}r" !DSuV9]ĉ/; [.k{:/2iҋ駫 gkL"nnn,YjХKgv_}5o9Jno30l{K7.**ű|JȑXl=ztٰsf͚؛L2߿_7H֮]ʕ'99gLJ^H 6̈́~vQ<%ɞ)ʵk,[fۙbaɒ=ԫWkN9q$3fL_2id>d9Fce˖[׿gƒĦM3i,y5|֬Y޽x|OǏ#, VlٲϢE ]Ztr"&';8I1դ _{U>dW%6**UMVLWmØ;w˖`ѢwСCuOCX؍C:CԫWQֵkgƎ믿IFF&ZGjb}v̙3WxTZ=3jt+^vNe$kr95,3gB&1ԩ/{K:U,+څ1ckh4HQ۾/!!4mڄ,6lp qg(xzzҺu+LβZ~%K>``ʔtLDD$׮ŗ~l̞mo[w}v>83W^^(wa}M-)˝86}] 'Gqzݻw8=/ǥgX k|ZD&_I^_~emL~={&aamAG7?<3-ZK/Mq<޿cǎO7~ ҉ay`]^IV*D!BQjoR[̀/..t&LH5j {xk4EvzjSS3={~ ++Mܹh޼yj֬) U`\|ŗ\tiے Jʜ?Qu8,yqqJ*aϞeV}~gO{ǎg˗̸qYzHZEWU6 jy+B!Bs,#vcjժEff&ӑի/2o|Z ]v)պ.]ĻϓOre(.ѷ)NsC{vxh̄{ gѢ<8t:Gl6;\] o {n<キ.'(^v5Z4TB!D$sm߾}C~}ׯGzz:6|^@Lbb"SJ<))NeO?=iԧ ޤqF9:٬?~~L W}MIIF )LYh1G]Ïtős ?-[XV1ͥnB%*`o=xK=!B!JF1wPYdyf|ϟ+Lߟ_|֭ɓ'y䑇eӧOl6󂣗{^G͚ǁf6nX@LDD$)))ԩSzuʞ=?вe ~W̙n0x ytq!B!VT1Cƍ3Qv7Z̚5E0sk z ?ycǎ9_I``@WJ222K| 7o4>ᄪwB{*}MX,EQص;9MB!3 `- W'7L'OZHYEmAɈ͂W>%^&$$D*N!B!4RפIU+ĩ/(BZ!L4A*N!B!iG& !BCEl$1B!B!eD1B!B!eD1B!B!eD1B!B!eDlf*흉aT ˘aM d{t|/Wl/ECF#)ZhRIB!B E1͌>f?.~NfqhAL)bJe&q;f^Pu.JUk6J cB!bnx:c+%՗MZTNq[X.T{,r0Kf*1UE1HE !B!* #vVfU ckuRS늒$Sź9)e)'uͶׄ)ŜQtYMRIB!B E2bn#VosuzWb(t{vKi399X2ͶjY2.B!"bnu֥rC%d"(&{TM{T5M>X2f)R~kJ F!B!Ie@b|2 `d=QSP]ج(V36w[ŔZMJ جnFvv6Q1YZdjdYoʩ N#6G`\\\h$P!BQ4 ĔU$#'~3jhx4Qu.w3dŜat̜&;U늪ug=6gddr?t48F):W{1KFXV\Os̵kfe`$ۦbQAVQPjjUL5 n^X Ri㻴"((V+'B!‰bʀ5d%IEvnN1'XU@ ZR5i#`JGչm)W6;tTŔcǙwBfbNN"ӪRE=ՍUuo{`%dTgrz&W3MMf :ƩrL "'B!A1e@$SNwUTYC9 T r4oK:YɨZ{֒|&e2ߘI_cl)YT|:ſkU|1T6TVڃ2#Yw"MS >Y1B!B Ĕ+D.sAոd"#Ɣj.\k(rwl4r-ئGdĔ3V#ǎ1'ɞXRH dNuO3T\ :LGNCM7=14ēqL?džIbbfT:p.ڣB!BH ,ZWLiTz:> T:ҘR^.wٗ)ӞQd%Y/*8JidXU&6&I6ۘx8/"I1[1ht&LfǥdzGOfKfnURꆆJB!Bdղӻ*P( f$bTTKN;w^K}clW+wMRSSpA"Z`MO#dcB#{xB=w\dVEA (\TX{>ZWeZl$%]=IrB!B Ĕ MuK`bbo%+.`01ItTE_.\۬d{Lc7*'V+NaKfRI5YMs21BJ6u *ZMQU*c?Ʀ3AU/-|q7MV:q"'B!bʂM1E]AтtTmw;#&#`W<) ѣOFLZZk_VL5[b1z_43-il6PKx(\ϴ=ͷ5vF>=GjjB!BTk%;OQd4B)洜UhK7_NW.\[SiFWn:lD\`l餛lMqQQKyT\ܝ>?wBt~TZ}#Fҥ˽ՇYwʕ+oߩmٴi3CM?;N7b?"ױr姴o߉G9-{ر ez;v#Gӭ[yQvf3-ދ^ARR X,LyǸqϑqㇹK<@?bcc+9/u/q1k6ؤYBa zW%^. tFй bΰT\Ԝ%CɈIb2xdXXW: j)omQQTp8^϶aQ]'";;۽mW͊˘?.׮3v8ʬi߾ѥZ~zt~ÃqQˏ=F˖-餿z!(RSSyg1mTn'ᄏ@m0֬gڵذac㧟syl6nW_fc۶ ]fŊٴ3֯_SO=ҥپV.\_s{Xj%Æ=¬Ys_\f9t0o1%K%!! ^*4 k$%%a/u4gO׮0[nsZٳxtڝ|#G2p͌nb8uH_O`gp#u7))#hIOOg7ի=zbėx1wI߾p&LW \!n~K~}:wķnG|vgNXVEׯ߀]t*rt>c{n|ٷo][lW Ca0Z}p]͆ k$&&p"WaF&Mg{2it؞m6n*֯_ +W~Xf5`ʔW#f:F~ݻ'3nsa͚OyWåޢE3Eԩ?8|(uҲe WΑ# ѣGN:K/M!""Er21v8犈v Xc\yg !ŋTZ9sӧO ʊ85׷ba/i߾]~=O?]sύ/vWҸqCZnUm8?rg6lyb(jVI&+^FT @)tڵ3+W.s:uQQ݋={~ttlx!L&ݺuụj8qnnnG9deevz&ODǎcذGxթX,4 j0Pzq&((I&ř3gܧDӦM П wyj_ 00͛1qb;4kԩ_m{r{րsb7iذLժUcϞd֬ԫWZB>}={{B0,\*U*[o0~Ӭ_E…+vtԑ 9ϥKl޼Ǖxh޼[nwmu:e-5h7]s/鞻R?xzz8kZz=.Yh4:Faԗٶm3o1͛h42p` }K 驰hh)@1㒓6wV~}(l[4)y<*qJF͈YnMNlӠ(<ZէH> UEzVNÒ.ti?MIȶзr Z9ڟ0S_8eoEzu6V+Gg͚4+V|]tsOGvMa4frdfڿ DDDhK}~F(W^qʞ@˹sh֬^m0~m?r1ǗmXG fذG(YsʍGAAxx 4㯿7q!_"|.n݊Qz-桇C=z/Pm{Y~W I\ LJ'66̛SJe (m_L͚59xP򘘘B̜3gcǎӃsi;[o-d*9/u/@&aM$S؅F 1t#cDcJp#[4ѦT㚕|#KH[~j5nD#o4y"{gp]>̂N5yu kX5=#)Oif8w{6!lN|Uj#™,,VUP)TۜLxx}CB݋{?IK^RJ8n_p ?ީϘtN8Izu ݎ5,t$]vSV#X#ž W'O8|sgڴWn7LLeNkӱc:v AC0 ##>}8oٶ+:vBZZZA޽{e6r+={ >mص{;vQN:ŋ\pQʯw4.̺uʀZjФIc"""+9/u/$#س6" 1ndh]znLv}XdYRe>dP(fŜ|\I$^O@z 'C0;}*W3gZHȲm!d#l%˪jѹ;R   ZŞ2|ih-5Rc[j+WLvm={cŤI/ޝDϞ=xט4EXj K΅>Gdd$k׮w|'>>dΞ=[l6?Խ@Lb4qb5\-YP@1z-Y:"EX*ԡURn49+GZ8`1w RNS~bk(U4 hrk2h8|%Mpkx)̗gWgR2U\TkxAUgY-& f4Gk'Xz-WTmڴbʔ jҫ,[޽{yƌy 77Wxcׯ_'887ޘH8[B H'T ("EEb)gE@(EAzQ,T)Iҳ>Kl y;wfw3g=WǻcOٴi+W.+dɒL Ӧ}7,%$ cƼرopzO?gu(=1Fᣏ0cg ̚5#O@hqFɔFZ59s:^9K΄x-[FJ|٧7RI!Ù6cfESOHĻx7r\k׮&$QQQz=e˖X.Jٲeߟ!3*W,Z6 Z&v|??IQvNJ`on)_?fΜ…)ZGNo8s&˗c~:1cb;_.3.cp:[LW~ :޽`ok^^(`{ g0-#}~Luw<hNa\u'5-o815{ 'ux)pW"NC6+V{L*URͱ,~FM$<ߜ[IKVlwM N"w| K_3X}0t U 2bYH׍NUPi֣Ch8"@j"c#KnbfXڵnm;egv;:uS6B!`0kڑ_XuPYe~;D1yvuH\#&ebIzdwNk}s ˢI&Ѥ%x֋HثhV Ucˉ+fFz3IV&4,AB>$VgPT($[9CZѲYS_==ymY4+ź<_HϨE^KF|gp sWsZxdFkkEB!ّ1yDyM:2om3zQnFMJK}@bMAs.ӁbMW MJt9$Tݵ@\>QH^|&Eb??r̨0j4$XXmNv]jsjqhR:}o/|!D L/B!@Lޙj\G7Jl^^( _(r vg7LeјP 8 Gyb4kW3~ BWI7UwV>|ʔGK24 JhV: J*x2ST| ͚ݳB!隔TJZ_*\]Uj|P)7^ϒӧPؘ]9)S*ϲ(iqTJkOϵk_kD"Fzv{yTTB&֞L`(Ġ¼ڠ(6( @ՉJZݨ$+cK&TeLMhRbyx&Muu:իW#,,?9l ګ8^!X5F@0o(椬)kB!BMCD5}n3e bܨbIF{g[ŚvCJn8eq:*j @t?xTm`J,B!bJTD {zr܊`͹ lxr͝9 U϶,K<461?ĬIPB!BI &:/46 ĸoحlz^'G-%Kƽ-ݾT'}G')4t*bj6B/&i,Ւ(!B!@1yJ:I~Ӳ$uUu(7J֛]Ɓݕ_L$[Z`qEc1T&ƒ^ XD6\B!B|O1yZZTNZ8W=/AUudK2hYֻq F7epT#ݓ tlˢ1yt= 錒W!B!@L*`s%f#W;l_:<7ƭ .fuORUUg[j[ y')0djQPU B!BkcZ FOQzPbT]߀GHla/fB{gPֈ#muORi.7MeѤ\2“AXQurh4+B!Bcc92~_IzPlY}#9{.oN{,a-W+ub (Q 㩵~ vdLQl)h.<$}pOӎfM Nv'B!$TJZ<~[Fa+Z>}NkWl&EQ 잎=2NBo}nF;p_; VDֻ'YLَ*t5|u xt?R)N"!B!D&@^ߊ%)K^k'UgB!BI &hWwO!!=v_"ߖQtv~haXSoM_4k }vLVaּ#f?"&"sNb!1ѓ).8eIi>W~>PDc@J F!BI &:o,=nmM0Z6=/ﶱ_lc+Ŝny{5ߟ 6{tXS:r+OhVn6_q(xvI=:zp:QYGֈ|[|uQR,qՉ.CX !B!7TA޲%7V>'q;{PBe.\kF%B Z)ҹ!`8??9yp0}.ld]^(Dѻy g(>]iR9 KNY׹=<5gۂ%cLAjϱ܎.J'|q?=׮u'׷bN~XrUgbٰ8N'EAѠjtzlSB!BM orh-`+R_`8kvw|]mj@= SݗŚ:\T͵B5a x`/^{JsPUރ#, mp^ˢ5b x%R #CO裶cG@\W3vʘףK?>j;^^zb meܶ= tY^Fo-}_cWФHMy T'tl[$jsh 5|Cp8p8 FV+tB!BI N u5X+ПS7nuFnn- E?>puM,ui ʲӿb$>fwR2vq!4l (sb-X<#(,ǩjY1ZWCP}=5KJ aV.(6{(,eOV1WfJZ\:096͂`[ ;q X>JO%hsCWFEOZ!B @m &99uGʉV_NB!ȏv!D~v׃0ju&.B!$#ȇ҇+%O>B!Bba̙KO0w<ۧB!$!D*VY{f3˗ZJ aF{&MӺu;ƏKsҼy+4hDxƴo߉>Dt !D>w>~0M}{ϳYٛ-[xFFӦ-HNNvleּPu2yV gϞs.:txnz\wMSiҤ9=z<s\vEmۑݟ6={m/rVG^4k֒~e֟s\d21qd4hĆ ŋڴ'Ln{VZhK F! v[^v z>Cڷoܹshܸ! ̣W?;~x,K7˛7o%%%kuY|)˗/et:ynv;S|Ę1oQtkƏ@Ν?.ݺuaҤٱ,^pyfۛiӮ+*T(OfM5rLO>ٝcke^x%=FZ5%$%KtR󃉉Xbr !lӦ-hтer9V^3`W$ IS9x5k -ܹ4=4ȑ9~7n_>lٲӾ[h1z!u֡~h̪ IDATFxXj5ݻw2Ve{wޢU69rjժ:̙3,Z4_~+r\vݺ jՒ=_=?e8r(k֬Q˞?ҥKC ?k9Xk 2x@v}PRRR⋯hڴDz[D>OӥKgC3;wh$#}ӛUV3f[v<#ӠA}6m_h׮`o|l^}u?رosJ<Ҁի]o,Y7߸'$$0x+ʂ)cYh?6nDjh(W1xJ*_O>"*,Fdzg^ƌKYt1#G̼y X{ѣߤS,]Qhwb愄FzkɪU+?m._~zB=}!Ν;>}P_@.iӦ=7NZ_N~ҪUΉ'sիt:ر)))'Pd W ѴiS~a_#C^ye$:]vcZcbb Nt:ڷoG˖-OA^+V|OٲeyWЦM{"# - @m]x۶lٲyKnrr2V|֛8>t&Æ g޼9hZ3| <… 7KK@)&&$)Z{^z=`0`\?1oa0QUWu0ye2xqjԨ1-((;vZ9r>}X&cN{w>-7pflٲ4k֔>}AMs]}!O֭Âs9s&Ek)`&[L;w?Qh4={&%JZ8 ̲e+xrIKKs2~ef36 __Wv dtҙ-[#46Ӳe  ?2p |,*UxO…Yf-o5 si>t&j{xՑ\t!C?G֏k}2xŋcwjݺ^w^L)?3aaaLa#![eNS7 ĀW~X}@Ln_VnԩA^}شi A裏i֭ïn?bɒ9_1kl̙MPP;vlπftGˋ/i(lf:Ju xUԩ5( ?cǎs.~y3f|5kܰ^owBP\9ʕ+GDD-ڶȑ#G\! ,HXXG7`J("TPA-¤p*WsܯdEooot???r.k]/qԩVKj:vlF}fzGŋXlo5枝ʗ_FllЕ8<Em2c,f̘{عs+V|1 .a> 9bCO=WpeULxwFj՚?3SBbx cضmk~u;[L@@Ǎ|||</^~z`-;<ǵ<6={… >>>DFu*Y.]*WAJ*r,EŊڵcܬ\!Ο8ƴ4P?CJׯ~:jՏݾB&ƍ2}Qv;ʕ8Ν;`Ԯ˱\t#߇yhyN^l޼cƍ)W!!{\۷YvC7U/AQfjy\A3ov{B>ƍ݇###^ &88躁`ذ]ooo .(^ƍw'O'QlYΜrt:V%/@Bnժ mt`޼g޼y=vY`` &jj;ΎK/FV-֨QL6m[{|/_aÆs!.]ڵILL$,,pN: @.Opi>x:ƽLIu/^䣏>!*,ǎg̘V3e\=1vxc /^r_{+odR?`˖Ʋ{^2erU}! .̔)8}4vfĈQ)FAT|s'Nd 6P~5Tuٲei_SQQg52d;|w}~gWի\I{3y~EqYDLL 111Vu6ФI󎷈!!5k&Ӧ}J~b0h֬)Æ qׯDŽ 3g.SN'88РA}&LxǴi3(P-[p]v2/CLi߾{U"?xҨQC^|qG ooofi>eᨪJF0lP:}w3g~λGbbUVg^t(l6JCϞ=-[1s,.\LѢE=uw2ԩ[DܺuXn%KCi&sdwǗ_~ԩӉBxf }ٳRp6D9r8Oj1b0\rQ~}PO>F||"PUabcg^.'.'Z!BtMB;FݓN(y7&>惡syf:uH$ !BqIB&KKKsp, !B!kB޷4jB!BI Foռ-QB!$#ȷZ-w%( yF!B!!DV{%!B!H'!Dj##F%B!"[sB\`b\wx F`B!%!@ヷ76 ݎt>콢(h4Z-:^W !B!Bl(``0He!B!#B!BG$#B!BGk]b2駟ٳg/'O"!!@*T(O:uhѢ9>>>Y>ԩ|={>M``g>`@Zx]0` :wD.e˖3{YjJN8[ooE帝_~Wr|||V*}tZS!B!b0w-o#999K.q%~wΝGOhnqRDD?͆^ܹsr 11("""0 4mڄ O%4i4Uނ Ѵi . ,boٳ=Ojj*6ldȐa|G/_?w?t&))):MשB!BI1wPRR'Nf}TVG}jժR+W8to~'9sb߾;v;h[իWtrQW(^8)))|[Ԕ)矷вe ^|q0ZUUYl9WH||ׇvYfÇiҤ1=7/'N`֟xhٲE:b֬>|@F 4ywwܔU!B!ăEApf͚Av~aCLh߾C Va۩S6f <<AKŁݯ8x5_0@ĉԨQ#yE駟BsUVØ;Kڵk--_='OdŊeWwp8lJxxVɓ'eV֬Y瞿p"/_/㫯Z;Ȉ(V(}6|SiӦ57bݺi,ψ(Yf` ;w7| UUs]V!B!isMyBBcƼʼn'<9~8Ǐg˖L!!!|٧ڵktl6Ο&))5kB||<j~[ DFFѦM{i/'Oj*(UVBoXV!B! %v2e^tiׯǫahZW=ZԮjm ӵmݢ(U-B b]\p-[kٳg/:… L>sqQ{o"_ (P>̑#G1LYӡC{.]̌q9N8\!W&o !B!ȧk ,,+x {KJ0͹r7EAQt::| !B!<]Bݎl&6ı#6._R58U-Vh5NP$xyya28~ 1lHK%ZܽfvDZ]K ·9bbc: (\B!BSNDM01f 6TDQU IDATӉ$РUUO Nyh[)/SA1y{RH^2_QU;K0/  B!b !A8Ki<^}Pbb3ZIHs:?W\HH+>\q8XUhE тF\75CCB!BH N9R AV+V+O36Xq( W Fu|t2NFSyE @tVLV;F_m9ckXS/B!D>&# i o`0*b{ncوg666T aC[8J+WW NSU1R|T) *éq|ճ(U )fә!p֪ .ӠAÇ`ut㞜ӧOӠA#Snk;/\wWҭ[nj˖OgM'~XMOѤIso~KˬX==zIw&1st9򵫣Fzڼy+ _# fٲ8N&L(ZhtMZ͊AOAKtY*$b$8Qח"Ӳ*kB7h( ch7&^NnJ`u(YF@`iIjUV\BUtލ-['Xn==T)lذ!C^m)ƞ={Yn5jT֭?ѧtҙVx[n=))ɼ8z=e˖a̘7xi۷ .. d oz|rǟ/*,7nbX1ɓ'бc~,;wJ\UPKh45/u/Ebl DBp6SmD9r vحT (3cUBW 6Ǎv8UhV)E9aPUMvGڸq3;wI 2:wu^}XGսOgX{:tx&MeĈQ\i4iΠA/r,رw{M[Э[O,Ynnޭ[t6Ѿ}'7oȑ㞗 VXh ?? rfͦ]4mڂ'zBqF~>}zyLs8(榖tc___4ٌ8tv}"D;wi&zz޽=+P\Y֮]1nv::tht7صk7=cZV-8v8._dIw ~zv ȑ8N0aaaDFFpb||}K i#8_`/cB $Tf'8@RwarՅ?ܳ6 ) M)U[<} F*E@mWD_mkR]QABBBHB6\29,333;33̓3=ggv'̦e^R{HzecKsGSȭ'K0rIc9I8SpGCCO~;C}^w1}ܾ9ڶ-qtpۧz@ccQvG/ޭ|ӒgλW!wk{}LmzɧtӖ-7uPwܩX,nɞG۶}Oi?xxC7x| 7;WvGn:utuz'O~\}}}zԢEu=^W|v=:{\wyjKRҗR4)LJ֛)^}>\3qmt|!]M<4;)?e];wkߡuk7jҥ 3/P%6Loqk%˲Jl*%CN6%ǶضްOMg嘦I7!G/ub4sW Ei۔ 9š~G;ܒh~4R6-yn0eO#d|Kڟ ۔ddN,]o?eɶm-[n[?tvHW]u̝8zۮyv?7۶5J]ڽ{9ZW/L? .ب/{{2e$i˖vV_X/Te+wk$?Ba|~ٶˮ bn>k%MqB)r:uԔ۽^hsG>?i fa&11XІR܆nG:ΨamcIKv6-ٖBn>DFrydgR2&Bץc=gDv2WDO3W-!me'×!JVZv6=V:,ROO\.s]]],Kx\@侹n]]V<|Kڼ:9眂z|)=S FL&'ޞzl֪U} M to7?ɯCJZn]A6#1l'>7JӺ[Kή/ /?Q<\gk P<R~ .sݠcկ7 fŊw鮻>h49<|>Q,V:ɤ~ߔ5:=(T}z~}ߔ?~~XPsڞ  `2GGIy"ml,*c)cZܵDǢ9 ۖcu:;c[:6зzdɐːS;~i[Qː!C{I*XzDD'~gYb)/)l?ujLekttTTZLfʾtZX\h:ƔZ۲٬ D"DZ,Kiꦛnކ)&cԩSx^i)-H(L<ה{͑HJј2L5|_zהϣZʘ˗kr\ں^]yTl]hWPWwwהcqR)E"䒋u뭷Omv]V:~hgP(;y˶-}3׿U=s/ _kiŸׅȘio3rUjԧ'vi]OV޴j.[J̢OHDzi4.^IYIVIv}'ߔ9%/a!&aAIgr.4 ibғC^(!de8{b1"ɤՑ71oϭDZV@"6(vM>vX&R4)b` y Wp{8 I3 NGGcI1XS]?+C~ 1X)&j8֞)p1Xz%4 ۩t4A tF!3;khDh,qRH*3e4S{^1"A[ڶg2ХWvGdit@ĠL&5J]O$VSǭU~x8hhRtz);KmP(4ɱxRYۮTJAO fI'ihljan"mJd,˖3I0rrxz2͹ʎFe'rYIY3ý n@@f8,W8L6A ʑxBIwy-#O`^J3J&Je8lV6Un+? 3kRʞ<); GN6#k,#k씬@P%Kd|4MbV`*ۘ\mj02_,R,TNNz rѨ2ܱq_~Y+SA['4҈9b)=:![é4 y#Ljd$2&_:HDdsxiR0-Qf`@vQYb6tF?0i'땤ǥ4KX`~Fjl(*opɓ"i%5LĠmL&1 5 Ig bnFHz0%ͪߊFىhhR}blKJR y"cr)h[d!LN<o0%/-k331hI=nnef><)p$aTUH^1hOe)ј,qȴ .b A F,N[AHj#:jXf/vk(-b1*1T[9[ffb6 u< ꛷e0j~ǥ$=b~LCVGiӍc&.LixB,VR_éB~K#I@I&k:D}jǎ:r$O7Mު':PĠ-dm[iKS>P`$LgVL14 Ŷzk{L~߿_۶m-lElۖi@Ȉ{>}}3M|EoVxGro:OJ|Wk~p2T%0w5RGcBA[$m1}R"g?97' C<ԡCJÛM$MhU8PuC^2&RD"{8}|;q?͓֭sVWWWUk_s} [7ǵ"Eƿlww+(sr.h]A[8O* CW]=b'SUA=. Ų?D qml?]k=mzsoWg&eu[kUWr$ʱ,y/W4Z]M+- M9Ohu׾V6o.8Ϻc}+ǘv"A[_(rixs؎dJ' y[ eWUe|0l9̅C@@ϧĞ=:)'3߃7ݤ#dR>̉9Ò/WWHR/O)ѻ:F}T~gҡk-g2şyF/?^_hٍ76$hBu%/'=6*Cɴn܆QaqDReT<Ԩ~?%IW^)=zh{f[kܿ_/\sCCJ-R%IK"wҾw1##!IzӛS3ؽ[GQଳ [x֮]R{iyW,}믗56=oyCC޶M/n$BA['J|X6+kIu5uk$MGF{FKz=+VL):Rr;!Ls#-/kۊ3ꘘ#4 nejx<ooۭdF+\0ꑲr _%r0pOcF&%YcczfÆR+s _?|\t.rCv]z DlGe_N&xd zLERVuMr>(o&`\}8{^J|g!ir>av2oN 'o9fNPtbW64C'_/i7ܠe78y;~#-/꜐k|5uQ9.F,a rN?Moնm۫^9) iӦ>phE!~_'IܰA]t8,%_|QNY%}Q9%3$I[+#C`PoI3Pbc_ ~:+}䈬S s5Miܜ1hvC ꜀ǥ '= \L}x<Յ ݺ-S]y[Lknl94Za%_|fa/Y]o~dʜ8O|BU70둔W7ym-ҪO}J'%TeiW2%,zg?+ٶx\_<˖-w[gA_:g̠ʉxJA[ &}x/RqEG?znWxdP([n^o9嶧G{nrʼW*Wk`[[R3%>&w_u֮˿GbG׎|3#e0=bFLӔUʞ ]zsھ{ڱcL̉ק .بM'4˜& b `[]z|CH:@[U1եz=7j Q R-,kM[&!Kƒ5u,R5y'ډ멩WLwdfh>Ms깺dǞe˪f5iR95Ę`U_%(|\. 8G̱xRa> ܆!ÑY 46&٠ hUzF=hp51+Վe:+\Ǭa[#iz\.áY;^8jX}f!Nk3vk73O*KgeD<ݻ[{}'UǬa[C m+ 68`Ps[5PhkVYA+1 >dyfhTO Ӝa1"7 CA[cIyI+Al[;9O;1AO" 65iVpXf l0!BuhSsN5z)')}{yQ?İR5Q=")KOh]W..+&mYe3"w5H6 9c ᦆ<%Kz,Ę&M-0GL H[x9mXܥף_mHރ:wIW_aGGb1ݳk޸b.S!%b'e3}zgH=;<ʛmAIDAT[:x^t7|8Ҕ/><+V0X!\NOq3=pP\ta$gu l_Ck 13 c♬s@;O +q[YI<zzd۶2,++˲L,a\.S.[[^W?]JV4*;HfŔbpe2ṜiV2卢mF6C ,oJrܹ/FL2#S 1 'eѫ{uzgHa(iYvM:BۑaqRu8c1=;<*ۑB~m?Y=]:9~~vRswku84墦-[qKCdJOWV|CU;&߱xJƢy?N jjGb ]f|َʐ_.]$ԡhL>e蒕KMS6#V>My y7fOܜ[{[s8%›zmXЎAL[ Ɯ_f%"yؐkuBP9KNn۸WgvwNgwv9 <94kk>ڡzD;ΨsB{~vmXܥ[3xa9~Ѻ C;zEy h}!񜫩ALVJ5ALqB3MF1abӶm3=0O04x.QaS&T a&i>IuTVW0oyN&c5ͶZ5tH\͔Y Ùn?v7vPd2lgT5ĿdI5#Wj522s̝={JÌTc&*sXlxx5smb~4>?5s̛Sm#TV|Ql۶dxopp!+$hy%4WLYoG px0{ C~o!iZ.ԮIS.b=??w[jFSjf3.7N5e/m͚>-9/|?oذU7ꗬl9FjߡI+X/7O/^ti14O2ۻUW/]R@h ڥJ1+й[jz?wvvWE*F 'T)p,[Mxf{280X s m0\mNey~Q!:<0\R 2ZU{F 7L7Rq(|UaZ!0{:ɘL5ktC*3i5nj*U_O764FYji4qjW8׋ӠsotLip%4u8s}Z)hVcTQΨq5YƔ*W͊JFjate:͇, Nqj<^-O[0Mרl=0d]z{ֵjx`4q_~4S=SgFh h7",4fv S1yiPZ[pLF aK/8""""""R.g.nw8]noc}&?MNSna2)1uem[Kk-,AzS 911,(&LN gDDDDDD8ݫ!4nv5aLq nu} &!e s;*`.zj%L?WF[s+K~ǞQ"""""""%I^[d7VB2%:).!k es `T ?ݎr범[hJ:cChP!Ln` ,l[[nByi 9rZƔ &cs]]˺+V.Ua^vaJ^<<歄1tS!L^ÕksSA tVer Q "K N0O?Hcepܞ)N6KVSrYL΁]ܩP(C%ɩ!W]\W^s1gs;@&MwES0lglcaYcdmS]XUsم.)W~Ø{").!!2F2Iy\_$,/Nvp&} 3-TcS;C"rUcy1EDDDDDDFY% 7ϋΑ3")9#]YMXo(0Ʀ x0IdߔͲYOVEDDDDDDJ*s.jᒌuxuؑƐaYCr b z0ۼ^(F/FRcFM'uj2 ѠEػv:666"""""E#0gRR;vxddҺ/ﲔSbpΟUS9C6E+Q.09uʮŊ[xzVPrSRRIII$%%lK";70L6`ccslN^z̩"""$R?3ցL`&79])sW1yc.g%)1a aؤIJz4))@JJ^M"%;h4booGLjȒ1-n9eSh &cS&05oOαqD~)0"""""wl&))Rvvv+TX64Vr5c6,IQALAɮK180CԲe&ztt!%LBB&+Vzq}9ANWFJߜC`ȥzS[i cf^N!LZW$yL11z%Ĉ/L6u+VT&4ty U26SBX\[i UAL%ܜos>tppW]DAH񓘘!W\:UBRNCa)T}b(: Y{N2iݑݽBE''Gbcj)qq88O*[li2>}sc.(Ԗ6'c-n*I*U7))ɘWHHJJ&!!ĤKչ~v@^ 8w@V;ǘC DDDDDDDP||<P2_8c;V$C˥/{a&RRR )B)))$''֮] 뚔qלs u$b \V YfMPޮsRR~tL&accјzb&))a>pttl lR|%A{s@f5ƶJ||^a"""""""0NNN888d9h4`ggNN}ˁLrrF} )/ɘ soΐ t61y\Y3&QݒDDDDDDD|;88`OT bcc)ɹ+H>KWP6? %Ӄ hK`6j{S)\\\n܀ NNl`lVY' ۊA6X0´ƈ1 zHTðaCiݺ剈>/@""""Rb9::|899b1Yc&Fٵ)1¦39u_k#"QcW1YRz5}tK|̸DDDDDd`8p;ߍs;/!K^ &v٪dM IٲeټyմxYx ^wK5n쎮Q1q$''tZsBg<3<ԓokG]\rݻjZLL,fΜOعs6H DW0Dddd~4\?Ay2JQV屲ÀZsB>@9?CF=oƏdƌԩ?Hxx8Gc֬9 2~mh]ٳfZhΒ%hٲ6H zjt+Bvj[ >7Pr%`|o¦M=c,˗/˦MسgnUwZJzu-yg ~˴ ~nUfי5k&{qFՃ˿gzM.77W{o_-|7V#lll3%֮{wnݟdu`cZ`_r,jU6mZk=ƍ*իt)SqXM6Ɔc8z6g̘~)M_رw/<3g`Ϟb2:vloUXؾ} +0 Gd]|jԨi=6o|rպVHIbkkS4n܈O?Kٲe)[ |2Mp̙۪6%q[iB2KԮ]ŋΎ}c6ڵ M6pߏbӦt؞_!))_F:ȑfڶmCfM>i?۷7vvv"!!G}ޚl *ǀ[сŋj*:uZlgFs.^|q#G ""?XK:uxGps+ϫrss $$$rRT)Jr$&&VODziMٓ8;;;HHH`ҫWnܸ;i֬):5k0nxf͚I޽o 6WR\9}}X ܹsn݊ovƍ{^zp~7իː!O /}v3IJJ毿TRtڅ Х˃Yʕ+nQFL˻2k}z3 z>Ϯ]ƬXG}>ΠAӧ:t8IItҙ3g0~+ny䑇-W[7uS$߿/eʔ/>i®ΨQ_Z)y9&_c-a KxWx1ֹ}b (cPS|QZ53fZz4ozݿ_k\ZuӷoO_E@mƖ-[_WuӦMk4hݳg/TTW.HkצiÃ>d)裃Z*6cUWU֯H4h :uȑ޽5k~Rݻ5jлwO9m^z`0ۇlֆ[n]vYf[M۱cW^Q~qe<==hܸڵUδzٹ||믿ܹ?t% ;vbJw325ko?", ;wk2=*U*Z(11E^T+™3gX7(WՋ`%a}ï~{;СuԦgχի;v`Ҥ7wФ;jҾe<)6+(މ;oya>dռڿ+gϞ塇S~=ڴiEǎ<1 z$ֻlrQy)֯h9b^_OmZZrr2G#::#GhbΟh_i>k<~3݋ о};t̰aCի/'OgϾ<@4iBiժ%#GZǬ>w.8z)QRR9\qsse޼x[ƄO0zX^ ϱbV-4BxrEo0lʖ-k / Νعst؁J*QtiFz/m۩Y.\ ((ʕ+3vش_ ));wq1֭[Onfͯn:T\u6XZTHI]W7U'Nd-_FˬYSV\r%:(rŐM3fog_ԫ-[͛7]??o;K.Ѹq#F~ }{Sw-_ލ1c^}v+W0g=}a  s! R6|PظqaҤ ڵwޙXy=ӯ_ lݺٳZތyձmgggΝ;/gʟnP#GOw'111ܹs?… 1q'덈m̭ZgMV8;総_޽~|bj׮ũSI^tYo"rW(W{ѷ9e?aŊLe-/ӃK.z/|g_Kmmm;v Ý˗X͛o)ĉر=...9sŋcٲڗ^zSB̙%$<}f74pA>S4vvvh닧W^e͚̞=#:DDJdi]Ю^j0=7eʔa=$ 97tn0n^ƜE`c?7(1yi\WWW.ڵkqIz;t888hqqqDF\^ bWˑH1V%p {oLSG88)J%K{c(DD-<<R/g0""""R$''u/*Fa|ХX5%EʊHIhꉎAlllqJDKz"""""""RR̸86 f -k FXDDDDDDDXll, 899y߸8KRbbQX#""""""R kkk FcixJ$/nLW]DDDDDDDH dcmBbV-"""""""RyFa6) bDDDDDDDD" FDDDDDDD F[Jt1""""""""En bJFDDDDDDDŒZĈ1""""""""EDAHQ#"""""""RDĈ1""""""""EDAHQ#"""""""RDĈ1""""""""EDAHQ#"""""""RDl D^^xr?%%Wٷo״DD%?Ftt4kAhذ9fx""66`vc޳gʔ)Ï?l6s  rƍ|^z/kx{{QNmJ.M\\<ϟ' {`H}W3uÜ={V!w{RTT$AAA\rwww:ud҆`ᄄ'>>w;;;FVWR:iݺ5Kpj֬IΝ1wHPP!!qvvmָj"FDIaaWسg/:uB xxxNr IDATݺu 8L͚58z(ǏQ`kkCXƍx{{S~=Jt>>ԯ_GG#~i_^*DTTҥмy3<==ʕu֎ĉ>}ƍQn]ԩJޗ`QFThPoycKsR2~~v$$$`ggGժU2qssiӦ-[h sL&}BCCq>>>DDw>ZhNٲep";v$%%{5kF a69{ ))nՕѰa}֯HWLݺuhܸ1ĉ9>/Wr+爈p#^{Ak uP:u$00wwwٲek9liذI:_yffio?i\*p>J8{^VM7k׮Ihh(Q4hPuruN ӓ.]RuVL&N8;OOOZjEbbGٙ;bcc' 6$>>`2С=&uMh%pw/O˖-DDp1ϳDC>CXRrm~&||-'F2t '''=Fbbm۶\r2rZ˻ӵkÉJ*TZvQJΜ9Khh(իWEz 5jT̙$$$pFnnnxxxp\[xx.)9Kj|AEL6={#18;;sqnFd<)"FDIժU#)) *T@||aaaxxpSjٲ9Il۶$/vͥK|9ʕ+H>lKLL QQ7hӦ5IgiJ#ٸqlmSߚt2gάSBB)))ۗ}v^7n`6ߛem^:vv2aIvW'QQQ]55\2v3ѿ?||?@\\,۷l2у˗/総*UЮ][\\qqqݝ0ً`woWV޽~uڶ͗`$$$5jAXX剈skմ%1w*)իWv]\֭ۊݱno]2&&RJѧOoGZgggg6m}))jժEJJ2aaa۷$˼fGHLLyGRV.\`i.ZLk?~`ڵ fs Oa==zrRf j֬Ibb"ĉi"֭[Ӻu,wBB͓dHNNif(/*._#11.bccKHHH_xxf,[ӺL7qqI73)I?XիW)_|! FD~ٳe>/fbcc)U[[[-_(bbb-W(S TPUpI"#(S,۶}d"::NMddF8RRR3DD9U+WŅ2eS,ŋTP޽{yˊ'O|.oOP^]4Oxx85jh4oc-.. .RR%.\@\\7nDժUIHH///b***f"wZn-NNΜ9s&Sk?jƍ(_~K3"w2)9KIQbb4nܘ=3\8/! FDD 8hWr^b^?RRR e׮]ԯ_իɾ}#44ݻwS^]իGTT۶mԁ8@Z5iԨ7n`\AL&*Uj*\ξ}놈=0#..SNq!KWw;5J*} x9mFxzzdpp0*Uxj-4mڄuˡC;vC.O3/m~ۦ m2Сe R2iDʗwraaW1#֯ߠ#RDD\ &"""RPu{7_+Wjܦ2eʰ@39mOGfbZ)_Eut+! {y&LxMPDDDDrqqyfqu0"r[04mRØa05,_vHpZ5"""رc6ݿL&{E6۷@l~<<<ԩ""""" ((`m)js$''ӢEaisz[?H^=EDDDDDD!1wdb߾ݖ֖n??wA_a̝;={v?k9ry+Vߏ͛b2?kVjՒ~={vnݟvHkR!hܸYDӾ}[lmmٲe+Jb׹8oUn|xT^?[[[> K ^cʔw cLcƌcϞ+Wy0og3j|s)6mڬ/"""""" ՋM6Gxx8wɲ{Y~III?~ٳ0t/o8~8IIIlܸ^͓OR#gMw{S#""""""G bJ8''':ueCݬVŅ KWUPvMذa#+V,㣏f裏PT)#^ye,jܹsL={>?+V$<<_~ŋhg䁂wKO60qX3g2dxWU~ b PHy*W-, (""""""r1hʔr΅ӴEDDDDDDr;P!M6?~mS6wH}TDĵLkL2߿1$g dmNwtn>香vv"FDDDDDDD()" bDDDDDDDD1iveN_&N|;;;m)pRDi̟ ]vL59ի˨Q/$"""""F-bDeoo…[0tО coo_l'fͯڑ"o?Ά s!~tEX/oի-Ӻu+V\Α#پ}+cǎd2PT)g믫r1s Ox.^,Z5ص˗ ^7c///V\NPqlڴi}e\]]=c؋s΢| 6uCY:t+g;yfgܸIٳ{''"Zdժ8w^ٖurrbƌ :΀,SB֬ݻ3eVouڂ{ʔ7ؽ{;aΜeYݻK'ovNJĈ}`|:v+Wxw([,;vʕ+tء؇1""տ_zk2fͥo X 2io0` VXٳ޽[i~-m۶3` M{'ΨQGϞ}21oޔ+W-rb(O>9,h䣏f0{'?Ao> bDD\3tSjBCC6)}Jaܕxb0K,?ė_~źuyၖ2/8Yftt̙3W^zɜ9pI.ARˤpI?[4_|u>|.\7l޼SѧOo˘mz`Q̙I1y${/VB^^^4k֔'wg4l*D߿/}_V@k|}}8p@uGFFf.]="222Ӽ0Μ9gغuӧ޽{b4ڋ/w;ΩSYb%_}U4z`/ygILLaV% d ǒ%K9~|n{Hmҿ_^{m~~8rGL͚5lG8v^^^4,[\;AAHѱҴi/6wB```0V5 쏯f~̪L5Xk޽;wqvvζζmp>|8~Z*d" K/M8zkn=bРYW  }{ݻ?ʕ?[M[~#-[%!! sɌFxP֯ߐc99K **j@~|xF?38~~rIII$$$XKah߾մ5kAYM>#.!u qS^]8p,XPoʟ9sÇ[]֭[ԩcAA4j7&((j|xLvر΅ С=ӧz5ua̫;v <$SN{,\ư7e~䡇z1eT~zۇ_H}8w??2<3L2=zj/|iZ;^D_vrJ*tڅ-[ש^r #Odd2h֬)cƼ5k֤[?=/{n$s|B&-7o>.kݽ<˗ӧo <3ool"hќ>DŽ z*[n_>VࡇbժՖύ!C3u4t2kx{{YNt֓쁫+SN)PfM\!;wyFƌyj,pw/ϋ/gxgϞooʕlٲL6sDK.\ELc (?"uV͇ɓ'rυĸٳgPjLP^̚5͛a\|Y]nsCj 3gfWkIp)n݄ }4YK9ԩS8tMŊ9?>ݻPtiseV9Yzk*sBo8qe—^zK`ٲ;–-[:]FxRqvv'a6_Ν;[8ƽʖ-[ 9ϒ%߱lُ~aI1\lʿnL_Gxh~L&;vF)޽GbŊeڵo.=ljlٷo? ,_S,C… LNСƌG&Ӳe z1_|o92}_ѣ}v;w=̖- eŊ\7ԑԩͅ X+Zn]ǠSN!""Q^䣏f2bL_'Lx7qP@O4MgϞݻ-[2i,˾:>GlMNN槟~Դi-ݠ3grgݺ~:~y{iS?11[,ի<0ڷ̜9KRl{''Lbcl%oҮ]'^xa4C!&&6S /stj'뇣\v&MPF Zjaŋ8իWT)G|}[M-4KX?GU`֖Xٹs7UTz?Ԫɿ=ǎLL&sΎ_d5o칸|L&Ν w??ky'v@y|g9ʪzLJ3V]FR_{Y͏ 88 X4iҘ{M?*n]:thϦMҷo֮XZZ5i׮-ժPjU<==Մ[dvNN lսs.f̘ Abc̙376l@޽޽g͍%Kk~qf{%KѿÄ]*`B~76lq/ȗ_~m?/5jT'00'xk׮eY~ƌؼy+z5^{U~ODGGʱVC`֖7nq~x |ŗdz| ƌǍ7[є-[&2ezTs=ˀп_^ye=;D-bD䞒Ǜ7g_ /1`̜9|oYLX5j`iY5JWh]W?L>->؃Q^ҎL}w*cĈ3%%%ФI ڷL׮ #22 .湞'Ǐ?gsN4nȪK/b=߿_;a3f͚,]۷YVX/탽=ݺ=U,{i̚1 ?ZUBB׮]gV?s)od|(W3~ڵݻ9w.#Tʕ+:?,gڴ;vL^x[QtizɲeٷDH̙3߿#T)Gz{m("""񶚞ܹsU&΄ h׮-:s9B[gϞT>m]+ovIי1Cxb ,,+s-[ưaCѣ7113v쫔//B [lJ w IDAT "66vZMӧ7많p8ӥ05kJll,NLBBB"..J*jTIH1c^G<Գ\oaР!44̣>† B>k5-11lbŊ ПO?L;禬>ʖ-Kj_׭+fi|w|<<==Yu{^zpuvc7hLLܹ&M9s\J*4k֔#GpN8ͩ?n7/2NNNdm]Eٓ>8e~d<\@#22 ggB۶ҧOoiZǷ~lj'^IJJԨQ}woK5ULi:uȶm۳}gAtt ˗ˋK.2&EKsagg=LF"Rd$'H|| nUBB/0rC\OfsU^}u,}͍-[ ocbbż;$''si|+&M`A@ ^p֭TViӦ7n9Ӧ͍78s,aGX<~b>ho4oތi㧟~$"< ƍ{z`bgؽ{'OƍCݻ}+\xw}RÃW^K``wq=_M9:dG2r:&QFTIRF$3"uPث2/JG'~>Gu_u}]׭2V\rӧFzcggzr̉$.\LILreY•={+YΝ'"" O ]6ܾ}MMMt-[Ɏ[xQifϞɦMi^%M__իW`nn6mmmNc=c5{%%%mP^]LL̀;Xt s:qʖ)S&eO>.]`G L||W/o2c=#$$)r9r4#G`4>}(e̚57̟D\سg/..05Y`ѯJyvvl߾C6%!b̘3{Lлl݅ B޼y  ޽E常kT^ző#~̛7_͟?=ztcary,3ll!>>87ӧ$%%1bhv̙L>>9\[ٳgOkkkQTIeuI23~~iݺ'O#,-ԽT&O455dܸ $'g|:svIJkر@^|>>}z_i>x6lrcummmri"ď(菶Ny2-OǙe˦c?%6ẙ Bo4Ȓf͚ҳgo !%w\x2Ho tI9tII?|!EdhjjJFs%ce5#G7o^|}w]&@0B!ϟu`nO!AH =bIFZ `Xr5O>ɓXAHF!Çl >>>TB0W3߿kRjܲU?"***.J5I!BIB1BgB!"I &---!dB!BoF1hhHu!B!B|;rBBY!B!v$#B!BH F!B!;@B!B!w)Umiiiѿ_ZlXObbTB!B@̷\MMRNm%ĘRJ2m= RIB!B!OD1߈6ӨYnnjԨ4q0f,j׮|~5W\cUp! 1d ʗ/GBB"\FllRV:߿/Ŋŋb۶E2l`ʗ/G\\'YփW^P`A LժUHL|˩SXĕ7oPj,-`hhHTT4>>ޒaE={mRRR>|!B!G"-bP}1a6SjԨƸqNdd$?Piӿ,jjj,Xϟ+i-Z4#((3~?~|Đ!ñ>f9IMa?0 W嘚cΝ Ù:Վ%Kbo?MYT`nnɨQc)\0}grcՇٳеkի,t[76N>UB!B1Y(Çe'O2fx4iD\F9tiٲ9W!GFSSSJ+WٵkĤ'O>ceJL6oHJ| صk2_xx8vv/t؞{xB֎m6S>aa)Xv3&M&!!O|ԩv|R2OҥvJZTT4>Ȩ4/_L#nBISUTf*y(PaaٰaGi&\|7o ٳX}9aaa= [PJگ>o;TVU%OŊ[wPH=P^q[12*ӧؽ{3g:zwO >e˖ CܺuM63adΟ?O۶my T)?{v~WRRR>Y_"99w!B!7}a(ׇ{e`P|HZr/Ȩ4%KQ9s(Ν:XYYoq9I͛7Μ9<#%%SN+iaaaeBx1 dDD,mty 6tފ+r~aÆrڵk̓u+cǎ0pR׵kbǎ\vѮ]ۏu gΜS妷aqΜ9I"W&c|`4j֬\мy3, Ld'߿ɓm>:ɓ8y?xNv-#|p}oߟ~i<_ZKNNf*˽;Y@*'u(t555֮D]]Y_>T\3""R/oӦ6ԫH*H,_ghӦJ^^ܹsG%]]]S|Uŋƚ5L0eގoqw!>?ZRXLYZZ`nޏiӦz2aunݞǏ82dp0e$Vҭq*&&=\SSSiӦҩS] pBݻwc$%%e؇{d:O.݉FSSJ*`Gtt4[nnumdTkWl ƍ\q_|IvЎ~ZD߾f,_uuup=zSnRB10ck;;ԭ[˗*Ν;g2Vr~^F..]"88X*C &&[n П(|||Uҍ)etҙ7o)X޽Gܺk*AX[ObƌYڪ,̑C#2|HNa&*S,_CtԁNa#8AӦM2\m AzJYTd ڵH˖-;[6mZh΁U4O|Y{@^=ٵ߾}ݯ4{UK ɛ7o~CBBT"TRJ0kkzqs[qoz4B|{NZNeY&[.L4֭AFȐ҂EPjM\\\9Ӂ2eȗOoo/ݻGǎ]07x⸹Tsc=Gժ5X\1Դ5C]]+GѺu;va>fԪU>}ӢEknݺ cƌo_3lmhժ-6ma4hP-Ze6UsNNΌ7/#)WSNɓӨQCFNZ5ԧU\#G*W&ӴiK֭`ge̮ .\.]co?555V\FR%17sn<} oo/tuueIPWgK3b0._}UJW ~S^Kgq?M͚5X̅ &s??;ݍLCCVZc>V/nᅲe6hњ|z6mڜ靽!887n̙X ',!6yq7CRp7))$IHW>b-J> CWRRKLMJJچ3x0LM{z c!~Bٳݝ{Q{Z[tbaԱF!26yDdϞ/:unݺ=}Tsdd$9r|r;w^e˗/ b JǏO%ut)Y9r|RٳgƍSiAн AAA{_ߝر9sVutt2|sΫ~#G2|PrAF ?lF8rr3)) #ԯ_% )V  [lJ*+VTܹss1~%Ed9]t"GxymTI2e2;w(wg,--ԩ#ƽxT|Vqww~aL6l1:thϾ}c/T̙#Kb kז?h}̘={111$o.73iD/^Jrr2=Xb!**550443|ՇNvtT[!ܹ;:u`Q1n_SRB1BNO +r^4WךZ,}qY/+)K?I!))Imy3hN<;-5Ϟ=GMhҤ1je_`}D|<}zҰaC9™3g)T aNWϜiI7v{,rܹC~?x$[nJzS6M2رƍj=.] 6ҳgWy C IDATi ':Sl+!Xlmm.O<ѣ*9rҕ4hP/ü2tj`4[6mL||yw޽XYg.)]z/_bhX\VW/,<_[OqdEDEE1gl6mIZ5ظOoK IIuGc"ƭ&`5=ßaQ$&e޽}J*W^ʹv-5RD ] z7oPHÕW"fS޽[阙?ZOHHqqqT^Mejժ~F#Gh޼u  <9sSJnݺbo?W}J|zGK ȟ.s]'OR?~33SNOJvm(Q#̛7Wi!uo|R*Wƍa W *(;PSScAxzn ::ZeڴiO׵kA\t;)>V@ٲb+۶͛V^ֵə[nb+s5;wceV MkQ,-S37`j7nݺѣ~[Fڵ([w.aq6lRo0޽EԮ] Ⲙ;wB8t0ڝƍѢEOQP!P>5kى{~ŊU4mڄ#STIӿ_/vRxz+]?~Wd ,-`m=R@~tuuP7o5)D99lj4U1g0a8\\3gNUԩgY&&fXC||<q?ꚴ`"_ag7ؾ}'=z,ӧOc-hiiq3'66u쁅 Ìϟ۷0|(?Z qu],>̤ISqu޼ĉrq4448rDQVVCprrdϞ]=͛/\"}jH!L(Y$qp!"? ļ~Mo,$:)>sq uu8BƎJǏY7*B|3ÇCvl޼} BtMDj_`??c]B!?k<5) |IbbT?}k$ !B!ď@n۷oB[[lٲFZC!BRR2KF!B?O1 B!B!5I!B!;@B!B!w"!B!BD1B!B!߉bB!B! !B!B|'B!B!N$#B!BH F!B!;@B!B!w"!B!BD1B!B!߉bB!B! !B!B|'._>_!ďC[[I&pt O2qxbB!YNS@3u ͚5U \ 4x$!B!D1n>|ȼU2jѲ\\sypŋPhQYB|BlXjJŋ4l؀+\ɖ-5cϞ]"_Ĥ'GCӦM2iذ'OPc$+k.nJ0Tɓ'O.tҥs\|ŋLߵk!!73}ȑCVg7odfM?X[ORuОrUO.>v5g(b d\aC IڵTI{ݺ̱cG8{ڵرc+׮]}ksƚӧ ƍ2?xȑ#02*kkks>Z™3'x,'OY•Fҥ˘>}:uҥKѨQCVpea2FѩSNfҤ)ܼyM꺄={s54556m*:uڵ .2-kdŽܼ/6xТE+bcX555,,̄ ps[I.IIIaĈdϮ65MӦMx捬$&Uɿ:C6U˓;wCg8:%0uq9a *Tg1i|_w…IJJRIWWWظGtҝh455TvDGGuoZFFYv5˖`ܸ ԬYgq_,ZE0aϟ?ܼׯyVDGG-\0Æ Nmۚ)S&ӿ@Fɍ78pOM;:΢| 27L2 7tfLJJJoQV=׌W.\£G#з9/_4O*XKǎq իׄ6;v͛GV˜L>pQT)<$#O ݻ;wBP]vkQd ڵH˖-LW[[nݺ`i9/0q5'hԨyWF&-9v0FFy}28|662H",Yӧc {tttkb={C3`@4iL=OOw.\8CBd!sU @qu];w05GDD|԰\~_ߝ4j@%OIp?ʶcs}/ڵKlϴfcc˪UU444HII|ffxQyҥ;NVRRRR.^&$$(y^z2}={/<$'Nѧ)]&08&&*yJ*^ȹs5ˁ\r}zrZhN޼yy3Xf,<=݁ Cׯ_e߾*#uʞ=03ɓ'}m2r \FbbmҶms .\'_lݺ=zL 6d. 13o߾|Tٽ{Jڞ={PW0QQӸq CBBT"TRJ0kk!@T*WNճ{Qpa>}k׆˗/Ӷm8^^ݸ&&f :b,]XU&sٹӇ.]z0w33Yo?gOSFM2F,X,w|'bccܹ hQ} ⲈЪU;ku0onN.=9ӑ޽Ma3a4k֒'OȆ(>j̘Q4jW<~ 8/y81cƌU9r8}?뻛UVP@jsjlڴVbkkG}T7u:thiݺ=aaaXYYdXѺu;vaԭ[GVB=22J\hQ5kʉJCIII_W.~:v@9{ L:~ ]]]q  ulA,ps[].>$,ZUk̙)c@|zx{{q=:v삹ŋmJ>M͚5X̅ &s?r.-ѪU+vةnm=Md:,pxqe 2lن-Z'Ol6>chheV%gڵQhjjҰatYm rJ8˗I ?Zfׯ2F|z4k֌M|t^ 4O&<(/'O - Xb,CWW)S&?c?y''gvGn̘11cFqu< A;w``1} xymɑ KtMBi/ Ƥϊ`LΜ94MMMnv>hNxx8s8)iOȑT^scee[=zĘ1/ݹs'3#pa7޽.\o݄A*?pzzyɖ-G ^xAv~ټy+۶mW89sff;qq7oB`IgҥVdѣٛv믿rYVΝ>XZZйs'ΝEb Fرghj̆ faas`ѢXuu zɠAC TH*WN[uOXB?F. %J,4(]+&MfΞ=gyݺuE[[M6ta.\|w̩]7oԴ7?~Q>@Z5c=vy_r66*]bv;;޾}KɖMR//va:Oe-[1jT̽{IIIİjv6%nn* q7n$''κu]h <W͛7XZZiڶt{_h]Ο@Ϟ=X`1=ztƍ*;q]@H---<<<9r7ZD~%GA剌jǥܰa#6lTN:]s̙!?@\ܛL[%%%|HllޛE4cbbL׮ܿQ(w>}2OٲsEHݻOre9w<˗cu*yTP5kpDEE88ؑ?~ͶN 0---^? IB[nXZV /[l̝*T//OrKq~~_S111ΐ;wO>D C,-ҹsw:uѣcܸ \~C~ %jsK,%%%ׯ_3RC]fӧg5;}'6H[ދÇҰa}jԨ.._EJJ cN\ԭ[-3fHzit+vɠAgÆ/_eVr *(Pk׮kGTs/SveTWO-#o?tԕķ*i!v/_=z/7GYdoOS?ر㕴3gβyF 0WiYرctus~L?R>Qti6lHϞ=^Ms)Zl]gδeƛ]vs=\\ۤ[n*GdJ`>yd6޻w+pE"Y7W^K ܰI>'w {ș3gɓ'Y~43fH9x;vleŊU={Gr*5u4!X.N$-"**9sfӴiKjժƽ`/1bп5Fӧϸ{ \~Uxq_. ԩZʀP7nܤhѢ|([_<~ez.!99e̙S"9Mll,KaȐAxx@ ]]]J(kwqٶm;vvxxg2 (2Ν>lٜm[ř3giݺu~..ʾ-Ҿ} 7o\KSv-V\"!!ATLǎnv%K +_Z*U #JZܿҸq#>|( L#ZlNhh(+V`jvZT\wwظݻwpԯ_)S&l,FBBS1^^.ڒ% xΘ1#ٰay UHƱv:f̘Nƍ(Vg|'Sz.̬7z_FbooڵæMOA-ZaÆPby͵k4&M_Ν;6?ݻ1j桮QiJ 13X"s8_D@޽jժbccMʕT"'O^lw6mZQPA֭󐕒 /.\;;[ SBy\]pE`JZwT''gnݺ)Ν'""kvQiMJvm(Q#̛7Wmjjj :O DGGk:̜9hJ.M͙? ?c<{C'> uȨ4f͠\z{37EPBhQ}j֬SΉ+VѴiFNR%16N}YE F[nSzUVpf-;VVcƍ?9[l89A-[===2}Bݗ}h]vރ"j׮E qqY̝;!:t8e,YKX[OÇ(]]]*T(і4ۓۤ{0?k?wϿ#"cnnɄ cټً9 SN3qd Ą x%ټy2"07رٰΜ9o߾ 61cFѧ)d޼={Gǹ 6… |||~Nĉ 2IMxxL# d„l&11ɤ~0?USS=x2Oky}oݺ_~+ {ɩ)։b̛@o%,<1s^Jr2bb)666/% #Bn=zR~=ڵ(BQɓG?t> `x湒9O tR)=<#/mRIdӧBϛĩLIz-I!o-{ʔ)ôi1fX||vHPo1b9Zrr2}`߉Cdd-G^BV۷sbƍB7Bs^EB!1B!B!╒DB!B!D6DB!B!D6DB!B!D6,_6VB]A0%B!BEZļhj<͐$Q#R!B!A$2iK1#B!9$b^j4r!B!D&AIZ!njB!BdL1B!B!D1B!B!D1B!B!D1B!B!D1B!B!D1B!B!D1B!B!D+!BE1>WT!B!K!!HEQ,,_$v1c$!#B!$#ȱE1&WEƺ85&PEB@^Q_񑙨u$pB!BMƈBH:>Ң["9ĝ$dDQ廸wky˗#,,ܹsT>aah4 |m'|}wcmmq 40:3fx=Sv|!'n*O}˕+Wfe;wC0x Z𬭭1ÇriVXJŊ2\n< ر#iլY5kVr){"`ʔL0x/u! /gÇС>}?Ҽɩ;wn#$$]"YXX>#Gr)/ҥK177gԨ ɣLvvv~&<(eӋP>k<.\f߾t%޾};IHH[l^/3ߪ:?yԨQ=M]VLX| 666iJ$00"E ˁ !,, fXG0h >+ZJu%B7(}L҇ߣ+\ &N8XR}PkPPPb}1)f2vjkrdϞ f۶$&&;~ T!-Zts,}-=z˗KN9rZ93dɼON2dmڴ͛,]8$HNN6)XK.&44g63dZ-c3|JSLE渻u\~+\D֭[S'rj7oŲe˙0a<_}U/zxAݏm;r-kk+c Sg՗N',\8?Ӯʭ[@Tմm&8;~F4iҌ3f1p`ڴqyo‰#򚁓SK6oފLTy?*TGQ~#GP4u{Qgܾwu6bL67ocQ/^,z] ..m9>KS@$bͧWԬ=6v$] q(z!Wa z ļ'O2uzXfl!mvOɅ ٹs NgĈфg^_MNO/YC>||i[lZrߦqɴn~$ Fŋٷo?zsNϟ_6;,)SMg^iŊioիŋɓTlٲŋpE,Y֭>Jw游89OС?Hi5ТnnÌuGr2m5baaN_)S6vvӥ<~W^%,,+i֬+}Yd۶pRݻЪs)\0W^MH%Jp\0ϟD$$$r>cnԩ^ٳxxx#^1BR%H~=,QꋢTqzhY .A;G (%塨H.( pw3)Paai7o/!!A,_bŞ"^_~T-BXX( gǎmfUfgڵ V^n2eJhС y1Nյ֭"44HGJl߾ 6m@ڟ`+<:faV>;vOOҍK+nD #8 -^.D0fxjRk|dRѣXVQQwV&.]2 0Ҟ+GŋfZR8r$Фɓ(B͚˷vbɒE;wӾ}gWec3~lmm3g}ʙ3'h+GhhǏaɒE@Jk޽{뻛 ||д7&W}s;ύ7/9uIy`` }I [z[say:ujsUΝ;gC3|?k׮OSشisLN{zՈXw2Fw… \ j*j>(]ݻw}IDDDIBf=6$be0x\7I*cӡ$=ft'gcF֌i2Nnc U~I'Om18:Vei ݻ/mڴ֖_.?Х+5j|BPYΝmlݸ׌? Q&<3/a2q&Ш7ܹ?Xc|gҮ]T*͚gԨQS'eXdTX РAc%q4 իD߾M~!ݻחy +++J*X6ey矇g2~zTT ڨ(ʖ-cRV|9pp(յӧϤZ̚͸qcP<Yj9W\ysgtFɒ%3Sf ̙Ő!ٳg/ߟ͛lﯿ tOk5%KdRgE1)888߸qM6j[-Xv} 1"׼=z HiQp4t%JZڵ?3>?g5YuԦcNL+F;i"s6N>KxNxe}j,_ɓ'5C_Ճ_\ׯ޽{QLi,--ڵ  dǎ{I!6 TPSHC.周c7Sbc$``_}LLL$))4]t ٳ8{6Zj'O1u)ͼ!.e͚u\~,Y:u… W\sV&.]??bbbLǬY<י3gK.ey1+7n_'rU;ΠAik+vC\\nb|'r|QfJ ?ݻwG0hΜ9=;ek ?~V'ӴZ-?~aĈQܹX_iܸq:ujcaaΝ)-g̘E;@DDk֬;|oPN<ŬY3(PVVVt=^+VbѢx_}?rʔ)hN"::$ 3m~OЮ`ڴiMZפKP)Ν;͟7w ogqƌϏ?Q,+W.3iћzqwA_гg:uH||V00d:ٵk;AA':t0#G&*^1B(XڂHR+$d$9z{ŀRW;&}޽Z擺/*Tĉ&1[IժU䓏9z0ǎر#޽Je+dddMm2~a*Vyqلqu @tt4*$bbbC(мyKHR?qZ͚5œ9pqiKn=h̛nOtЙ%KhB0-:]r3z' =Yz 7oHb]eM+&&xʕ9vhMSV֯_É'ٶmIݻV[rg!$$$/ʗ/Ox{d˖(Psu/G\\~aL:dÕ֭[1t;-Z0x0ѷo,?~we%8,ϓ'I1=Vu딤Jm6\pNҬY 7nJn=hذ3fxe[5 3fxann=f8<=r`ǏO~\rΝ;fҥKڕGТ{BJsJiN}V5=iժ 3gf|VB QtX4 hr;p3! a77kGQTEQ}XdTw^gv>3`͚u̘1+MNfYGK_^f 7!DNGhBC/pp Gr Ȳe+5X?0(ԩS;]Ȯ_7 <=zrH vvvׇe9hʕXn=aC8>4Gn}]vRw)W˖]6TǏHu~NgNN8DÆ_ѽ{/q<2Mpf͚F!22ΝEQg‚ӻw?c`"##Yh!/!666y[[[ vZq3]F:yMŹvZ}NFEz_D|vl޼%ׯ0~^r#غuEΖn$cxP#mt0V?~"Z)wꙀt/%Bʼn0>(]:.e$onn?Arr27oBѴibb]r9j08o޼.]gvqYn=R̙V oi..ˬYڵ7.U `ǎ+WZťw ss4jjV 31 '-8Hٲe)_,O|8z'%%_i߾:cvKϽ{ַoo7nw֭̓VVV,_$MKJ*r _׵ųjJ(Addfn:GF5{'{\yC%!JB47|mM(ӨQCN>Cs179s&m[Sj4Dgf?Ih8@ժUhn˗S=WbffƐ!n.] ddRݻ'\vmgвK]Ǭ3b;˖>?SLgGw"}6c Ǐs%ck ' >=\ٴi3rǯݻ0qx&NBxeJ(P|}q]?۶zZ&LG*UӧI7ExelʬY=ړ8̥Ka$PfVZ[Q? *5* ү_\BXX+o. Џ#GVI$\ #077gHHHH`Ɍ} IDAT+ѱC OweʔGZl 7(PyY.zEDDФI3Eҥ1:>a޼DGGSGˤ^1B&b<.ݹM$rƜ#l9,gI8nQ zhc orI0axða??||SJe~u5kֲuLx֮]:t8}_FqiFͪUS%о}G݇aZ8twʲE``_B%x?_"οuʕȕ+[n$))[1a$HǬY1Gw/Sf>xN#!!Cou!::m;0d Ғ/6m|}ȃME]ƅ eGӧ/?4qM&Niwwݝ;wi߾3#FyFٹs&LJ79o 6m`8Ou7N۸q3eÆ&޽'O`MDFF1w<߬q#0,~~CW,?4;ܽ{w5ss3ʖ-cRqqiK|HLZ-qsٟuR'N*XlI(<Ì1*|O?GVL/ӰacJ*Vn 6Yciigh߾sjIRn/O?॰|O(!^>23?NL"GefEQRnWKDy&:3s4%ӣ+ף] !%O<e`X]\e}̅B7=eʔK3fD!BHhC 0-b =Gߘ'=\0B!B}ɩ)WgD!5eIB5)5EQHNN`0[ŨT*j ffu$!B!D֤kB@* ssE!B=!B!B!!B!Bl"Def-AB!B!^#I䤍mWB!B!x]ĺ|$B!B!k"sAm_Y!B!B&rDe[l J B!BDZ$6̬e!B!5DLҚ2EsEƉB!B!^I*(IPG81B!B!k"¶JC Wx!B!$brʆ)I*'F!B!xA$>@qbB!B@19*W! I$bd'h%y&B!o;IV@ƉyZB!Bww"T{R ļ}0_y _ZdEQPE!B!x$.m <6ДqbޢWZ ї_CS$c^!^FI@B!/$brą|!H|dR&ļE]ExO\~hkCmWN)By)E 1^/B!Bk< OeSt'-:H+G=MF)] SΫ7d0[[Hց@ٯ_9V1 oyeʔfU;w۽Ҹve͚yYKjխ[?|}w֡C{|}ws)V\FiqrjΝ b׮8;xY2e"&gIwa_^͚5Xn5gյ,#uܑݻwΝ&Ӌ)rNnݪ WFuB0kRC 666?ņ k9{;wд7ֵa_ e)T[n"00Q~6ܒ͛7h}3jpQO ;;tjZgKLRJ@"e#H"FDLB(81oWCmDƒ+1C]C пHTȫce(Ȉ6olNr+A緟3O>*6TaPw:wcݧysgnޗj g+iiC27ZhEpp0K.@&SNb4oފe˖3axK[}`?hҤcPw ,YEr`M6g„Itޕ~.evڅA2gժUÇ0dpimb„ԮzSɟ?? O7Ԕ{Z>sſZ6m&7oޒ$bD <__/m drAQ&'aGiΡ"b^^gzr's]k$comO:X?ruKɠW*-ޞwׯ` Y?{۷pbcc_{|_BL4mڜ={~T ؟3g㳃pƎp~c=glٲŋpE,Y֭>ziOܹs .<5j;rq i)xy͠m.E '&OȥK?8x -u .LddW^5y|0݄Kܹik>L;wpU\&LDӦMP_eZ^=8x0o\|5kֱpLZ<7Yw~+γD={^ϥK(Y8Ǐeɒe^c)XZpmǏ 88>}Q\92Ps8<%J !!+WFDHQWĬ@4?Ǭ(Ĭz5&JK;.\D[e /JuTZsiEMQ 4oNU2h"pmK+cu.w7 lC+T$x٩iT[L2o(@XX(1?iN^hc3__۷xڍSlܸa5˗g2sٲeYNraƏ- ̙4mĸ}יÇ'OzO-Z8qN (V}}5hP;Ķm !ߝ;w{nܸfZٲe)X [l5)߲e_~ɹ4))ɤΣGǗϗoĒ%8w4}i<=})gΜAȗ/|q-:ǏaɒE@Jk޽{뻛 ||tpqiܹ֭#~aѢϖ}Y+V~/3gl7ФV`yVZڤ,66EyPDDD{Yv=-[6¤ٹ%7oYCӑ-woS6[ݺu_|O0eVd^|XXXXKpvnI̛@N"O_zsb:>3YgU &b6xs0vTw`4 z;rfxdX@ ?yDH܆cUaݶmЧO7wtڅQ}۷,y۷4ʹo߆իd.K}֭剘\raggǵkמ9(^xAٻw'k׮'**J$ا;Kp4)δ}|~_Z-˗` xy͐.Io ht@;hۀb{P;*јOљ.!ڊ.(qhr<[1?Ȧ JbLwPl| 7Q.!*3+ O,m pÝ7bWu 3WU/x^GU}:el'g1y ^u"+BdK (VZ'\ޒRh 7m$3xl ^8:DILL̴S ʊnݺҭ[w `ɒ*UraM:u֭[xz5ηo>|ZjrH ˖yf{:t;w=f@7cj7!ҤI֯ߐ};eShƅ2eJsE@ bkkÃi2'$< sss?Xh!Zobٲ8qU]Z^x~aĈQ&Ș1xxAQNm,,ٹ3ŌXx `͚u Џ?G1^O\\ ,̶1LMR4nQXYY=/y3-cƌԩiذ{n߾MÆ >7z>>;2L*]_j,YO?I~ɓPUXZZxٳx>5&AL\n{ѡCg>O$ؤܙ^+9^oյ+ iZ Iļԅ 0y-:%4[E 4υڦk~QW0q *}Y)j3T)VטQ%=( S\G[)B+~61! Cx$*:.3.P-P*?I){ Q|O˫ʴNNː*j3kUL^U@Nw|T#."Of[4!uc.ί Z| 4%7l=N+C=DYPOaf@눅 6, <CӀC}̈U2b&ͫ---L~ |Vʎ;vܤ,::pTy#G1 b$%%ӤISc.]g&oݺ)˗M'''sq*U.lQ&KeyKJ֭:ԝTPwDG0{"*ʴkLL }>Vڶm>mnR7u'fl'!!xV|9jҥKQxq (`ҵ&-bbbX݋8s&(:hѢ9mvѣGYs޼lڴ*Ug~XZZ Xb+V<G̙ rE3L^޽{Rl.] Cvܹ8q2ޱm 6YŽx>hee}٭Z93b;M|ͥKa;u7#o޴Iɓ'tRveִhHHHm!!O1@06CU] j[*wqcBGn>$,?0i CrLIrGID]ݏb+4eez᭲-:_ETO3JR,{3l^bG֠yC52=]EG7p{;5?q5PY_1\ٛ {HUʓp[^rJASk$>;prjF@!6ݟ~y8Oׯʕشi /_a֬io\,+S3:wNH͛;6{>ݻw{.AAgaҤ0 ?r-Z8e:۷ov2k7|ӄtͰz^ʏ?_72v!{=zDtt4J4I7ׯ(a]3֭͗_6Ӄݻ5=&׮]NҔ(Qy*EI~l8g<`u( iOycdí(O )*W14%[)=TjԥĄaud@R y$0A؍* }Cͫ a(Z506Oxe?~L"E8|z2sԯIY޼y)]4gϞ3~(O0U`h\UByke֖53q-w%"##i,Yf,wrjʁ݇M[Tǣj4<>Xn=<~9sfѼy+"#~W믍,Zbbx8ť3i4Ţg8qG;O?a 2?+o|o9zA5k;MZscϥ\p:ujst:NJ.?9͋=vɓ/~rvxVZ#QDDDp䩗:֓DB۷۶E$INB81$^K/tRbo$LBRi~ϳ<2[le֬I\\Cҥ0vޓ2ʔ)돴lr+7nPy4 IDATe;H"F  /#yF$^r8co;Ƌ T*,rcG Z>7aՃJjHRADZȔ_|t>|Hvc2Νoߙ#ټy#ܹ &(  dAGx^^Y9)47n[ t rjpswu1O? f~鎃wey!>?Kӯ@6mq nqfˆ M^ӽ{/&O֭by8:V|н{7C2l1խ[Wlmmԩ:vܹsRJ>[_Ϟ} ֭۬Xs( A)T /_mhqxңYnݻ~}݋ƌ<>>sҥҫt|(]vgذ!ʭ[M|677l2888<d„l&11Aˉu^xLǓO\sܦEi7 MǼFG`fqDc|OGqɨ4:Rj v'qtfфBuzp~zkQ!xɓ'~}:s%sRA*S){yF^o"%RP@ ײX`ʽO895e5rY!D6_]RHZ+Pk_Axx()-at )ɘW It:t:=gEѠhuL!B!r$^b%B%Z$[B!F-!B!B!B!B!&B!B!&B!B!&B!B!&B!B!&B!B!&B!B!&B!B!&B!B!&B!B!&B!B!&B!B!&B!B!&B!B!&B!B!&Bx 6ÇrAF!Bi%B oԯ_X֣+ѣ7$!B!K#-b9 5Iܿu0o79>NE!,, N#;}vݻ lHz_S-wSl޼oiS3vFHHvmٹſO"7oO' AVԬL2 ƿn:;g09ٳXJ.eRU+gB֭ t5ҥKӠAtu57αn I(۷ LlCN6mJ3f߿4l&MJn=7ojjj4iҘuhђߗ+WMs:tƍXxѨQC I^eÆۡ)?u6{J߾SoUUqt\e+y$BN@'E A^ٳx){w-`С#?GmȑQJ%:w6Wܸ6KmvE|1vhNH`nމCyݣZjXXtYOΝȟ??O"!!{ac3]Xv/_iDqA: sru&Oכ&MpŋÇ<|0K43뀣~J17իHNN&$4*UJLl<_zI tuuyyׯɟ?RΝkZnW/>}z?Oݻ!1\,XDBBBҹ9K,K 󨪪RTIx ))))R7o0o=&L&...GÆ '54E 5k:SNk_aѢJlcc3իWRhQ*UU71iŹsgRzz!֜;w[gOrvGRjaaљÇлwO  Ͷrw~t㒒07…44rH+^g>}evOJiL9r'O޽{}w\)]]] svܝuKL|Hvjʄݻ(:uu~vOn<{idRFuʖ-Krr2̘aɓ|J=7С#JiJ*T(>Tabb^asTVUUUjԨNXX lt!@B|[ƍI89!" 0xOL`̸qc2Gɀ}U踘 &e4*Ucƌԧ[j <Jeܸ1ۛ3miݺ;Yzƍ2>Ǐn:6cŊes /vJyfx{ >> Z2E`IƨӸ1fڵSL>|zQLbԬYU;מP.ӱ9XiS:uj켊Iri^x;W nݚ{)~z쎭͚d-,]=]O *e˶AGG[ۙVIII]Fゃo+5}رZZZ\rU)Sz5p5ݨRry'5k{3SlYZ4ӵT</rFh>͛Qb֭eLb̙X։ &al܈:ujh{Η/:::^HzbhhC97w*YܹܹSM!qrZziS>nШQC@U5&<۷{꺁dTUUټy'o<Ĥ[O/ض͝W.wЫWO"""?r.^}M}֞DWj+Vy;w3f(jԨNxCE0֞$޾}˺u.ehh,/^d***_wamm6ڵǏ3ߌׯsqfFRmǏ&Ǿ39r(C d̙ct7L6W\v֭Mc1n$ Ptq@ñ{˓4i'exLJJRbm=ظt5b⛺zZT\ cY&FFFԫW3p1ܹKw1勿/_+(1YɓV*7(wm cW^K[.u 6}ortb!Xb)L9e+ȗ/c͚D0d5<ن۷P|9ll&e4W;gy>o޼EKK;,XoAdrhr @ʕҝ_|Z"Sfuv8rR'O3w=sotОG)n(W,5@ҥKShQN1O߼tuuٸq=OMfo?W7FzLⲎRjƌ6+(S ڵ[^]ǷorwJ*IÆ ֚=z pQ^]ϟC޼yغmz%,H}t-ޱf˗ƿ_>$&W|3gNwu#qsQ5mmt\r )X@ ||jժ(:UH\<I_;O_fUů\qS֯H޼yXj9Ϋ]?{{[*WyҸDf͚M͚u06nJ-իWDDMMMƎ6ٳ`ر5j fT__/]dV)Rϩ)=?-[m۶cl܈Z~QʗѣС=lق{-;׎K?~?\YΝѣ,oĵk3lϟajx>˗uAV-駟֭+W\YÇ ,\+A_LR (^|(O4n܈Fc׼|2yQ-ΓIIf_U&Iˉau߭f@"Z|%>*T޽{ҦM{"66=]B{?+{{|/^^XXqqq.2ڷ7rگ׮][MvR%)]4'%寪)^AZǃ_jql=2qafΜMhժ%%KL#ӦMDDDlلEgbccy))))tbgHII!W\hhhkIKV&J7jԐ|7']`A ϻw֎-[켊E*Mo~ZlAvmQha;9Zĉ'>?T9䴒d6nJTX!&> u/*/^N5֭BBѭ[,--Eŋ?2=5\x5kFHLLɓ'hь|~ !!@ҥ Ĥyɟ??s1e4000$&&y_ڷ7UJرw۟Yf۷۷%Krآӽ{oOu6MJJbԨ8s3qGii?ðZa7nz3I${.lп߿5M/ 4ibc`wd,^&c|a*iijj*1/^`?/'Ol dŢE HLLdB!22d5͛7[RBJRH2$NhG(-%ÙIɮ-5bi;ҪQ:[lCӿ,,3 XZvΰ")prZI9xpboB!"E chhȀ#"?#&}h!3l y .{1PjeT"(&WEEr!.]e4nlofց;=߿/Νכ1cF._c߾]:jWv~;v*uxv IDATa+ׯ_fIlܸ.M9 5jTJ|u߿g1](=eC B#G켊sq)!AHhΜ9eg閖?Kdd$*W:KK f͚̓k-[AGGVRZ5WѼy3LpF…i*PYh .…vyUiG%((W^smB"EMV}z;#::d uV{+WҦM+ZnVٙB!B'IӤl삫/nӦ8;|3g~c֬^gƲu;șqF/^Sv]LÆ ׯ@׮]x4jԐiӦ涍NzAɒ%8yLB!B!$X|ObŪ,={Ξ={3ͳz3;2e2f̟^pɓmł0c Y0:uMMMN:MllLB!B!TT>3qGii?ðZa7nz3&W+ԛ7}QkQSSS8q .]#S#/_F+B!GV@T iS>?x>JK -pfR{˝W /S|9͈RF!B!@ .̶m[x663}˓B!B_ ]EEEQN)!B!9t+B!BH F!B!@B!B!7"!B!BoD:fj:e[ƅQD'$-YB!BE1H U)!>%QC]EK0F!BHӤlaȪ?!B!A$QBB!B!ȔbԆ_yL<L8^B!⫒@"8?sk3h)l}N:y,Zy,Y+VL Wyfcc3E/O<,X0RJ䴒7qU/v`Jy>5>#76ϛgO*0p`o}(\z˩\2 Ʌ 8q<75j'UvsFFX]ի4͇OHH0v\dViթSݻw| X[[<}|烙Yq g֬rcnOo#QS˼Ǐχ[رjժf\^+WVQZn%A1BʕK$e.]mJΝGhh(j±cb{NiycvRRRwC122dŊ<^ձ+x \i\ѢEpwww}o,[KˌSNbϞ}Bo_jf)_Zd7n .'(& ΧG>|@,}͕{i.4puH@?W^d<{ͫhgd"o{Svhь'x#ݓ8w 7ؿ͚5bY\r'8x cm=Hi|޼y7oW^ƍ_B|#XY b #۶zI4oފn*߼y@rrgdy? puLLZPP! V4`<{\ZÇܾٓѣ05mэ_g>@=&8(\X7!**޽Oҍ;rf&67ӧOcf7=d^~ZfM4iNYvIzƁ-7#Y=-5V)M]]喜LxCjԨNٲeINN&223l8y/_ĉ޼ya~z}MF.>x=2ϟ5k =۞hBI&`aaΔ)SiӦ==VT˗f:Zܹ/_…ut'<<0 ===6lXFc9s5eV/^H>իM4GUUɓ'*=A0s-mژw~֬YM?ƏKݺuӧ?&&m NJ˔ b LMpqYԩ7***]댑!XѩQxzoButj*;wR̪RJao?SA:qv^ŤIS9u4/^LJ+򨩩Ѻukݧ ٳ;v4k֒͛tb(+C iٲ-&&mvfARRRAK͛7b [yO>KB[[}}=ƎŮ]򩨨0s4֬q!::&Ks5D⊴…ui޼9;?9ƍٳ;v&ާ=OQF^za)Sl9sk:1a$QNm-Z*}&ۿV_9r8۳gÇ--- @b8~+]g"qt\̡Cł9s3nn߾͉'%#mskӧO/lm>ǏqrZí[ݶ͝IHHs'?P-zIDDvvsx @FC͚5[b7oȑW-hhhu6w~T 6VV3f>ܶ#çzi,Y`ܹӧO;w>yx`߾<|-[ܸq&S4TXkgI۶md+SWWg`k6lp\ ,ȝ;) (3@8ԨQk>}RM6hW؊ر3y);w(jԨtnkk۷o`ݺ ԯ_هM+l/^0utƏí[9uʋ7oްrj|a˖Y^puu?.],sAAAN}d˖Mӧ3΍K]N֦4oފKHOhժ%K?99?ĉc3yDf̘EddT&ks:vO?̬#gϑB@B|P LX] ۯ60H}jq횿R 卌TRMܹ\W^SK߿OժUiS hf[EZ||<skfj^tbA%0o(}*WN 为neKǔ)]VQQߩZ(P3gN*-Ѐ%KȎ*WfnnFܹqwӾ~4h0cϞ]H~8׬Y={vr?GSiTUUhs1 qRRʕe„q89С-ZMMM<hɓ(~>˵Hԩҥpvv¢+VVCPSSIѡlܹ4i-><=w`ii***tիۛѦ)VVChDff:tb>mixyΝn3fLO~t؉ѣǢڵߴ䴒ܹscm=Νrj(peFSS =۞.Ƒ#9{;S"BD߿m[,roY dbcII_4jW!0ut!%\qS6ukjr]ᣲN7(]۷oe'+RSScl޼%K5 JJJ"440~ǏҲs=-[m۶ӭ[jk׮+%$$pq:thZlε'pVZ(F1ffl۶U+\쇱q#ΝfDDDp/^cǼ5k&͚J|| pL?~;/_ =2DGpa:֭;v%KN#y换O_m)"{CWW7m_4]~})V( .RJOHHPE!wރ޽9ѳgۏ|||Q,¢3cNP4gRSSCWW_Q>-Z4#_|_WZBB>|$N)7ɓ'O΄ɗ/:uXb+wɒE 3ΙSBB{n$$$p/ txB? `<&Mϟ??s1nD000q/ 0GbqE8t4o<$''&w3RFu:v@v׮]ӧ.]wC+!ҾS ezݻ`ooi҄ |swN=VɃ_o eӦ8:.`֬لRv-εngz;8#66=ËϳK.s֬YKҲ3VVСa 0|ܶ)fUHHӧOhhhЭ[n(?8:.R8ѭ[OU^ϙ>&۬cjږ{СCM~t'NLWk"7}{3|$GMyvEaф*j͚5 f̰"k:Ⲏ/_R/1L455qt\Qby҃7!!*u6ٳ0iVZN3MbŊVVț7/zWJyoxcMJZ`jjHsqY.z퍷O>Wr͛7[~ӧϲh7@]=Wll,ݺd䉬^yC/^iqɓisYh!̙3OG*a~*8M?aX-Ͱzڿ7ĝh%zR_&WikTPߣJiH}ta5j5jHd'BU bM֭R@T iS>?x>JK -pfR{[9_~AvS2\֮u|rҢE3xEB"E ӠA} ϖ-nR B񃐦IBkˎ0i-YDzaZ .LDD7a&B!#GС);vR B񃐦IH& G$!B!'MB!B!W%!B!BoD1B!B!߈bB!B! !B!B|#B!B!F$#B!BH F!B!@B!B!7"!B!BoD1B!B!߈bB!B! !B!B|#B!B!F$#B!BH F!B!@BBJJB!"I F!> x5 11Q D!B$#JIIa@ U?bք$%%I!B!b9NJJ %Q`R3d !)A¢m^f̘[t??o>. 6$KAF ?',nψ~mԧO/Ξ=Iܹe+h??oΞ=n\9{$7Fʕ޽+'O'0]6T\m…L8uuu_CC3qWX| :::UWWi%/FgS"TrQQg hKao)wK|D<&kZ-eG^S:S h`4]*j w׏=ABBhѢ)R  FFFewùs>Ji/&2$Ȇ?N oIJJb]$ǫ0I2WCii-(Xey*bչ݀ľ L555j֬K_>="_ԫW/ԫWW^9**  "bhhiGZ4o]30vhV\ѣ3g>ժUcʰaCXt۶m 44|1vhE Ĥ9L> ۷S(cnމwCXlS@A%۷SJ8?111u렧WN,`„I KP͛7c3odӦJM , kiԨ!Ql芛,ߌhذ:t")) ---N<nnH ̟?Ҩѯ<}ybc3֭[Ε+WYpE CMMMؿ sSx2'W(j~zxHWN]]:oﳬ_-MUY OϝJdtjxNț7o2gÆ pqqbIχ}+my)U}@]]łbŊA8NNk8r(0;>|( ҥL<_\444:޿@PP0uTamO7?>mm ٵkݻwMѣHLLLNߓq#핛>|ÇRP!^x.ÇWMӻwOTUUQ:7o@07b){!}d?$#ğe&sAiA|~K^e=b/K!_K ^' Z^kh7pҰa}Ezu͒4*vI F4S'u-۰`Bƍ٧z[tyg@/Y~#TTGag7JSTTTX##C S' "#t`yD0N:*䴒XZjK׮=(]4ƍp=ǍC߾9Ӗ֭᱓իW`lH)߀0ڵȚ5QSS`ԭ[>}cb҆{XL $%%ez+S4޽#22J)=442eOLL JyVMGhԇRO`X[[cǎb׮݊i>}JDDGAuzꁏOV,_5jsS|9 ӝp:v4g+ذamԩ*&MʩSy>>>t[f}=Ϧfv4k֒͛tb(+C iٲ-&&mvW+]-QSSeοt^R?߿/n|?i[4i:cnnc!#;hԨR Ҽys<={ȉ!_!66CmR+)Yeƌi4hP555Za3o,U3QQQL6Is?J||<+WϞ= --m\] Mo+WIIIs~SCn޼Ř1iР>M4Vʧ~zY3g)سg/:uRtܲe 4558z4 ي.t҃3g| cǎDF>~zJ;GGgx)k׮iӦHydq`Mzw[`kk+z膣Si}ض͓Mp͛7knN:^˗л|m/ܹTK!3gNr5n߾Ζ-ٻw'NY{YJKKNnWv3iѢ5#F_$&&[J IBBzbiH@&Im3yJbkF:EӉ}/!I @%Ŀ%ڵ뤦ҠA}Uʍ7'>>baф4={Ç}4mjAӦ 8 J^vCΝtuu`E({gfl쎿[Oݺu?G-aE1VRwu]żyX[[r)~ ---.]4ҥJ7o~fVM~ٳ:u .I!_(Zh%J)5遚=yWBllf7bٲ%Zg(Uƍ;;:8ӵkll(]ADu2&&F1Z\Z5s\ NڊF Ʀ'OС#J;ܹ|eKN<!))IV9-Z4###ʖ-"/^(ttw6LӸq#-7n3ՃSpjժ2}TcU}SYӱ7yo/QQ)S cƌ^BBV---)B||B(c"0nzѵ5&'))ɓpP]kb ~JЀ MȐ܏0XztSR)NA|24^ }Jiii? &T^ e>>4kfAjjgϞSONN=#6YSUUF?wngn`y> "?6nѣ^i &=~7+ﵷSj/^e6iӚ&MⲜ˗0jjr&Mhh(zzz |###*񩩩l.\L ~z|O3&M`m*ֻp".Ҳe N>ߥ5'O`ذPڗk9[nwoi ._X`mm9:taF*ϝWO;qq4M61b7oQ &*Uf*֮]ώ;KSS 1jXN<?lڴ͛gm9ʏ?΢m$'P>3}z> aذ0GŊ>y󐸸811̝;ѣG^#ZlcQf6&5YNll, Χm4i''Glls[^4MBZ$hB|Q+J/iRIψyBlcb_>M-MF**jqd}l߿/V/ O133RJcKLL,QQrrAfu_8;&"9 ,fVγsl[3g>&M$))QWuvscɒEv:u"44{L6u(Z(?>^rӦMn0ɜ>}sW9N)S{3fx_e„I̞#vH"\~A$'c?(5Xʍtf͚AR}۟핆߼ٝߓ9lm)Xbׇ~7mHlm3stߛmE6LKKc ۷s:ub޽7n wUZgذ,^nԬY׬ډo6Mҹs'WC?Q\9LLLActʔ)Cdd$Geٲ׶޿ĕ+W[oM{@T̙rܹС) ӧϔ:|(B*f)SF?0mT\]WY&OkXUUU-l5B˗/Y`1'99I+緔Puy9e-zZo6cc_~QS(! <xc(R$jB*nZETH@U5*j9j$*_&U4!:Ç;Ю][z+!qz@* ^}l6/#yoTPj! 4m5FÒ4-^ES|j:_JX=.&2R?xZ!')S333 )!LH FQ訨(ճX&W2҈PITPPjgqh7B3kkK~m!"'O& !O4)TRSHOWn{ #B!x;i$[B! _-B!BH F!B!#@B!B!G"!B!BD1B!B!b>7B!p@x)! 4)!B!D"(XԊ" T)!B!D.EUDuԐPɬ L*iKy!B!  |`iHS!B!"4MB!B!H$#B!BH F!B!#@B!B!G"!B!BD1B!B!bB!B!>u)!DaAFF{B!I!Dΐ!9y>h:u {;ӥ zMZs'7fܸ1)U۷o;wMB]]7< f͚ \zB___)>?k.qeVXb} u֖K,dyR16m֭k?)S&8ތٹӓ@ʕ+|4iLPP[IO8AA\t>4ׯ/^.\e֬J˺ws\b(cP }}MK_?M# iz|||֭'NNs8pÇ;(Ҕ*U_Dpp0zfѣGwLׂhѢ9#G_A~ڃnnbo?!C)SRc'7VJ֭x)^Vg۶_y ={0utuŒ+xUU~a;Ӎ?ׯ_5]ѢE|ꌮn{]kבu*6m,V5gu8'ذa#K.]y81jXllsn݂V*T`葴k7̘1Ml„qܹsG 1_o 9HzM?~,ǏY/i׮ 4LL6)S& !Ǘj&9992RSSz֖:tWr=bu]}v$&&2sĉrzHcbR]<{._?Gܜm56Ipe\ԩөSP޽BBB뎬YVj!g̜#w9} NXYY@Ν+󝯍M/ ={晦J3zO?̫WIo˗m2[޼|28BBB L<CÊԫWȑ9{W>s IDATkeddeR-[۷bc_M֭Jy)-{S6̙ wMܾ}gOckkS7oƍWh+J*E`?M̛猻&5j'O# &PjѳgG}= 6mZO,:vlΝ?iҤرs γXbL46̙3ؼٝwoLMM_jժRNmv-[p!yvZ*U*m޽)]+444}+Sxq4OPP,^ٳ)႔ٺu;keS^=455Yѽ{7ʖ-Z'!א?h011!::}OgJW,,NfMYʅ~_wi.C;v4٧k8p -[a2d0@xzzCtΐ!T\9GѣѥKƍaȐ8::ѱ7kݨQbСC5ˑN,ٽ{/WBfMBχ ~1ؾS1ĉ(Q{01̄ c4ƄgW,Y%J#׮]{9-RÇ۳~A`+iР1..̝LjU:߸q#Vraʔi?~(Ji޽Gq=GG'ڶ[XlR&+Sz5:t;ZDFFh|r3JNAk;ow/ڵF]>_yFGGu [Jԩӄu%K2I=]]] } (@S]XShQ.^#}xx/|mO̙ĉ X{/[FrQ~}$3&& ! doa322x8UUJ.KHHԬY+Ǻ_=8s[~̘QZ冇v?~3gȊ..m&^^Lj"**mۓYm_<}'9M4.Я/?l~(Oԩ_稫+S|Tֆs޹BCǎpqY`˖;bڴXS'իWYEbbbs䛔JOg-\x#0`PԳg444ؾBnʕxznM [|Xf3gRscϞ8;;Ljj*-[@SSG3Wpafw^x;?~,÷3iii$$$vz?Xhii,:#14Ȝ9N0{vTlL~}֭gA̘1WWou0w|)Z_Mbff#}>ٳ_ߵ(aaa1?8x5:'Ytyغu8ڵ ;[k(DEEѧOuܤIgLj! ܚEF>$#:;ͯ7%kԂryŴpgҥK7ƍ k֬R,kܸ˖-a*7z~8jj긹*j)$$$U4Gzzz$$$o7}p/r4oQSScp6n\habbb^4Ǯ];r*QJ TUUV>|DQiiiTjqu]Ɂ{)[,<^x4AG]ӳ;…K~ᄃO[J+p3fLcϞ4h <ኚFILL3?x0VV]qvNڵ>鱗uykiiQH޺6ĉldѢ̞L8th?'OϳG)S5k1st||Ny6mԈB@Lzz:O}PZl#_cc#EIS߶ag7E(wbMzysssnFҰ\|E,%%Ç _stÆT,;׉vڱ}'QgJJ 11)ͿzjTP!ךWyiٲMZжm<3vhƏ^5S<=ֶ7۶yҧ ;v3z8;ϥB n?811̝;J/G\W[[ 3y'/c;nnkxѣ Ul2|w 0--hӦ=NN fϲe1BBQs < ѵpVMF)))*9K*UA0ĭ[WOn>YUUUFΖ-/;)y;wĖ-j e˖UZgϞt;w"&& .*'9u` >wAJ6TB:?.;Rp'ʔ)MPP0#FVlr^ʔ)Chh(ڵ;_.\\\g8:@\\'Ndɒ+6ov'991}$%%{[~J5VOiӦuuu2yE7n2h&ֶ7**p?Csjf'***9[ ]~٥1vܹNJ^ϸqcؽ{:Æd<Vvf޾}A4iÆ9Æ X+WE)fvw%55M1RWlwh^ KontMq_ ٳg'? da|wgJ>khJ3ʔ ):޶Worv o̜9MM ) !B!B x&Ka!B!"V:t6Ʀ66NTT_V^`,-;S\Y"##ٳg7o!9<]\VЪUK8._ҥ?# @׮as @ڵl!B!=H tr)U ==W|JXnAA0|=͚5a_V?t0W@_$ `Ƶt֋ىB!B!?H1z+]زe#VV+ӿ_LL*ӫWo"#v:~~~6 ƍ_=zĴi39u8_}ՖʎB!B!AGGp\Bftwpwߪdy,5kahhSRR }g:!B!BF?, ]k&/Tlŋr]yPB""B!B!a+V/k}w@]]'OJ !B!0 W\1D =C>--M)ֆ=AHHO$*B!B@?^fHo%'Fr-^Ʀ_~JIV s-NCbbT!B!=IgAVͿ¾}8?HOOB!B!(85jxnF6ٺ՝7Hɒ%ٳ;5bР!mbʟqu]M@0lڴYvB!B$>Du^͓;p{}Njj*ÇdȐ ؏lmѣ9mLO߾}Xc,G= +B!B' |b8p7Grr nnkߙر_zz:7y Q(ddd(UQQQ+B!b!5Ô+WVQͿϞѩHzz:Pm5j@rdD~*gJwZB!BC1 g̚5X3̙/$' *=GegPQzqMt5*U;eheMaE )4!B!M~kY_:uT>udٳR`B|i2t(˾V O%"T*p3}6}Y]TZX2ܙ4{͔Μ9In]\^Nm|}iР4BTl̦Muϟeʔɨ+>WbVqe|}4i|I̙;ٶWW&;Xd! +c=zdҼqüy\r7rrJ65pu/r---]Ķm*}{o޼ƍ\({ &;n]XZv~kz f͚ \zB__?״긺_<r2`@>}̙?xӧ脕%M4{Fř4i ۇ`Р,Y2iʔ)Mƍ;v">0mL455iӦ @  $$Di}Y4=7nE +Wq&cNB4lE|޽mr]fkۛ/snO\\b{_S04Hzu?i9g}qu]̓ٱc'od71L׮L=/_ߟѣbnnN۶mr766mܹqf- ;$%%}g=b+Ӱ#*Ui矐NzZSZj:1.A Io1*vjn޼ƕ+Xd!ZJUʖ-ý{4l }vAnrͅLٴi7o^ҥ̝넶6bnns \*^\7Uܺus|ppXY,Y#s:q%]?*WdIVX뗹t;g]J&M@˖-:xsD5w4hИ+Ҥe!9s۷silmTǼy+V,<7oƍWh+J*E`?M̛猻& ¨Q#8y79|R={p>oi<)qޡC{;NLL"MTT5KoLMM_jժRNmvmKKK###CZl1qKƍ(["eg?~W ̐!4jԔ7oz/><~]{`o?uhY.89͡fͺJ7Çs]qs[˴iSsܴg׽{WnݺMFM2ānݺзm?UU֯_}ֶ ~AV_'gܜH-YN1cF)U >Hj~ҼD̘1TNٳ_V0FgCVkeׯ_:o<_zΧ)վppJbb^^H (LvNw+c૊4/_ /yN9"hSFK)_CS]EF$A{/bY~~~Yp ׯ )W| bbbOhQ(QB@OFGi֬)6aDA""BתUK.q͍&88:uj+ʮAzS:tD)c';י/lɓ#$%%)UiѢ9&QlY455yxB)`-m<ٶ>+nܸ.ÇSY򓦠yZZɌ1;!C9sOڴiʼn's^?DDӥ۶ybiٙDN>k ì\"cc-;vlƦn$^9U4GH"'Nz93jjjPuE׮L0$&OIkIA|4Ғ"?g2^Dqq*!kY9$57"HM_5f2Y(w_"=:ݸq3uիWc߾ V,߻w?jդrec-p"?w***VSTTTIMJOO]DJJ 11)ͿzjT9ihh(&&ҨahXQQ=>?i{1.\d Cqmܛfo&knn֭hٲEfSRR8|ԤCؽ{bܹN,[;ISΟ?QJ<""K.+0G̣GrmI}ذck7(=p,f9,\8>}׮799BkL8TBu,gj;ӮXx0niTU(N9"D&xQv->}vƍȢEK1aaakkKu6͛7SWR%E-Y70TQS'Q!hРҼ 55'O2gرbt-4MXf59׺_5j4D*բعsNl+V(9͓:tΝ;˅ z쁓\\\:Fpp0Λ7=+ͫQ=.P~~]R1K`ddk01]vS9={nݺر@9**Js++Ky]Xx#sM_JV5W+N֭s#!!OAXXW^̬PRB1BBCEE8(nVՌ%Gⷀ(N|[߭͘Tԯ/p F[[m~eҤ TP5өܻn Ŝ9ٷo?ӧz<Ϟ=snr2v܆}kFd'VVVfܾ}'V:)´izvpYZ\:;H"۷+AnVZ2F}֭k׷S`All)T[_ tBƍY|)۷~~ػwzdƌYڵ^cׯѿ3M6aϞ899 lbbLŊ(Qn'q<=iJ%guJ{RO||<3gzp/cǎaʔi-u/<E ӪLF6jHxN*"ד?Pg16~,TOB]M 0ALRLZ-|^Ҝ`D;c{f\Ԕӧ2d8NמO###^^9w< , ^!>'6mB.ݥ2 =Cmdf&|!Mk -tv9u$!Dcfbft^6o9MaS>)6|ˏ|Z Fbvrf&g}wuѣG{[on9ިZlAZ3g\xB(Q *зoL*" !r*O#o$UnFdD((PǠw #EajjGɒ%عs1`Fȑٽ{y%,Kr !{6d`زekG< !pkRIB5)#FCjZsP(PTP*e(-!B! 5I!r!RyB!܃H!B!BB!B!xO$#B!BH F!B!=@B!B!{"!B!BD1B!B!bB!B! !B!B'B!B!xO$#B!BH F!B!=@B!B!{"!B!BD1B!B!bB!B! !r=ƍCPP AA;!B!D3*Bfxz.i&4'*W A$%%I% !B!rBZ\L/S5j垘~߫WO#'Rκvѣv {IiԨ!NsatBA~} ̙*U O\x@PBY>{ǏǙ3\z`cc-'o3gVsoTaY^vǏFRz;٭7o^O… gr%ŋRx1e^K(Pr333.^<ͿҜ׵kWسg'_}}ݺuعsW^ٵ~m~\]'p)gy)R`^###<=s)67o^2kk+Ξ=E2+u/!ȕA=iܸ *AҸq>#m[&Mpph><=SZU?S?/֭z,Y/ٝw-377-J>0`ʕeÆT*]>77W5kʠACܹ;?fӦ ɥJ.Mrr2M{me0)_;mu,^J*B(V(k֬B4|'Oڵkcp}kϟ%ۺj߾'Nr2*T`nk[kWq1ڱfZΝUf3gNA/8p=zXb^B% N/y0^z݀*xxb$&&ky{!!Dbbb%_jV%wU(899wk׮뻋ƍi֬) 1~PT=@BB.1k֌,q;W^dĉ\J/MRjx1={YݿW&O,ll ŋ?PׯZ}N>ˣj111Fƍ D`]WXupJ01}˗m_~Y˗/Ь7-ZP֭g)lܸHk4h?̵kW8p`^;ozΩS^fݺvJ.Ett[ׯYw͛q?ӥ=yZ g^ll^sO>Zw$55v 6l؀{۷UPhQܹCHH.-..ݬ"""T*^s"""ّ'a{!!D2bp7n2ШQCfΜ@pES m%Kom}|I&`ciҞ{e;Ս-عs7˖B3t+WMR,j8f[G1XYYu066֖%K FJJ.O6ɓ'ۛ2''G.\LYēiӦ'/^ /n߾M6++l"Ԯ]K0f̏9r'O@6<*o;w7w;M4g ̟?++K:VV|'4oފfZRH\s,,,(Pޛt<,/.̘1~:d8q?͜9(\pe>{Cӵknݺr=z>ɓ}{cmm>ȵ?~)axx˗ϲ%w͒eJd-cddf<ƍ%/Bs8*k*TSܜ"E0{LϏR2N 6Of<{,M^\Lrr2>>[kңGwpwʭ[r*C FԩS[?gŊLwcknZliذ&<6EKhӦ'f>kVqs‹/bԫ0BC~FGcynR/ߘ18v8W\}ߴNڵ35jTg6l| 7(3o-ٵֵPʓ'm:5kW\ʕ\|1cF1m ݻA[3ewJJ 5N/ RՌ? bѝD||]{j!D.uyPJBBBx<5jPbE֭T`}}ꦫV 666( '(,ʕβe?Kv<\&'\JbѢ0zwy8:0g,._Fa۶ٳ`bŊf*=30ћ9TRs-TV3gPt܉Oz>ʴiShԨ!Ǐ~%11Qwfk[ ƚSdIqў>}ZǼys6oaƬ| ř~ZٵEVo]۬VIJJb_}:nѣ tGic>ٵ&!!??޽{~nTԭ[3/_^~_{]襛all̟0NB 2vI4'k׉m$&&2j]RB1B\g]8ammŦMR KߟҥK3oJ,ڵѷoo]˘wa!Yh_RVFtڶ@J~ׁ]"ݔ)nTRƟ#e?o%KGBB"֭! @/9k֬ݻ2^k?oΨT6mKY ֒8:uͿGBONӦMaϞܺu%K|ڶuͻNdMԭm։!""Bݓ'Ow."lk.lCnٺu^*w;wtb={6\ݻewҰY--gfU1k 4iN:qwwsn-u/@& !r @ѢEٳ;-[oIHH$""aFPXQ)]o .~EDDH_vTRWCU5 11["$999KS󑑷x%eʔ!::Z*SB$]! 2-[һwrf͛mJh/q1]>Jb4  `q6 }7*T^kwΆ tJ,ή]iZnq=nYǎpwʒ%:tH+ޏuvtvʕ+G͚_؏7Bq#?k*0Џ ~RۮtUuC*^˗78&GF;vֶ;v[n~䩮ʇpd vzim8vǏc X"ti ૯slӿ?^Hg+H \j*xz.…``JzwTܸq3SΝ;Oll,'g׮zi"""k53gktm\]P^ggVX @tt4Zcg{۷i֍hժ՘q:tI d$,Yʕ?vZlذH_O>С#̘1ve622l2-[++K5QFӟr+iOw7 IDATk BŊܹ}bѢ%Y42{cɒԭ[Ud"#8|mT`S?Ə)Y jʯm_&u/gR!D<1^^ѣ77oޤ}NLF>iݑ҃0III{{ ,"!!S)Q8 0X/@ aÆ2yDbba&V^+cY$&d<Ǿ}Yd)=zդt$J(ݻwqsŽ; !tFRdƌiz鑑h޼.7..{:; vży uyʗ/Oǎؼ}4MN+ҵkO&Nn8x3g6T+ZС?gNMsgew2lvb<۷GbXl9+ޏuժ5hZFҥKq-F&%%7nꭓ7y8 PbJ(뤧uV7GPpqOm7||`gꍃZ[[Zjbbb׃̟]cׯѿ3ƍʼnz>)DZxz.Ȉ@FcJٳӺŤgL%))#GԽP|oΘ̐<}>}Zi(FY#?*u6Cysg655c4'6mB.ݥ2 @*6W h2Mk3La> ɐ5y:;9v3-]r %_(URB@=FѢE݉WABVDqׯG߾}ذaTB|$$S1PiB!!+))) 2+VGbX|%..%#_mȐ,]ݻw-ÓI9cduƦDiVhX*O(5I!BH$VUVVM-J( !B!brZ 5E_JQ*B!Bȝ\.Q[.i໯We,/gdJ_)U&6TRM4B!BQJ_ըB O3+Q(i4T,RE[T)hx+UG4ٴPCR O0QZ-QRDi SXw}UT(yJجI29 RTeZJ% أNE (T2R:u -J(l{u &8uE1T!=\ue(ժyʛR!B!rb> *+TSTr_!T.h4QVGRvuJ2lck9.PJmFjR _5NJ#jФVꮄuT.kk# @pٌQcV2쫖R%T&%WSݕgZ5j u*LYNwZRm̨IJK J k ~2(ʷoi-RWB!"@(Ux5nT( PaFw7q42hy [iT70jZMG@BaNiR,*~PsAb:DV % -HkŒ? lZ9Qa_Z-Pʘٯad&2 neZ)sHQ/~iRKso]\ʈZ F;71)/y* B!B\DSa:c2CZWiUi5R\\|WfiS*Fi,$N%JmFFiT'ɡSXTTd;%Oi5$h dTRеP(PQZZn_5**-5BoB҈9+jSJj( ^*M TT@-RU3AmS[EZKZ5Di:`0&cݮW#gϞcl,qf!B!>f $8ρT~W h2Mk3La> ɐ5y:;9v,(qK jrjJhs*DcpP-_RuJ+.*Hk pTqF w&c0Ҙ84aT^$EkO)X(<,*PR&ӘCZgX/=99uH@B!USAUƀ~ T݌?iAu1N+jP Jfzk[d c+cjxFoVC[1r,BQZ-5)Pѽm6^}\X1J14B!B>AU5 Ҫ 8h PPEUk *B׌)FޮK Zn~$7 Z ~] !Diըz&:B!BH &7Q؅E7%[hhR!B!Б@x'oۅcj"B!B|,R9G-U B!Bא@L/x7)~0n dј B!B8隔jR(PIUFj #ccc<=Ӵi]+ d !B!rbr3Ҩ1:V iA,_IƍtiO>H"4jԐ=0`Gի';}[k.89‚_'2L(],_~{r6mªU n̜9++K&SvM^x;Y`r`ΜY?~긎?Bh+uJu |˗I<ȴi3xyeծ]1cFQgİg^~y)j_ XZZ2oljԨe\HXu:ujp;jd˖,^3-ѭcnn?od֬9x⣨u0nlm+A͟֊x4ϔ)yiM##-Oڵy3g灺㶶b˖ʹo߉rW^1"H5矗O)TOQRE7nc]mI7naaa4iOtҝ+Wн{W&3u4P^],OjCU9gΜU+{m嵑p ,Ϳp :vMR1c*ffy2e\E/_.K޿Q }`qlذ Ol۶'Sf͠@L:H &N#OqjԨm%nܸeY׮] >? (Wqwwcmm+v*.]ΨQc]s&11cǎ\gT!1%&ctma(\0u|ܹՓeVT*łsm @^1B\ѣ7;v ::={ӣGobccuSSS8!Bn]ٸq <`~kk+ڶu`Ԩq?PJJh,--- XZZЯ_ɵ׺Խ@"9_Қ={z.&<<Q,Yo-|mk\]{M4{FK˖ܻwgg,߿/nliΝYlABN</WM6$IIIQBU@ɒ%ު:wJdmJ*3 C B>prrdԨQ%K<6m |b @۴iӞ}bztkb%#Gɓ'Ц^oe]nh4iҜ70\,uXYY駟мy+5kI"Epss(^0c,=J%1k2*VԿmm+allL%uunR/kزe׷fql߾bO"E{^zxx˗ϲ%w͒eJd-cddf<gǎ\?|(JFҺ:8s$&&΁m%FbMɒ%<}To ϟ7yCjUkܹ $11={d&0y;Ǐ#,,;eV&k. 57$keP*<жm^͚ex!DSQJes?[?QFm6Mc㉊zj pf $$$ғy$ $]t@n o[{ ss3={^zz7{eYݻY򧯓+WbǬY3֭'˗-׽b…hѢٝ-$$$ɰa#(V(^^ޔ.]Z׷?୞YDD4h^Upjj[^$&&rV$$''gi q>2/_L2DGG^eX蚤 !D!CѲeKzOTT֛ ұcFw8z^MٵXblܸ)˲ jԨ/55sd軡PBp_vn߾77w6lKPdIuvMкuK?u:v쀻T,СDFF&+W5ѱ7nrF(~~i?1a4oތm|P*DGG_~YOJfFݍ<"55;V<ǵk>{{o}vtF`|~k@ڴq ,_bElm+ ,W_5Sn~xV,--y(h/f*B* 0X@J}-^'1MShQ0`zGBB"k׮gԟƔ/_~0oMZSoOeٝnݺRl7nk׮#!!/^탻d6l@rW'/XXX抵UVs1.S4\nܸ)Ν'66dzkn@ZDD$vvֶsuz_i;6֜NNבUV&biYY|'ԭ[+}]Q7fF@Iv킣c?*TWI̝;5X'HNNfoH"-[ePre\]'Pl>5|J4aÆPb:wD>Xh Ufut޽Xd!u֡j*,Y>bp*ԏ'p}J,ABZk[sI T$%%1``c6УGon޼I2ō>}z0III{{ ,"!!S)Q8 0k׮ir Æ e}Zi(Feٳ9ljj lذQ*D!>Bj))) 2+VGbX|%..%#_mȐ,]ݻwsoR!B񑐮IB$B!pkB!B!GI F!B!=@B!B!{"!B!BD1B!B!bB!B! !B!B'B!B!xO$#B!BH F!B!=@B!B!{"!B!BD1B!B!TAΪZ SaccBxm^VKdd$H !B!q"&M*Txc@PPBLqB!B!riìY.|##Ο?C 6{{KeI\ʕuc7oK755aȐٵ"o޼_d,n߾6֭ +V 1%~~,YǏuyz#'''2N ̶젠Vyɓ'Yz-я^[UTfѢ5K.(B!#&cҥ|y,M*Ud:t謗v7n [ڵk*UJ/ߏ?V/9r /_GZ6m:e{ÇGn^9sQpazɶmt=>{. ,͛7cѢtԅ[ng{L3gzx cc#ʕ+Gn]D~N]ѣG:tBB!BQIKSJ.Ǐw+>>Ebmmwu ?uMLLhƞYp%_cP(4hemUZ>}z1t\;vGG޽)))q& 74}1=y{y ??… v'xx%&&F.pqq7055ee4mDhԨ!˗{~^zo9Bwֵk=ȵkWػw7M|%OF 9uʟgYֳgwk׮p~Zn%OݺuعsW^ٵ-kڴ a_Ǐ̙̙su""²tϨNDDի>^ԩ JSv-oBheW\dvlWVM"">|.mz+] ++^ׯ{bbbΞ=Ep,\8"EkddbΞ=Fͫ[fmmٳ(S"׾%#!E͛ᄅ即@Nc֬h˲b„Yg?eyucϼ]y$($O}͙3c@f̘x"!K~_}4o FFiC!կ_c=#WeDEEqd 3f̦Sr 4n܈X~i  bcciܸGBwն&gE88wV)S~K.=۷dzPmm+v*=C;֬Yܹu3gҪޫCHLL$<<\NR.֢Esʗ/I&5njN5d4h%G+VիW \98Qpaիyxbc cv~~8ף}vx Oeܺur1|P;΋/q^!..ݻ}$R&&&?S:1|;wk0;v+ .ƍXZK8+;V :PhJ%Ĩ֊]FFVƪ"fU$V"D;CrsoMEqss=?̛v|8{}7|.\>βe+NܥKg&[,/TZg՘I4&FR63џ'UXmi۶  ҤɻVqww'<<3gi>SRR^S`u{!1cѣ(Wl;99s̗_Nʲ]Dij~bȑcԩ+#9QfJb.\1k>ç~M*UHœ={6ۏjܹVZbooǻ˖-NMMe?:ujo߉-޷%ߗAH|6/0ptEf̳U(e>}4nТMfM HD?߿*-ZR1jԧ>|>}ɸSNiz ۸qXe* )>܍7c._ڦM{֬bYbb 6`˖mmnFjUqssܷo.\\`>CC ZFx<.],gdٲ%]@Fcu|2ܢZh?ǧUlv>\DZc= L&SiÆ 1޽GXXت}TT4oQRI͚5ã"eq}X^H ?&ѳ? 5j -[zK~}ӧO/&Lelذ筷ˎBX|AsPrѴiBCX\ fФI֭ e.V.]h@өSGT*%k\o_f͚CZu;7ɓx*(Q5kVqEڴiG^}PBCe=ܼy0*{ 6?7u낟?M4g̜E yWh޼͚XbOY(Q3uǶ?>S_RQ 2" >>bR ZM] ~OJJUm.]>য়]hQNDDiN>+޳\Zuw}}jVZ͌Ә9sv#}/@&jԨ70f(t:=gΜ~ݓ?^oUVeє.yݻqEۓ'OsgtrjwiL׮dWՔ.]wJAoOp*BҥPBwJJEtnܸџO?[|%|7$$$p.2'N2nD9xv|,_&\snn> ?U7n׷/>>mꫯj{ۇaF_x)ׯ0/4h+W61_f}˂ Q*UtڙqAsZҷӷo?fAA?Rbt/80{Tv95 `yhrzQȌNZM~,^,ˢʕR֬YK޽W.gϞ{n([yȐa>|uXbYf .Ǹqعsyƍ/^OÆ cδ̳ge sk1l'ԬY`/@RR-/bݻ'OQlm*Tp{<]=-3wlj!![X,~ \e?KlܘV47kQB֯h];ӡC 0KO{?&s{63 EoS2 {!oNXGL&C T\bܸڵ-W,mzd"֭[ϤIS3k"#ڵ3={~`ԩpj˄;;vl1ܸݿƍ m~:aa7n"ׯ_>ڲeC p3}5Sn޼/brGсUΝ;wUԫW ҊڵW>v*UɑY, bZ,_d9B@p 61bҷ39sVvŠJb1jT`"6ozj  b>$ڵɉUV}͝;wprrj׭f}6T^U:ud߾ضmEݻ0yr5d߾bUR ã"˗TRCnnݲwrWFӢEǶٸq9s xzV׷/ ΣoV|}Ҷm:uΟ~AYx]6'غu;s|o>7:ukԩ+N?ci)Rjy…ˊGE|}ӑm>|)))9:ײr@d2P(Pw_0|b+Wr/9)(u6n~mJ n-l޼bY\\K%6׳(ʁ[lذ}X+Wjժ̛P^~ekJ*ҥY*ÇҫO, hKV_zȴrP*֑oh۶=:{<BGժ]ILL|'$$ɓs_}5%Kr}n߾MŊ,󱱱| :s"όʕ+rj:wڵߴjپ8tw7?hd6mJp6o… ;Z'LGPhذףIt{9Ξ=G㏃ԨM6ތ9~dիsN̝﷢wדּ3M;&S|Qƌit.]a÷fc}EpX,޽SiҤ9u?^cA"}/@jh>۱ci$OB1+Fhh ~ SXt9&};4|ݓoј8=ѵkʖ-Cƍce$'Dp'Ұaʕ+^j$trf̘λCٲeiÊKfhBl;v`ذO1kJUTJZr]4|5k'^Lڵ?,X&Me!xzVSg5KP0hPVڜ[j5Ko+VZ᯿[S҇Θ Νc$$$0nX6nd5**֭[Q*U*_F=/jEmjW[|}ЫW_~a1|3VmrT8'NW[h׮-Vkf\z/ڵ UTa,]̡^{ YngϞ5UTFR=ZQ>}b^gʖ-Cٲe[.kkO:O ZFi?lٲsgQ^]Uܹb_mnR%|}{3vx._LR%)RժlL^Ϥ9,<<:IGKMMeiWZAsyڵH@={ GJ¤>n6LOɒ%f2tpq VXŏM2| \\\غusΣ{G)3g޽dɒ\t ?֯ ;]a6bPJ%SNX}[> fĈa|qqWY:X;s,}Fӿ/qqW ɶhќe˲tr)6ܸ@.=7n,!!HMMe]Lf{f' g Lo1eӦ† ClȌغu3׮]gut:Ν;o,}ڹs陞;w`~K/DŊ́sILLgϏٳg_9hطo\\\޽g*@ lf'duѯ/o|l 8*$B!brЋ0QeY2b8ʀ(!B!k$T/H F2b,(2?%FFB!BQ r΋P<^eD0B9Ie@x1e9u)|zB! @Lz.FRJ@^".\_L,B!ybrFaDe;T P+L7pQI &} ҄*UqVH+1^e,B!ybrΤ>bURJh$["@N֨y\5FR JRMJ%&B!ybrPASG;h iW\sQRI Em ŠDWTB!BH &vƅʈ֤@k1 h N Ec@gJ ,9J!B!S$tFE^;hM \$#Um@kJpQh#B!ybrPڅq@Ft)a(EœcT$7!B!S$F%Y#FiL@7))$C i <0*rڀ֨LRJFB!B%A\wTЛR7W%z"_-ѓjTPΎ>9| cƌN:F!B9GgTz^AAI^vCn=P3*PzrF!0pM61/ߗ_*$B!1Έ17=Z&O'C 2|XfooϢE-0nQ,X ?[n)xj]tfϞ>}-[6Ѥɻ6tb_8u!!xOզi&DEy;3ʔ)mNʆδiSk_֭!" c!T*6uk9u{bذO_sW_}\ٳgiеk,כYOyyMBwYlI*U*tٳoo,Y7|eUfӦMA8pݻLYx! ªwk-Jݺosj<}#Tdƌ|\+ǼI9HoTƎ*:z.c6jPC/2bUiIA?&../H||<=z|'V0c ,ÔB׮] ZɶmZi߾'O`̜+W6quueڵ;[m8wŶ{ݻwٴ)ҥKsubbbd`ޭٶmfܹ󸻗s7o}Сߙ0KΟ?CXf%/"!!j9eݣsNKܻwjyL 9F7C…+Wa>a}V+V@۶޴mہpBi]Ǹ3g4B2br6gqR?#CV,%ՐV9FR2M DFF曵x饗 Cdd$ݻl| }ٿ/O$$d#7hӬYSBB6׷/*Q>ჄSO:uMn (ƍE?X,STLi)]4qĢGx*-Z4[mlۇ x嗈/!4t~؝eҥEOOO-[ɓ9z0S:~-/5?8{6zZ2%e@AonN>[,GtО[7ӣG7 %"-[Ls/0je Ǐc2S:{>z6oނGEj֬aWPz5֯l00Lh\;6l-,mݺjժf}LL9p=xVy(Jj֬ATTׯ/cǎ+B19Qꅾʐ6}AڈR!Qm` FNy|gFF%ZR2bhܸ󉋻BF 6m/_'y3NL`̈ÞiCWEVlaѢګ@Z=sg>&ѳ? 5j -[zK~}ӧO/&Lelذ筷ˎBX|Asʕi& 55wRR%U^RJfMf:uDRveKPBᅬc ̾ˬYsUs2yrR%f*.^H6ի/*Tr(B:c޼97oF6^{ 6?7u낟?M4g̜E yWh޼͚XbMDRQ 2WׯiyURFCɒ֓ci pmvM.-wڅ~ϵk-ԩ8grsuuXb\tbydd˗z;11GFFn~DG_ ,ljUV3c4fΜ]H 0!wk8hMJ"izryXNpRi$&=v|M,_ҥKsJ;wȑ?)TQQg~:7nǧӟۇ^f⥌3:mtAXr5kLhh~~''G\\\ڵ3'~Ɂ%0p>ǎeaFW ~aB _|NZ5QT4nU*UnNVӯ//gϞ%"4˗=׽͂̚ʕhZ֬YKtsK݈.\S 2ZjRnԬY 1nve^q&Zliiذvܙ6,g카iӞdzv:nXdz HJJ"..ESoѢ9'Y6?8Š?Z>>mTxzz73HNNA}Iiכ֭7g(988ж7k֬پkΜ}PPۼNSj׮O?Lҥ!Ӯ7ݚ5?'uډke^7&&3g00l6}6+VX>%661.]jl,(ݻw>}*]`Es[^H & r5c@gJۥF@LT >qU? ѓ'_֠QjȞ={Ah}/ns)S&Ѿ};e >PH<<<,2(֭[?+Vȼys)Uʲƍhxܹs#G4סC{'1wn v&::ŋ?:mڶ^a29#GNǕ+qzZnŝ;w9}f}[~UTC]^͛7TrÁjmMoΞ=Ǎ 6{zzRJe… ;9pPӧ7IIɬYwww]N||<ǏSPH vܽwP1F1t\ܾUpvڀh(C/N@gRRZ- 6Ϝj wӦX3;n2bPZFhh ~ SXt9&}`…4k֔>O hEp"aaaxxxҥHNNK^DD6^T^[n?N2K.gƌL%<9IzB:va0~DJVŴuc?#11H{[2oeB`Р9ŋ0 t:4hЀ1bVZM@PЏ8;;3vgq`Jp3_c@:wf:z 7+W[ɢiݺϟGV3`@Шի|3ǎdɒ >Hs= bccٷ7^{5&LO@dk8qvvvc4;ʭ[صWNDhhc28Slԭ?ڵaܸ v-X ~f!l߾7߬EϞ1b( m…ضm;?3زe+sbD3fQmT䁯oo||:peJ*I"EVfsgB19Hgݡ"*#:@:#F[f8k ֨!׈zt&vٱ&9Fjjjv:GϞ0ϼロMrr2&Sd 0`y\:t8C~ĉ~+Vd%uL2| \\\غusΣ{63g޽dɒ\t ?֯ ;]a6bPJ%SNX}ӊΛȄ _Fxx={…iӢEsʖ-ҥm>~XdO/qFcU q#.]z0nXBB6Ν6+' g LϘ1cmСC,%73uf] xWk;7Dz?ܿ={ߚ9'aĈ)W\a5*V@V=1>Κ5?Ѻu'AmK\Uvv<=+QYƎ矏!0pj9;R䫯҆Ťgݻwif}{Z>tT<"֧x)3,|K?2oF}L_x|=y_\ٙs/c4)h\.teG=hgdfDstE01UZ쭖g_O sOb]\ck$(ÄTM;h4O3ۛ17oޤW/_~ỷ Bi&tM:CB)\0ǏYcM&3p?l,wVro& ϛFvLM? JItTtzPI zFʻ#jZӣ6U+7={FHBB6<  B=*OB3bLJ%#_j̘ 3f|#!"ߘ8K&NR:B!^0tܙIe `ys#U{ʊ)[d 8*n A>!w D !B!x:a:cpTZfĤfĨ2l{㢲.j~%#B!ybr֨)jv8L&8gxE$j(Tp1j#G3.jEΤI-5bB!"@L2ː5Z)b'QV@͜6 S8 LŇ&ԈB!Bg8itEy#B!brΨȵb& 4*j bv: JJPfBCʹjB4Q,nz'ɈB!B8IFB!Bai5HҀ`yjTyW\ V)QaQ8/qᣓYB!"O@LRrjH ĤM*ѓ"̜b##&/O_]Hc1)8$#B!ybr)jĸs,Ia@F֠Y)l'ِ>sR1=s:KHkTʛ1N*ŌIףIB!BWH &=M nyĽHW/MJ\패Nq'] <+ƬIyt(h ɈB!BG'9P {4cR0sⶺ<(6XeM J(Mr !B!D 3e/㢎["ID':$rw>x8}u1;yƤta$3ːY Nd!B!D 3*uQ\SNtZ$\7 NaD)["ՠEmFo>sRQ;shFvJ#<˨ IDATz\lTf@Ύ>9| cƌN:F!B$t&cUF<]p9QAl=Kmgm\ I1X*߬g`} \h hM1 2h4Ρ_(Q%ӿ/^:H!B$LdżQ4+Ivp.$:_ OU ՠYcjh쭐OgNR+Mh&YaI6@ok?KF̳gѢ4mļ֭[4jԐ _`G`Ͳ#O~z[8t(CRY֓+S4 ᅬqP~: &|#8~OfbŊYmk.۷SNUZqSN|<<*ʎzδiS1DTY͛7Xgϲlyy,899YzjDEeԨO|$*,յxLܹ~m}z^l3N`ncgPȑCZ+p!ʔ)]`_{ ĈjT#OV,[I|чk?(hzgci·1cFZkڴ)4h6{)^8/Dx:oi۶=2J*en7f͚2h'tԍ7nr e1Ƀh?'9>b]/j7fXF#|p6+Wʕ8<#eǎJN>v:Ҵi Zb >>{*YًK,o*鼽[ShQ}W>1c:}7+W 1/}/$>NLblؤg=Qc=u5TBI鱣Wsd֦M!f @kR :@ZC-@aw7OӽBKޭٶmfܹܹE~Cv6PP!>t4ϟ',cǎ?hѢ@گmz3rg;  +WIwP( >9sg_fҤDEEӻwOsЧCvO6g̘ƍcȹs-njjժpq#mٱc'/p%cb.{-XpF1v4kV6l@bE뭇^&&&h6nĪUxy~a}ჄSO:uMpBlS5jŲDF]je$))ުgnCxxݻ w(Klٲb{[lw ڵ6o2dyQ9xp?]thɲeK8y8Gfʔ\\\\o?EfgFˤ2%e@AonN>[,GtО[7ӣG7 %"-[Lş1ِ!ٽWΟ?u+4m.ϲMΝ0,zеkg6o8Wyiذ[lXu6UO:37T*YQQQxxT_;@K RP>1I2}Ij͡I)z% l;VAbUusФ<pVHb Ɉy #F qF'. 5dڴ?~7dƌ1왶9tz??ZhEH-Zk գ;w6?{3a={~hۋQвj;}b?Zl͆ ?{zx!M*ڵdȐAsƗ(/Yݽ6yׯ߰8N3ߦ7|}5kja@&OWPDq֬YŋiӦzB YES̛7ѣ?_pMhb{lذѭ[iҤ9˗`oP yWh޼͚XbMxdF+Wyf.x޽qYk4K$Y'4xۢFiڴ)k6l@n]y\]])V.]tnFP|ydhDG_ ,ljUV3c4fΜ]H Gt&ƥuF]'I'F%IzYyɊyP ]ooN~~opdSh%1:GgRPXZŒY4)_ɓiE!K.͕+qt܍#GPBDElܸ O=GGG~~bc/xRƌZ`Р\5^&44 ?z#...tڙ8cΰa# +HpO6B-qk#Xg޽ksF3wj&<@4T|Ln߾ʕhZ֬YKtsK݈.\S 2ZjRnԬY 1nve^q&ZliiذvܹٳҦM{BCڵHHA͚50 D\\-~ 44";lقyYС=vvvuEG_رQ=>ș3g|8ybR6m̞={_c/xks`0puu'5v84xӽ{7SX+}/$_bld(ثLL~]lı.sچ^"o*I%YJI3J\NLy%RXoKdZ͋UuΨxl 󗚢IUcg.#,^υ/c}fg\K׈ɷG8s!-'aڵz=v*UɑY, ɓV*Gz~xxxPb4 Ǐhs̟=Ga}Aʔ)#oB+MNŊYjbbօr)BRRgCRRVm .ln)lsFYA~\~w1SV o&::իժU_ٶmEݻT*h(m8۷ %%|VJeFA`lDR,ݺu `1ݝo 矓6WTҥ}8kDǎQT( :u?˫--[o4oތٳg^9vttDѐd1O:矏m[o۷ {!7)eRJNv)vl+ƒ@*qPo߶:ӇZ=&;Ja1{.ӧOk,XwnK 䰸Z= w,k_ٻ?岇޳*EYZڻTiUڭ=Z Z1.kNHT||>#C.GڱS>޺*d}˴* 1?\yP &UYi9#? \<GS-oF0HoϚfX;|X (4L ebӝg L`5z_. v}Xfs2y6=]h^tEo]O(Ȱ2i(Jҫ4sl:Lܹԩ~ؔ88+k)PnC9ss/ߟ8jzbxӦM(W/^zjUJ\\7n^OU<7PB? 4IBHEf0LqUjzGGGNH*wQ(Y9ȑRׯLӦ[,Y&9r"3wlF#{h/&J₇/[fӦ;v<˗d޼9݂CҏHxx'O2kݺOdΜݻZ egγw^9s&vT*}bDGgG#^ϖ-[i׮-۷efyhhhҳkq9r4U/N͛7k s?&߇Ԋq7N˚yӭeC\̮jj<4aRkM-7;ӧ}yz|]bm|yi4Fzdw* FmT#7mR+AIY~zzg9itׅٳga(_}5M;wn:L^8,Yĉ0 ܸq 0|0Zl $5hQRÃDzdRbcJ]ͭ[i޼)*ѣˉeɒeL=cƌϏի1iƏ4(~g„qsi3=eVzYә3g.L4իaKB@ vɜ933f<111|oߟI2&g̈ +m%Jx1hW)^'QB@V 8AOWS;+Vbooψ9sE0%gSQl,K۶,<|QFj44iׯ_Gлw/sըL x{~̘QhZ.Ӻ't+e~(e˖?׺[={vb2hm(P{{;E! Џ7oZc ,b ؟ݻPjvW_} $UYpvf:A_вܹs|BeZM&y/$BuVp;qߝ+ƥlY?r<ȼ#!μ'm 0bQbRSNO%hr{5ϔқE ҝ˅9!ۖ<;W O_x-;y݈#d`۞O3{y4 C,PsS5$nDp$鹃EӥO0a,]~`t/?g̘Ell,''o^7ݻ/_I#G8p0`̘QR5I!B!BRB!B!"B!B!"B!B!"B!B!"B!B!"B!B!"B!B!"B!B!"B!B!"B!B!"B!B!"B!B!"B!B!"B!B!"B!B!"B'L&L&dB!"I F!R0 C=HLL B!Bd* !c&n\cn bP7 dB!"H FL&J7P`Q h4UgHH/GƗZ/,s).SP<ǎJ*ZN9p`vvv:t-ysF>5[&NDZcxvFNPr ԩͱc8p`_q۷}\k׮\rҴk׆}~ؾ}3a45jTgӦEQ\gg'sBvs2e-o6<ǎfL<3gNrYfϞ[tV2dǎ<ׯb /t'ߗC]f~}[oմ&s//[5ټy#/I^2zHN<ٳ9'\]]Lh;w6'Ocۛ/^'QP{JK F!rTK"kFRQUNI1KFaTܔzvcnNiР1_|!kW4AAAٳ{eh/kt:nϟ-[6Qti&Lomf~L}/oܸ1L>MNh4&L?ƍYkv?-Zח+/_>s1~8/_A˖ٰa3fLqF4Ŋt/=z&M3e%]vIs @BBJ,] Ge֌?.]:ӫWtgϠDtދ'On~u1*Uگ4m63֭pUV\fqq{[K+:j(*r惺|/ܨ(nݺ[>4n܈͛9MHC&N_qYΞ=/ƍ֭|yN>bl޼G,^f IDATKʓ'4iҜFEa̞3wĉbŊ|EWL>}z1} VZ? <{=~lիט1c7nم.]:truUOb*GfMصk3gڵ븻mϘ7oTꭷjRv=#0`0jժrOn ӦM?0vx>|И+Vf ?Z ]HLL]90aaaPTI6mƍe[ӋG1w|yZH _Hxbhь-Zs%#_TӸs/W\ /J\\k׮˱Ǽ佐1Bd2Ya5EZ$:r9lCͭ>/0ܓUTp93:bؠA}~T $`ĈQ6l[=áCܹ#+V,ҥs=7ڵ1߶m3;wEf_}mo BBBsܹjgǎw{}jM9qEo*U\rvz lFQc45eV Gg]IuǛɓ'<$gh 74 }}\|ݻwXThݺc=ҥ<:Ћ0a2_ŰhQ9JoIzaQQQ)|Z6n-վh߾-۶mO̴$&&f(ݫTv-ve1l]/_ܹs֭[@@DD$^@ŊPTT\ <<ӳgwFŒB1BidZpۀ#V18j=Ƙ?8+ECJ QF (BB,^HDMJ[wЬYKzEٲ7gsaÆҺ' -~ؔ۷yyxyyҭ[wZl̓![ .ĪU9ܜaÆ3d`]eKse6ڵ3gk׮>ftڙd1Mݙ9s6U`ΜL4RJmٰaeVdrr`0{sw/J||<X 3i鈈"M Imj˗HZZFc>|b SLi-%G]njn޼IЭ[w+nU53o ?Ohh(~}ctЎcS~#-[(V6̊stR4j ~+cǎ~eyVV*վdЯ_ϩS탧666|e7c>-֭Vw-psC Xv3vZt.[K8::۷v-5[n_޽>|Fk:u ӧb$b9.S0bn Zت!q. <48茶}")oQkEfa>|VV<)V\MHCSׁڼy ~!MRڵkam?=s;ڵ=7oq%zC͚5(-;wd:t@Ν-˔)Mp"7obԨJj}v\Su>>;vVw(SEG¸| ǎg=ļ2 JR%޽}N6x]{Xj5kױzڧ.;3dTãUʕe֬ Mf'X;w'1119s p ^c &nobƒDhb^kFg$""c!B /~ܹMrMzÇi:0yrRҬYSvC\\3_b~-N( NlcqoZne3eqttpB*U2U;5W\MA7Yxx8N(`LXl0ŋI8z͛˓=pY Oi= ˲e+Xl "}>kV5(ɛ7/nnn8#rotz݇ -;bXwܿ{/d2O|҂իWЭ[w\#F ё#x<E;:1ڤoyR9`Q VH/Dw>Md"**=^Ϯ]i֬)ǎQٳO߰afI5<,,\>v&???>t*EAQTi^{VKŊ ~I ՓRkL.˸}6θ#EZOLLd̘q|TrJDFFr}y6oތCӳgo~WWW ǠACR]wiI)%J`ժ5mժU3ݻO1iiֱmnܸɜ93k\z o8qJ*ry}ZMŊjԨN`"""VyxՈ@?s?ZNBBw{0SE'Y2ٳ;~ł8{>!ؿ/FS]1mQ6IM}ą':.w{嗃P: }-IZ~??/Iy65z?N<|}/^ '&&$&&r--'ժU1tɗ m1RJ/_f˖-cC _=$Ubܙ2eyŋ^X8np>L&j ~ӴÛ5k‘#G/_֭[KPPPRC}Yym~2Æ}ˡCG,qttd\˵kL:Er/ 6#띋E?M~c,_yvy˖7Zn3g.{# -z-[Ү][ڷo;]hh(o5pQ6mb1yf\z-g#GEɒ%ÜW.G߳_~ALL,mݝq?ڛ)$ܹ||2O=<w1ĉ\|R3tW,X0f:-¸qqwwZ7اW7n^>hL*Uҥk׮0w]=w|:u@(\ua,YH)$$jժRJ@"DNb2=gf͚ŨQ#(Q‹_]bNw)F4Ӄ}{ӤGnX!釘 if^Jɒ%Z޽裦4m嗤e4mڂOz ,ر)^˗cٜ9s"ܳԩӸv: ̵h4>L@&Q%K?dK53a8ڷoGɒ%]K,\gӦ8::2gLʖ-CY|)!ƌŤI8v̛Gp<~-J*Iׯ6l|c>=֭^4l3(P HԨQiӦrM[`MOڵ-+V,5W;3g&oU1g,-ڼKӃ=`ĈRw!_P|٧xI d"^ϥKkבO`eeEXj9G>š5+h߾VVV?Mvtź>a^x{{[6VF4!ZٲeRoNy]Ws~Ю]RO>M63m[uԁ}{,M~e{}д|Yk޽{ҹs'rvŌ ʕKݻo߉R\9Ə @.زe+5aϞSm[B_,70mt[7QREtfQub޼FΝhР>]vƍ4ݻ;gϞWפ]sm]Rm)BBҮ]'+[Yl 7oޢGi  Hu4={Օ;p|lΜ̚5]}f̘?:u5W]CN(ŠX`t͜xqsoGmہH~y6۶m;3mt/sY\ʅ vǎ-_8'%22]֪yW\/{ҠA}mL-|j$o޼iFO0wlVZNDD$_~#fT*?T-&HLaL0)GߒBɆ)(R$O?'֩޹W,ʕ+/ѿgkG"Eظq-uɉI0<'͛2\}'sc׮O'u `1|֬9ZK͞=;hcӼ,[~{z<'ÇÇ Jҥ˞eu\$7wnWk[ϟꚋ~mF+W.YrraՃzҡCg… QvmOdۛzҶmx^s*^\XX8VV7IdA|-N%&EcGe IEl+ *:&QkT*CU]ڵ(BGՃ [<!ٙgOUCMI)Ɠb)aO~OOH("gϠ\ܹsEsEBՃ1{ :wR˹pᢹ]///.\HLL 111ܾ}իc4 NN:0ha]t37_YO٠DDDh/MVΞVZZ KYo21hCBB,҇GPPR.űeƌi梼66\vH%'dw}ʔ)j[ùyE)xu vjzsCߦZ1hmX['$$(E8`$jP|&文GTT.]:YBߑ7t֕ &J!kB1*c5_G^npQ-on^( N>C(YEOPfu 8~Uְj՚t'$$X7~V*K,K5@4m1K.ju+ ]N'ogxVEzv~`Wu&"4yXj#2i8 :lnammZTIz~iC _ƽ{ץvBߏf͚~v]2D!^xdڵ3f&Lȑ|iL[ X*posŋEjmZ5kݥw+ſpx*Wlnp r劙ڿ͛t,XS|R,˗/Sv- .;ƍgre!Wb=W( 6쵺;uj5jMɓZTB6f8ƌ'!i7Knȗ/3d2IUƢ'}(Td_R̙IϞݩ\jԩcՌ-jKִikOll,+WfqԩS Ҥ,\8;̆ )T#G~;+V07Zre*Uf6l@|7SlMʹsͭ׃F;;;uZB!Bwɂ*eF6xnU;w>7ԩ_|ѕXΝ;GN{ZINwߍ O<믇gz?<(y =۶Pu7 e$$$_Oy]2eJh|i%ͣÆ atz~JZ !B!o^@r$ &NL$xukB!"II9r(,!B!BpFB!B!D@B!B!D@B!B!D@B!B!D@B!B!D@B!B!D3JJ jsw2V]P;((X !%AFdB!"G@LfR0=wxPkPc%#B!QjRf`Zi_<19HFq<>gε IDATB!"'@LfR\#=&[;HA%!B!B$L/;-.S.L!B!B$ҢHLNB!B!H.@1Bd1dWQB!BY$0:Nqr "+;JAZԽр QzT*)<(B!y]ۡ$Qc1,,!KJ.ݒH+F( }T 'l$DZ-!B!2=GnY.l@+UȌKɔH4`dDe2GQĊw`DrDoDCR7?ƍFb2(P ?>>޸e^ի%WtiI_<|ޤOƍظq-ǏfӦ|TVKs!I_(*466| c7G…44h>>x7kג}'#[O_G}e&MjZJ$>QZ R\;FڀU"F C 8rHH0!F|0tz9MttL:۝9BBe$w/. ,fժ\r++-^^^AL4l>s 6sW>3{B<l)R {<>'k[{"""3=3v/ϰp$,B!ٙgOUCMI)Ɠb)aO~OOգ6b^&;{.]Fgi'F!B!xH 5abq$#B!Bq$:ҢǍ})q\$#B!Bi$:]`w!B!M"o#t%A9B!B!D1{;'"y#B!BA$:DAJ\<&'i'F!B!xH 5`wǔp %%sB!B7b^,&)Bc?B!B!B1=>&W B!B!y $btwNpƂEI2I!B!xH 5`>C"A$$$B!B$ݬ(&`Hsr?c2J^ !B!qnvOwAxe%B!B8 d3#tOMC%B!Bi$ -J1DGBcQT7$τB!H(jj5* EQPɄdh4b00 L&َLUVRP)  W-/4 0L$dh&@Lv30+(!B!ҠVBV&9Rh^   َyTVX)RzMAAh}iB1ht&}dB!)T*ZSO\`01UpJJQbmMd^JǼ.Y0LIcwB!1F /RRښKv# @TTyf&3+accCre)ZNNNDDDȥK?ײ3k;/N1.)A^Q !BEQ*ERREs`׮=DGGWTO ʨjEd2ev/^:ujV'OnMre9|7n2k;2Vu"t /hyQx14Զ]Z- ԧxbY/J'->cVTI3U;;ѴGd)LιP=+dB!Q^6x`o4ivhQV%accC:QhuUB}GPԩA" Al|7`Ҡ$$rQ8!$Lc*M~;[ȋh"6&(>P+ Z*!k8 ԼZR4s2 DD`tK}nsP[A! Qf]$ $k B!9fqrrI|e"(Zh;wdQ&"EҼ L&4(^*i}?(( !j bzr%X0*Qޢxs9 >*n L|y@",,%@ܹؽK! ~vpE0OJd{Q4Yi!A/y(B!r $aҫ,88/dI#prrLs/,Ry4b;^DÒbbY{ŰspQ8yli\FM^[L&?H{߸M@d4myGU %"@`tx]ldJdCA[܋-D[kq-K'o\Q+( a"8x/; r`L6 7,\Z;9OjL8]QxJEWLdN,镌 ̫!lbttA{Txp !B^ # hd2?_xt6(Ok蘤C.)(XT#D&5|/&EǤ}Fw**υGaîGc:}D=u7:%!v$DsP~Lk5ՙO\-jT,"<\Tv/DnDdsفxnGǤ%eBфg%H &8:1tmPK !Bd2=GiKƲ{#^hj;ȝ;s;{VlNjHc,yTq`|BɘV<-MxBBmy,&&v߾Kh<p13]trd;\ 'LL.gb@ 'JqeL?'7\ ̫&bcs.$ږB!"hUa2+};1oβjmA7")doZIF#%EZfm4,w<=h./|Yg6zs_N~k r+wtz_l*8{[ ;֎ˏԟ[V8*֮Z=_g,/#9hj;Ӄ4k =I׉%wzPh0f UYj0Ft[ e ^\եK&g(jVK}w_Z 2ޔOk<``i5oGv Onޖ7nn||&9"'w[[e 9h?&Ң+h盺}пڑu=.{zǒtGwN.x۹W͙ZWLaf2',,wb׮~<=틻e%{@w wǾ,XW/2fs_>whYaʐ_?Лo_m=ܯHMvR3gNٗ[ƴmllhsD_9VyݣuOԓc`tcc5=-=3O?^aǞT=ZΝ;sWFW *{W:&.I a >k=);$0#6Vtt\sx1riݐM>i&xGީ—#eL\8oڸ0r&OY(BX횔UiDE/REu\3>mZlEΡr IDATPi!L\kaaLt,>`<YO1+6o2A}-afU%ɰz⦥놔6o`YƍTk:-b59% J&9X]bylM918Sgk߉p(;#ǘY  ?^f=@0_rs~KP`9eS_0`祢L0}v*< g &r 8'&Ёs@^R2pKF C t!0`?+zIENDB`resources-1.9.1/data/resources/screenshots/3.png000066400000000000000000002740551510634446000217070ustar00rootroot00000000000000PNG  IHDRb6%gAMA asRGB, cHRMz&u0`:pQ< pHYs   IDATxw|WtP!KP*e^"C/*(UCr!2dȆ@Rt'ґtG}rw?DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD %AQHc("""""" jnB/pE tDDDDDDDB,(d1O f(tб) dPEDDDDDDPƠ-"""""""7I d """""""r@ƠYhHDDDDDDnl }[ TDDDDDD(zBŠϕ'P"""""""%56 >OW"""""""/k *q]/"""""""ٳZ0`m*()0%IDDDDDD9"~!KDDDDDD(πZUŠ = (tJ΃ka󝡄m:jBWk1E%PF/ hDDDDDD8I_0Nnjf?ogcrHAf2h5׻} tro`Hq&\S,~sBWرq+YX7Z341,ȯ&yW3""""""RhHYuټ2&)l@n''`\ ` QAk>o'Z2-Vrr?Ϗ&&7KNQ"""""""EZ2[P&'Lc KH`:PI_6&m9iv]BW+#ߛ ?CjrX[r+a_[sX.(aLQ b\Řd=W]aEڒnYfaŅMSa\ W\)jϩFDDDDDDn;QBd\S˜܌&dg+fHaP&^2zdbܬP CdU{"""""""ŋ5J.L dkT,˜ĸ3!uYBvLEDDDDDDCfaEF͏2 bbBK60D1%1dP5hCc& 9k$""""""R2T%ipƱtD1n|":ɪ)!jb\cFG%tkV{%e8l#y鷛~: c i0]-%tڳ)u3ڟEDDDDDD*k6p1Xp;\ ` 5+aL) &;uu$̚e/3g`=-Q?"?PJ7`1 WRSͧ>}v[Æw-D1s} |ɱRV5=FaL^ d CeU&AX1y-mܸ^z酏 Cj'Kzj:"""""7htԨ嗱@*%a9IdU&QI1*Y?&I Y#+Usb1*|)ĈF3߭Y l!K@&0&|3kͼ%a@a brR&}G}C˗~ZCHѧ FDDDDpIH{ 0&/2o@9c }pe3kDkVLZ0cpLWDoR#""""""?z[At7 d5d&+gss`2;1u p|9RU!Hqwx && {tϧ 7#t=.J^FCShӹs秨&H~}I]׈ޞl;16 w&D^|?+)85k|weѯ=2Yc&3w"YU3flJpt204W#R^m k-";{'?q9#GVΪs^WGPʷe,*K3FbcΝ_l n_ڵ\5Fd.\Ĝ9xa<0M^ÃJ*Ү][ o~=@ٲ#//87ӼӧOCgX~̘W۷cƼ[2,su Y@LL scRFuH.q\yhӦ5SbOPP:f%zk~y 'Nv<drэGyɔްa#cǾ-k/99?^ùsEf dÕs' a`Ƶ{tKg >zmq5]ٲB#?jdpcy!NhZ EDD޺uV ~e3,ɶmkgXXLNҾ$&&r-Z/c֬TzTXDFFw8x!!qww/׷4U8X&$$pr틎3QQWRNP|C\\=KNNfԨ H9v8&ETT QRre|HJB.]:3iқ7ʕϏ/qYfϞKDD6X '&&/p!um`-L1 U(5-"EJݻo߬Yխ!%vrGKSj`*9tϯL;]"""La 1+W~ܹgZ>((^0&LDX؟tfkn{n4aaauBy,{NݝMV}On+WlALd1c^qzmX4hqqqiW'̟?իd2f̘֭+.+(Fѣx!kzy,b5)ʔ)SΝ7Ѻu0/^wc׮݌~<b\Wíol6LJJ fs*ϛ wwwJZijպ-؈&L.G$9h^S0hH5Kʪ & W-""9~/… ˻mv.^.}ZL0;Kټy38woM`^|eLPP0NŮ]?>sTT'Cn=.4;B`fϞ˴iЩSW:uʇ~lv/\䧟fXʕhʖ p_ӧ[2ݺu7E8AJ.MRR۶mQܸr Ӛ` YLPP0:t&k%((?NddDFFM֬Y봭4k׮ж}Ν;o\"".p%&NL.=h>y1~G~y  ㉋n]O^cǮw_F~G3ͬ\ ß]L&*VȄ iӦ5`VGF6\:iӧϤ[^tڃ3fz~evҟoT}кu{ MMMeyz=ԩ2<"%-ʕ+_%%%Y[+!BJJ2Wr .ʊ]dܝHFYd eE>16Ks9@3,ztҙJ*]k!:bzn.eoҼy3޳N:+WGGB@t#99CamLJ eӓegĈQO)GF 9v8/ vvz[֭QR%bcNdfeиq#4iixO?K6ѯZayJH 菏Ol}8g5k_Qkpݻx{[-4iKx{{_GF^wjDhLy}L F#`Xx*WDvm8} 'O_cN&Nٳg+ɓa̞=i\OǏ穧FcNTjժ#ĉNx{4˗gw:]UlDFFRFu/l #66^QNĉ?Sа]DG0o>x:JH"ڵ3e7+mhʕᩌõ/FDD$5Kj߾-ڵ6c{ UcX0t79HLLLe6o?IϞ}6l8UTU{;X"IIIk7ءw`\,ɓ]P|y~GéZ*3g~›oW_j2{t_xBH/Y~ƨ(n5ym[caïL&֭>bו߲e+aaaxyy95!zӱMb]Qjٲb.i̹ssrS>8IoCj޼٬\5/µdY }СөSWO @Ν'))GyѣgYL4N`XkNK3֭\O~Brr AA- Y…iѢ9|iHX  #}x U,]ȥcǛL6#m?+W"%%%W(,,uӘ1c>FV~I֦Mƍ{9sf+/ٯ5&>>ZܴG||Bn?{0y)(c! QQ1 aDDDٳ·mСfWJÆwW9z˺/#Gr%Y>@Nݜ 994?Mbb":pGcQ-r78pGOϞ=0 ݻ^SQF*U*ۯP!:ujpM[?'W;UIrӦM7'ɒm©Sб}F ;wrھ+SZ9-d9|p9???tZ6opCa\9i}䯴 N9:t`5hPm6q/L&ڷoj ћq$%%L$ILL$> o'>jjX޳MfPhk&HEix'}ѲaF~޽{rqE֭C:u\~ǏeEȱyLzi&|t|}K;uv۹sG,Y; jIRR EŊ3e{8q;K/v`9#IߍˌF>>hoV^;fY6%% xyZŋIh>BR;7v#G7ɜ>}9*W-q V!fCZG:[ҥ'N`߾/_ȸYK_:l4uq8A^ye [nbkpOGVҪսe n@Nzr/vf_W^sUVtűuV|p~ODDD؏{wcNc0fsjs^zPj֭[ϑ#Gٹseg Hqd6o֢H'g4ZRX7y d߹Q?r'&:vѣ7<<6m*_>D(1Ӽy3#>o˿fv܉9seVL&:MÝ߲/{كÇ3h#Ԭywի74իWk[.?h5h z{7߲{nf3``k*ݻ}ΐ!N} Ati{3O=5>ꔫ傂ZҦMk6o̙={S?S-G-[6'4vsZlKIHH ڵkgzL*UMya̛7;O:uжm~uf͡e/_={{Stwހm8=0Fѩoc۶ܹ!Cl}xxx0lc\O=5^W_`0kFƌyޜ(#4RB G phlW~{-ڷoƍ2zԭ['d2_.gŊoiѢ9N{5jT/t)lCT'vi筙|զ$*k!9mVjM0O?ʕ+hڴ @#6&iQnݚ\=DhI/|@u)on{?!ՊiomS$99(RSSV*C fѢ5!J>SB ,\bGDiN8i._?h|}K3o,vB\\,۶m'0^}?N+z-܊?F&MxQQWhҤ1}-\ݻeXÃ3?ϯ ԩSp<3 <ԪU www|}KӼy3>,kBl)h.{мy,Cn]̙.s#h4rq6nv2bēau{#;Ԓ7O*UtժUgv*Tnf͚A8<ϟE̞=ڵogdΜ9neʔU{5ku5si۶5=zt1h@y:'o5Jٲe9z /ܵY6nHdd$:ud֬9$\(KJʺ`׮=y1NO,cƼN׮=oh.29׿<Є‘:1{~lc;>?.]گ `Μ*}O>}g*ر|B9wـ'FժU-`׮\z@z΀wq. ȑXVׯϰa;t{駟֭+/"˖}…hڴ Sg/ӷ\xC6m*wـ 6|ל>}oo/x z_Ν;INNf2a5{^d)oq=A<0^1^< IDATXllz!11 ޠ[75SǪUӻwOƎ}MD&ܷd9ӧPF w0 xj*Y,twϯHaI:<[ӽْV9_~YGrr2ժUݝի࣏>`0РA}.\p fϞIBB"GĹsSZU*Uľ}yqҴi/^g}ׁ'X{4i.Bwe}$&&Rr%:v젃"""ŒcM|1c^篿Wa08u*T'ж>'M bt-ڒg}ʕ+loXd)))tҙ#駟?b7<|'NrzLL&vԩX0MKh^^|q4IIIZ{%An;U$)HvrGHagd[/_Sߵ1`{C nhۺ/A!e DE)))+}vݺu`Y5k:~ 3/2=-ZBݺuhٲc[4m۶aϞ9zXqF"".{Oۋ/^ܹs< ?Cر~wPvm4id?""R8xxx㏫t D رIHa (eQ(etoެ-5dnV+%93R C<ʕ+W >8ޟJ?? cƼBٹs''Od_ٰa#;7u{y~Iac@is2Ei۬[.O<Ӳ^»v­ʯnر[s(UTTEDDDDp1 Y\r :3g<{6^ԩlۅPNG_ JbX{Sn]~i&4mڄWǒ%K _`<(vumuشi}M6;-pm v+T~Fցc.:t>`i&cǎ?޽{ݻ|fM󄇇g2eO'CSewZ gφ3~v=j1 Wٳ^z|\t>f]X-Gۛ={~h4ҡC{|}KmvN _7QNm{s4?<;vgaԩSxxx0d6cŊo9y2Cj/&C a,YDFFK͚5_>իWoWr1xb5jTg}Ӷa/\oeժZTZU8ww,GM V${헩Se o>?gk! 7i{YbuFV;.7<|0]{'WZOÃEr-9|!!8zfucCiذ!QQWX0;wCrh۶5>:ޤȑ,\GP F _|_ ))VԩS3f]7|i֮+phѢ9#F}rJX,V op!o(WG  zmNxqY[|}}Y6֮]GӦM[yӾ}[Nnz.]LٲY@xx8}Q+)L&K'+]'GMrpoo- ]'|*+""""747T}T\ h4iܸ`Az=jiȑ4kv7>>/;vb69q$m۶͍ҥKӤIc®H&995o}dbbp{/_.]v0"R"xzz}]}T"7]z""""III,Y͍*UйsGrwj]iΝ8% 777^JJJ //ZTd x:w,Z%z+իWaÆ]Dԩͽޓ~HIh .*9Dbt| aWFXDDDDRJ;͎4/::ҥKۗ@jj*xzzb2x䑇&:[XV;Ώ?Oиq#7nDBBV}(W\!"RyzzN||*U oohChd,bׇ"rJf?@dE:w^;ؾ}W^%55kqL&ԩ[3)Y ǏbxR"##1 *aYl]c0d2K@@>{`4 Jlh4Hew)""""h4һw/֯ȶmc֯_x>KRSSU&͚ @vm,XDZ5Y6F#$&&G׮][.`Bݨ^ v?DDJ:ɄृO 7a{l7fl6m69=_jST^MBDDDDpo מ-צ?s9kep(tf,D0괋 1""""""""DAHQ#"""""""R@zEDDDDDDJ"FH)AjɈPR FDDDDDDD() bDDDDDDDD  FDDDDDDD() bDDDDDDDD  FDDDDDDD() bDDDDDDDD  FDDDDDDD() bDDDDDDDD  FDDDDDDD() bDDDDDDDD Cw6m̌zʕgu`DbL5bPnB˗9sH1 &˜L&֬u3cZy<3:"""""""l6ӽ{/~q5]tϓm~洝{2jst֓/ qFM֭ql^1;w"55$$$0cL:L-X7gxɤ0t#23ga̘W^:;2=yg27"&&qdذq2gΜߥZ{=:"""""""Pb` {=*U 6ma֭i:777jժɈ曕 j͍VѝW n? 6dɒ0""""""".RSdz}{(:k߾6mv Xׯ;GdE2εh4ϟ @5h:#z$$$$HM-[oLd2{ ji/k6M+lvo op Ö-[7o>3S'CDDDDDD$Sĭ_f͚`\ΝܹXp>uֽyҾ}^;ޒeZjĩSS6 dO:""""""".PSEEEo~ zU:=|?۶mwj:gX `޼nnVZ|۷7߬d #G2js&._޽{9|իWq&a6l$ nYPPKF#[FNx!߿ K>Ã{Q̛SNQrexc5qF<ܳ,… ӵkg|pN a~.+UWtcf*U9Lwޕݻ䂂5kqF :;'1a[Y]0q:""""-F@*` XM[qxa9K?< T#FDKLLdQ̞=S"99(6lO믛r!((UVۇѯ_tLbnΜy9r&LOVre>lڴ~ƍCӨQC(k"""""15MbGMB㥗^pn>!!Gtt}ٔ)j//O~'V zdḹѥKbbb۹[X[{d8|sСXVNzj9T:=68֬Y @xg1L2B֮]ŋuVKI)4IDDgÉu`e^^h#G9-[l ǒ%˘1cީlm3|ǏSرc'UJjU OsI}[RJo?SBB@׮)[6oYStEDDDQ#"R9\ɨ鑿u|| ϴiS9r8+W"%%1c^f;U^zit!$'Ԓ,\8-̧8-SƏ˿`'44OЦMƍ{9sf+/Ѳe `)rĈc~~~GG_w7 m \~ÇСÿ5hBÇ;P^=^}vL7MRRܹN9 bDDUkG߶;-KJJb׮=ԫm[Gx晧_x99r(}֭ìY3={.iѢ9O=5ڵowyYʔ)O?aƍx{{өSGFN)=C6ӎ?ҖN6vK|RHMt raʔX{zر逈Hpo %ݴa׎0ϚәɳA}Ĉ1""""""""DMDQ$AMDDDDDDDD$() bDDDDDDDD  FDDDDDDD() bDDDDDDDD  FDDDDDDD() n:""bZuDDDD`A,))҇/ cDDDDn`pNPF2 FDqr6mX2\.""""s \F}^*2HAL>KII!$d1Ν;Cqww>IMMl6c6[Z-XVCDDDD\g0FL&#& 7772r1(55I&>/0zk":H"R 0F<==qssh4苁H|Xl߷INN)w.1܄vgt>l(AaLɤ桔Bիg\tI&3aL6W^cczkbuN*r|SNݍDnѣsN>}Yp!<<<nȑo+4t!!9s eЧϾٳ̘1CŽ˰a @DD3fb}s=A3p׽ٳg)_={vm_$r a, xyyBDDD&l}7K^f4oL 1y($dOL ޽@՜jƄ,ӛ +W>oݺ 4hЀKӶm/Sʭ̚5w}s&n}t֕O?3<ͲejjbbbxŗXg` ߲Ib|y.\d_ܸ7Сc_oe۶4i2=ztcy<(j9K,ui"%ccZIIIl}ˆ͕,%%ZǾSFLJ`L>B |&ӧ+WS|r֭[O>dzt2RSSi^ {_W쳣|s<=4Q,[۾^Ŋ4iZ=5j''O9{6Uq>}[nb8**d[?KPT)-AҫWk_O>Сd}.s^? B׷41᭥Ywy'II8qڵo׷ 383g`ذF|*~'VRߞD@@L9qwi_V'hԨ!ǎg4lx}رc۷~t*cZpUVaȐ|GlذF|/ժFQ[3bӴhќFѺu+{o~ʕ9X^zݳܾHI6lh4YGqFf3& Ţ&J%<ԹsG+ݻ'NdA4oތ/S|w,Z+S~V<ʖ pᆍLggWE[ IDAT)Я__ٹs'`ٲ612a?~={e͛;L殻ÃѣI&_ג㬶/RY,RRR)dz*nnnCZKI>bУyfDGGjjϟKxzzRjUƏ˕+ݓȋ_͛CsʕjժTZťNx n݊#G8 _mv/^g{; /}wQT -=B JP:t "X^{}}U>XEl( ! - -3!KJ!$}e=3g33;yXz .XnV"##Xf-?[rhݺ>ٳ`ݻJ*ѣG7 ?x\x S|ʿKʕڵ C/SJJ?ЫH d!== DDDDʠ݄=hĸ\rofa+0y网g:yY+8\.2<dddH#"ANL(>~7!~b(9˫A 婧UVFtQĤQV62(..P10UN#Oɓ? zСCt9Y6͂MYfG _P)FH'-j|N ͣ,rG-br[ĤRV69%)X3tE;H: iJF%qq񄅅EZĈ /IaӴtutc`Xܙʝ\}aEA)2%5ɧ `YXX\"΍hZE0;S}fL[802^^ a6$)61""""""Ro`nATQv" n{  0 Vɼ;Vb<)3^rB2yg%W;O=+aY9]ܙ sRĈHǖ'ea>YCO[`JX,Y+cKV)?p С3ݺ'Dzo>1c駟;qݺj՞"%%%ucǿ|(:vʬY_:_ܹѻw?gM,/!a7ZϷ2|-t|){}w{U%tb׮8eAb9,N+%Z`X/f`b/i`0. pc2eqV)_ϿH3y$^z9Od/@eK/Jʕ5ӭeDE(|3xGz v37n7o>| ^}[otmD""gw d崄L,˭]+oZbY&+bM|V41""R3`Ĉ t-7 [2nTuU@eLRR:u^CJ6lȄ 7FAll :uK/=%t套^7hhkעvZ\pya'*N0,ӇeY%BP#""r:ٳ7߸&Oą״i3tЙAn`#%99g}=/cǮv۝G駟С3#Gfʿiժ=GRp0:vUW]'L4Me˖3tp:tL>W{+coi׮ mڴ>jѣر=^\NԩC||IWvv6/ ݻSK=Nvܩ/bZ])Ӓ0M.nZbKI(&X&vecYV(S7lk~1_@fff͛Ic7o'>~L6Gy3>ꫯGҥܹ/ϿxR/[h ]\|ʟixy!+nz}>d|Qv^aϩ]6[Wir={gժXhI<~̘

4n 6KrCСZ]%t-2ٰa#0Z7غ>uq&֭a\.\pA]nÆ 7 c=>t(o۷KO}C1}v{SƽL*UN̮~70mбc|퉈ș"O, 9ɲ, Pq)9v6mZѺE t?3Ç=l6:uŋI &66Kh:w.+G rJLd%?χ~@pp0ÇpгgOڶmCj<4M =/j6[|\<ôit:0 ^z7d27x^{-c +b$wNd]a/d{?>Bzz ƍظq3o1ѱcנA=֮ŨYqf͈z[FF&))1 ,lJӦ2|PyMڶmoQXаcǿ֬YWr= ˖o_͂ ߏ^zp瑜|wd|;,\(_1ժU^ԭ[&g5eϞϚ|^/sy5۹s>=1~[|%""R "mO˲,ZvztHim8SBN^DDڵe̘gQ{nOO?#33=r<:^|eeɒ̜/k߾=?>_0; ,,آO}q:qh^zUԩ>q㎼Ό3=~z QQ5Xx)^t:o2Ǜona0O?աe˖l޼S?77ă>Bdd$:#!a7="O=k֬宻e̘'h2wzj wEryyǸ; gg^?4'vYUvm}ob)U7}=HZ1tЎM3s#svcٲ?Yn=\.]F׮]N4mz.7<{}nB֭HOoc?x'U>͚5Gnw߃} ۄL9g#(({ _|IxxxNshQʝ%T riӐY71vZÈz0D st|+Hy'4#&Ož={ u님8B[F /Dbb"m6yh"J?RnkҢGSЀW´iӱw^s{|1 zQƽ̸qopvgӲe,&[^xqƽw}4 t=S|g|t }v8QQ5=Ӽ+tH<͛7_.'""'9|Gj0aͲvYS>=iA/,ۋAst:g,;Ζg\[ǹÎɫu&55M[Hz1)))ԭ[BIwi|>^/Ԫ y|aʕ3z,ZB?Nr'0z(m ""rJFOI,V1e`0}nLO6[EԀS7zxYxwh l6[˜xp8vO-q-/+Va<{#t Wpȭ>)dS!Hٖ׫jRfϞuȟ.֬YoE+Dx>l7:u"""lHВYq80 Îa=L[r؋_/ۃacvnl0R,j_@QWJWWURzΞ={yWؽ{7at܉B|~رO2~ : 5j/?[(/ aS\İ͆aw`XNb ЈA*Ҧ-9_lp`\yac>I[g.̞SD.EStjJ%bܘ^7m{砗?{0.l-1~h v)1:5)GE<5I-bp*JJ""""Vɧl`9a`_se4L@̳?˺,;WK1N g6Byi`SabSQ3/,ƻCœSBQ2ޕq SZÝ۰L;͋e21ǰa촬̐I!S FDDDDDDʬ( nlb.7;|K.k.Z!"Le-v;YYYx<N FDDD xp26lrҶm[ ͊+iSR%M~3iGlذ@ڴi }8C֬YuVrHXz5S|Ν; w^\uՕrM^zҿ?bnơCx>%##믿fϞѷҨQCBBB!Jd4o9=IVV&鄅~I阦++4AAL TN6)1̘1G6m5kF^=+Vȑ7r(֭[G͙9 z^yIKKNڌu GG@tt4w^T ODJJ nmADD󦿵̙ի'=ztȑ#x׹Փ-cav˲p\|Dy, Ott4\3{ ymۆZbsO IDAT]6ڵeX;<ڶmXmN߾}-isvOÆ 'Bbl6;EPPzMCUX""""С4:*IvĔ3"m6pFίݕ*U:s,芞w|a.eРk@~}i׮ +Wڵ9 ~b>[ncժU,^?c=JӦM 2җȉ˽" "--t"#_񐔔incIE 1UT&&&椞Ӱa/_o\jj* 4hP ?;ggЪEԯ_uk֭[\2i}4OϞ=ٳsW_}M~}f޽4l؀ pW˯siڴ) gÆ m{ 6"&&ZH!򶊱,?_\<{tnS)"""r,3q9t(Nj$00?%)wM?4WL bJPnr-|7lذ*gك~ &ѧOo233)s94k k(Zeǎ?] o&}HϞ=z|Tx'ЧOozNZZ:/VZl޼gyN6mJ||6mOއ_/"5k$66x>`]?}IDVXs͖wr!|>ea`%6n^r / a*rgg88[qos ; '&&*@#))D O2kW'4W1x~{ի1r"y뭷~|\zNv2l|^OOA\\3_1qqL16lpr͹馛R%Mo`ʔOؾ}.-[2|0""r嗹|7۷p.+ 'Ĺrʅ^:KR1fPn _6s9w9KNbbL?2ν~hsXs0&0[KUyr{ 0 [y8Pc׮]8Z5L).1o'L9e7͂DDDDllh c*:1r4`@bQ"rĜyy͜娐FDDDDN@%o_}y[L~1QS  s/ؙBS*ꪯE= U1"rE+OH ()ZĈH9h@DDDw FDD;j#"""rD FDD """"RJl*ҡ1%gB<~])f``tT|& 0"1 R>Se!"""""UΈMAL RKcQ#"""""""RJĈ1""""""""DAH)Q#"""""""RJĈ1""""""""DAH)Q#"""""""RJĈ1""""""""DAH)Q#"""""""RJĈ1""""""""DAH)Q#"""""""RJĈ1""""""""DAH9rv:Ѯ]'6mڜoڇN]N1J%""""RJĈ1""""""""ġ"\?#S~Ύ7;^$&&[Yx YYYԩSH߾}ǟ0CiӦ5;_SO=M*U=y,ZCÆ h׮Vk bDDed̘\z%dffp"6l_Lt;h\ԩo駟rѽ{7VXɓOf͚l޼ի{ F8֭KLL4+V{7Ѻu+ )Ĉ3ߺut:ǟ8t(t2Jep:8sXw3h֬)|.6マD|l]6&vE1v쳼 bDDDD\S#""tО>ȶmٳ/M4E۷U ={O< l޼֭2v;=ztcٲ?nvE߾󽇝;wiEH FD 0 ,"11si쟶~hР>S~wf͚lذS?c d𑤦ѱc:v@er{Oe9fn|rJWM)ǜN'M6d׮8,b޼|ƶ`̙#ogKժUq=XŋFNx՗5j$v{#j`ѢEqy&M911yUny%%%҇O2EJ)=?|u1%upπ$vAxx?/_~p4STH""""r9[^WȽ,VI""""""g)SV&8jbkyY$(4s 3[Ĉq b=-)&<'<t1/YH2rXU-ҳ lDDDDDD$!eFiI< 7, ƜU<605\R߫X:d0 r[ FʌC}Go-Ѵ:9U3deK|_ Ky λMNꏨ#僂)5F&G1N;?NMSߔa&KwIwCKeT96MS;RnvslvOuXGTTDDEA Q=4iIC,\)J' AZ[ nsн@ 4kvB*jt6+z||&ebY&r6ٰmv)ș?R>)96q ӠQUj'˓JΫs3iG-IGqAH_un>=Ei;mb| 61_!V3KB|4NBjAxܸvo A-"ܲ~, 8/ L\RVfB`ۍf#00Áfh@6o9{VVn˕oDyQQ9G/ ,8pq< r>vOLL^UX➔|J>%8:kk[<0k{mD[00 h\>ίa glIYENg͉6B}{l-V sK9X$ ]ԩd3}|Vzl_G $-["!odW7upKQX9$fG30tK)Ǘjf_-:aa9"ކkpn5ud-jvʴ`f w80 e[)B*GŔ֭ox .}>nwN P/%==˅nb?##r&OEr9[^WȽ&ۨb"ܰ/4ؓfqU;lNaZ5-Uj&1N{֑pƆĜ@梘#!DaRr}~IRfNзINpжGsZ-fu|'\ֹA4[e疃ˎ!ܪ9!ٟn/g#%V D09Yhr8~rW VW1=-&,{gA˜/ur(XDGv, EʂI+]dzM-/vq̲Us:C#B|> $88HU௓?"?"g(Q ${fF @P!iT3 uش¶6_ԁ~Pzy fQdSg vYT)~l +!Ci6v(: rFHXՠ`,,b VlIA>d◭N:THdZ;W٤Y5_1M`131M4 44@D*, fTQGDGL1 b{˝{zMYpbveräeb*YT .}$eJ9=:ܤqB47$«1dee@HHDKO ;;|;ùTDTDJT0"1:A ?{zzuAhdɆQ~-#UBlS/[p: a,ɹʘvE &;;ǃ4|VlķJЁ#0D QꏈHiĔ! bDNӦ:S |l6N G v@NaꏈH) 4I 5bU :91MCpKpp0ǿ##rT: *A}"EqrBR7χ˥_#ErrѿHz?"?"Sroa BAL %ء G,D$MÏSQ9't}70hDD]E-ǜ_-3T"QriJ* 3yETDDD-bDD?wS9{1 &zQ9tjRp8*ʱ,Ezke)S 0 gꏨ#e~NrDTg%Nt 29ۨW-t WQ)uN~a981Yz`9+vӳM9k() 88X *۫`Ѷ#?zO"V))p)B?L)Юh[U'mRrӔDADDNI <<ۍ@fp8rQ#"""""g;1ǡ?)):5IDDDDDDD()% bDDDDDDDDJR FDDDDDDD()% bDDDDDDDDJR FDDDDDDD()% bDDDDDDDDJR FDDDDDDD()% bDDDDDDDDJRPÇNfܹ$%%s"#Э[7qǞfڴ5=;;QZI"""""""gZĔ?3N8HJJfڴ|bnvv6k~mZ9"""""""eZĔsh޼ =gڵ}}\FQ e9\ye}B[ʈHS&7)|c7os]v)vb o߾7ѳg|-bxPKOzmL>ҿUL0]vqӷoFŚ5k-wŌ}}2} ,Oᆜqwu/={a};1=zvZmT""""""R()""ԩ#?;ロM۶mZjS|̙8zƘ1c믿œg}رc/y≧ۙ5k[gϿ| Ǝ}/äIpw_u՗_~͐!70cTV=z̛7(H%""""""R^()'üyr;WolO(["*W^y}a9\.bc[иqcڶmCF +`0ugߏ/KTT[?3g_WuVc8s]6oѣV; bʉDFF2wo@N ڴioIVVO>93/222UNA. l6o矗;9ܹ?jȣ{ؽ{76m[71""""""RYd֮]K:tZQùDFFۛ￟M~}9m~d70.cҤg9󉊪 JDDDDDD1%[nL6蘭[ك?̏?Ć x5Oڵ`Ϟƶ_v-5j?hܸk֬Sqk֬% ڵkժU%66p51HSJM7 eР'ȰaCO#""رƽN֭VQ1`ռ,]={/syGY|E_7w߳g^s9o\3>{n|$$s狵1H1%tr-#6mI=o%ͼyE3|0BCCx$%%]={u/BL o=*\u\{5'/믿IIDDDDDD% ,8pq< r>vOLL^eYi+nzcn7 'e˖rJRRR[N̹iizRVLW5j;Yw ..0jiFڪ?#rz@\\R_`]ɩ@ɜ9ߩ DDR6e"Ų#QAHE"""RldY*bؙagG!"REҁτ1* #ɭBĈH;POAH1l/b*""eNMbs˚lH1L+Y&T4jS,J*"ӎ-ȁP,r;!$ENV`?DB%ecˆ]QrrTyoW]^"CD:K@v,HN Dr bJU#r{YgK~>B\Q#M0vv$ȉ}smHWAHYLALIWze :#oXI;yy|i& >!^7=$1Mrvۙ!"ȠR'FNdɂsY3K:?6g 䬤 DU"3R^}$w=l IDATV1y=RRwtoηݶwS9A;E3s] bMxtjĈǦ=nΉ U<\ΧRHHQ)g1"""ǐ\P;5\dy*&מ/!v6n/{mLAu.@DNs2vkDoh8ÀUӓ>tu"j˳YEA1|tٶA0V1@B@R4^U'dj%Yigj0$)‚MdMUw aoBJA6liĆ=nlҏ$rP#""Ri1cAZ k\#lż^@Ns;M2kg&PYi V!ڿI* l$1êY'>UVsi(#'& E儙vAC^oW@/g1"""E4‚Ԉ8˵a@&<~*v{ĜHG$/ؔAN#lܓMGV-ҳL~gљ{+tپ?qDrZ-ۊnY<>k瓄Ҏ{m.ߗ״.7g9 <Ȏiž^&ge ϸdAGekWq/6嬠 FDDθ3YT.G{8drU]_+GgWs}sv%aeد`c:˷etk&w~aMe7UŊ>ڷw+s^L [a;\ޞr rmĜwYy}z-^>Zx`Fpez=)gE'~eyKdaarTqt]_ץ!"~}y bٻʳsglgB&ل@ؐhB)]R Ҿ-2J@2&rb'vtEdI^|Yֲ:Ϲ<Q9kl8zCR7 |qHT^zTY\pKyj2Z蠡 {=gugäL#0x^6&^-ɂ^j F4>Yݵ18yf\(u"3GA \91v5Wjã"(qϻc *XC%&gQ=t:$od}ނkI%2r9!]X{(tv؜ Uxć+p8'-_.Wʵ`͡CΕiP\'AX{ζ?D QÞYΘfp-*]#:WAL!5NveL0܁-C°doebY nҎHX@?; uV7-Vd̖wXGF;NqВe ;kFDMuk$ҁh1.]aKˊ1eQ 18 TdHUMpC/7^41os96`hw5\ShG^!Yl>nj0CU@R "څ6o5y[1wswHٱ:'|.ǐəYJG[zXYªb"?ߡĤL4bc8ܢB2$ i1*qs ~Y'+◴qIaP}4} tGe=ޚcj,ՇNT1ZT[\Î;d̢=tP,k/`G ڠSӉ3kX^X8fkNfWaFZ`Ը1Sd~Ǫ(\,w/dz+^M;^:-'MX (CR|2wU`X*l 1v|UU:T{#T8Sd*Y:b5B -^]忤~>B/ .b"ڷC |5uogӡeISAbN<9)e|ܛX{y9 gn˜>&Knjd4ikG/|ΚS7Qըs]ۣ{*`sz6&Sh2$TvWUjAHS=\e_PWWN[ zYZ}B_Oqk]/u 8"(r 1 &JM9ĈPTżY񫔩?_YQGq"$t_{مLEn;"S`Cyk$= SC~ojT""9`JX}ɓ~]dMM5=`%hTt5{町TDĕCSv,Uݟ'g0GeЪ"&b=d`o~;a[LPowGݒPd*{wU`h:-Sεx7/E54 B~ wwKVaNXw`w6[Q"?;wREDbRyY<%}?JOr噅 9p`يAHn 2䘰Do=a?VXe'?c=DŽXu>{rgLIHV%{WReZ:vц}`"&Rz705XJzi1W;zu?#cxKVBY }ЫE d āIj<_G%r„ x}] v >\WVcP9V<2.* +^]x}m ݻ: yDd{9~zc,O'Eu2N_w8WlBg>O7 ̓;ː_'`dYܢB(E-wnijRTm? J*a*<2.~XnGN`rapIyVo~m 2gבQZ{SjDSaJ|?uI|e&iٶ :4 f=!d oIq;KUbr<9ׇ[Qeqa؜5Xy jϥƉ?, $cB_CC¦5.y`n> Sj$l} e9dҧ[)E$Ip%Chw%n?I]zF4gW{AK K.cl}0P%j`JM J Ɔo;q>d%DŽHt62B~bwkEa}p8 " ?_&`PTsʻSU`Q s΂?T"IJm2"*"&bʫoh߁D ǫq{yh>OoBΗᔁ;+従Ƈ+vAC5޳Ѩ H 6Lk0ݦ2ogӓ,kd8[TMx0!!Bm?Q=WTW 3.ރ;FDg|'pap*!Ɉ]9I~g;j, A@q qa1:oCACl{f1z&ΘV gPM|բwHl۟kEJ FtSੴt{Fkq]KVz70Y߇Il:nB^1K>xZZCUގWk֘.b{ (FFa:"j%s.ېDJ V J4( z'g 2Ĉ:</XqP*lRNʵ 9iϾz\_[%DŽkP*WVcxWnw_=DŽG]9~(`0sM ~8xiLo=~6)ڛ!b"ZMIBEBN5s^"%+Eu!_)*3az{Pt+Sh||d&bT~' MPxK0)쳐 \)$h;G)el)r"\:ɑ1}Xs/Êk6g5Zxl|dm9&ŨS`d*wuJ- Q6\ %yM5a] Lbɾ*榘&'^_WGMM1cU?yu*oE$CX3XR;|U0E ƈ)0"]WW'OMV X|:,FZ ʀ*ׄH%}?'"4yvuGj1OLn?.-:<=%: Amͮ!\=GrHu\WS!H& "(%[C z6РW]pKYT#,лk[}r8ς;FDTxV/;!֗\)^j0%ب`&a 򻙱(3#3s;̯ ąxWdhwU玬ߕbtObJl+a:QJ.rߛʐAn^iLej0m|9 ѽtA%,85Zm9fԳth(Y2D1HnD H%^bjhAK۝r=[llX^!)Ao901ޱ}~67aV:ihYr[Z]SyєD|+׿Jǹ";2U~I])Ɠt{9ɪDhe9Jbո{d8!<~EUD+0cpjW̙Dz B m3եqW_.c@cyt"#bĸG/XkAZ*~;y4Gxm-iXo-LCs'WdH~_.DkO"%BIhUb&NR; E"۩'pW%n 'K{wScT:8Un- Q̓8UPD 1CDD-Y]*' k;hB;YĠw754*E_gg!Cux[u=tx$E*F +>|Vp:eV jKB!ԟe[%NL]ʾ*D!a9dlC嶓tGn1 ϓ蓠it aW*or|ou1$cɞz'm k2cB=IPs"$l EML{qe$D(~ZRs_KD:؈UR KbD{F -É+9E(խ)%J(CLQ+ѩEHrk_VP_CW]_;C<&}V\³P>Oŏ?%J'a=3I9MZ"{84"f1B`B0by׳.޺oblI`z[]l@CWjyV~cևL714œNQb;!pu$1JFVÅ穰:?!Ȉ@Q1DDIwH\2C|+y(3s <cUNx-rc8}. &1<2 vUKO´2\,#NG.hLkA+&(Wߩ5WcJX~' !Q+.!,30hDfD)OjPzwS%{]5{M@DDA@UHPꄬԔkWQedC h.RhY^2');AB=_īJ?I xBǞnU@x601^T[%<27<]wLhYŪ59$jlsjU;"" jdPAp@t;ȈBT5'~>s9t%*Ǫ Lv*t{H[nFO\w)e̓Xl65~:ht"4n!"”݌lNMHFf ܫ1~jWRvau"" I)㇮"NTDDDDDDDDm"""""""6D Qa"0CDDDDDDDF!"""""""j#L&b1DDDDDDDDm"""""""6d%DMuO&&bZlBb"%($CDDDDDDDFXCDD:} ً2 Fdfu׍(ss~PHMM)`0PZZKO9rw}g$ v}0k-hk⋅())Ưˠc˖(/@\\,LX'NΝ`2ӦMV x'sw>`0_>Tw+WFKB}q ?DLQgwdlنInDJJ2*+mvTW`͙0`ٱ}[wuG…_!11WO:vՊUV㦛#55'N+@\T~؍3oFLL4vڃUtsrNa˖m>/1DD Y, &=nc۶HMMOo 'O@^TxaX^n_b ++3f܄0#6n܄7͓aZjp$vۭ#Jv l].{Yg… x2~JVV6={_m,!55'Nh+((ġC1{۷f Dii)$I°aC1axMgŊU8s 0eʤ&һw/lٲi0]p:${q@Ojvo"&bt0L f>wT*}Vg,̙0 `Iiju6""!2.^$_}w7Z-4 zVkxy"bAGii)V\}ꮈ;ClDDp\.,_ii1lPۢ"u>$IGjj_ 11~O,c͚u6lwb4'~rscǎp=w^ "=z f|_}<7߬)Sx۷ YᐚcN`Q~py}cfsR"##jqu#g^TUU?B{NF\{"븸8g˗MdQ(ǏkpYX,aHJJlr:Xbaqidee7{$''?~ =t?z~̞w⡇Gxx._.:ttɗ`ǎPUU͎M6g~ qb͚8}V\2g7c=eÆ b45~.]* 1kLz8.\MۖF{GIphN8 .f = )))ۮlѣqu#Bnؿ? & ذa#A` 1~"~=7d2n#;Z-FU߸x/_XVl=zD0 ;w?& [n xul!"Bݻ zq59f̸ ۷Kan0`KP("ZB;vC ٳpi#Gۑ-fG@T*{^Ab6 Y^7{}HLLit|f`V@a4={Fݻw޽P^^uúu+=ϡT*o_[|Q޻}N޽ "##w}DQd 1~,~nqlي>ˉDyZ߸8pf ,XӅ>}z{B… I.7 \Nvߞˊ:u ^n~uʾ<- §2g寨@ZZ.Ֆ4Irt:Q]]*;!maaaރ~IP]]T㇨_DXXJ% 7fHV  [ չ,\߾?>A{9^KgM""""""""j#L&b1DDDDDDDDm"""""""6D Qa" 6'QӂM@DDDDD] 3-H`d#5RKa"iƱ*QdCQ£l("p2ۄ(஄uJJ&.;]v/j5fz˅yW 3 >'| h?гg~&ONeٲo PXXtgO`ܸFo prs0u_;\.~˧q7yo_N6*1"aj6uxNXfB?C| ?/xBݷ2>]6lěow}<}&u:k֬o /"zmv~87 a!tx쳿ȑ#o~KP(4ƀ#0{C>}* v܅l|lT"j7x:*++ùsXsL0>+W駟č7N@>? рp|Bףw=z Ws Nβe`{1}TddcΜ1qXr5cx'pw###{7|W$\T!99(555xॗZ- VQP;]BTF1Ґ>|{lpt^|yDGG]t "cv1bpG{^/"RSSqQBDoC٨DԮ0CDDA;Xu3ǟ~HLL%PTTtD\\,~)<sC>ui~_x۷ok1BTZ0;x?q/ӋÁOصk7`٠D0CDD<{~Q Flll{ݸ޻GŚ5k9f ՊE}Ǝ!j]w݉7|iݻOII?d`,ZPSSٳ//$QD 5$Ix?b7hڵ_#G|nxgqr|if4F<ȏs0ly罘> oW`„!'+^zZJ RDp\.VQ9Qx#22񠏱` KD1DDdz}4o/l6#55?p}}~b ~g?ٸi̝!$I/K~!c=Ao};%ݻ;q!U}t~g1sm3f4F KDp Ohuuu<{\VԹ,: uR&I\.N'k /",]]$TW 55 D!j5fRBQwZ  @sY }s;|\WrȯzϜ#.%bLu2'rIC!C] 1DDU\.3N "Qu-LuB @Pn1aۡP(:"ѵ:!"D|Ϭ(JԘ(D1AT^9_T*?D6>u Lu2 BE( 8v86 QݻR "5Zu2>""j5*(DAU@V_ 9.?DIWD Q'?Yoy Bu5Kĉ|UW I.(*oGX"㇈CԪSۧ΍"N3YB>+YYY̆!`6QY>P!'e1~2~P :A ˲QT@PVVSBxE]VUU *T*! |X$C!ja5LD Q'U1Vt:jja6 JF.p $y;"ѵ!"D|bdYwqq8(,,JDxxj  gaSe.݆j8N*hZ(JoI'Fnb0~2~] 1DDLdt\(T*8NTVVrAeH @,lD?8v  [\!ZuLu@mgؽg/BT咮t|`M+K.;õ+.[8L6!㇨㇘!"NA࿼(WVJ~g"% $6u`"D̤o7cmgC!C]1DD,jJdFQ$w(C+vv=׽!bΏ4;;l "jw: Pg׷3~?D9~bEL Ɗ+/ Dnɲ K$9eԑ;w(*P'LT*-eCt-:r Ohuuu<{\VԹ`k~!<(L6=(T*UfW_-† P\\h̘qfϾj{_| wm41x < 99 x[>h^Yx V^#FkHKΆvNRW:KYyIt:a j_<?k?]Z  RexJ!?ޖzϬiAnc˱hM~Ͽbu UUHNƕU=} V.k__DEEA:䈑l Œ2oD㇨-⇓WwM[ن ÐZjݻwǡCѿ?%{k,X1ƍŏ!`nV t,-%jVø\.J! BRAEoH%㇨-GP@$Qb84 x.u3c%(++wT#0 111WnO H@߾}PTTcǎ]t:m6׏(Q I'j^3~?D*~`E5v!@lll]wb]x_~={Wo6郉o'< Xt***&wPϏZͳDQUrw:?DϏ "i%KTkڴJ嗋d2\|FÇᅦ&? /<%K믿AAA! n${Y%j;rx;ŢGxJ1SД$㇈CԪS;5b0mT̙PCVcΜ|/R{q}"jW~$Ap ㇈CԶ#`t%LĴ Bqqx,X9ZT0%Qb7v&b]5g~r(OnDDsNY}C!b_Z+bZH]7/DDDDDDDD QugY.&SP{"P+4"T ?bC(d'䂍`jd6{uVU8?bD eISl㇈C"" d72~DmZiiN'`#PP+=Wq[e㇯*<$bD5Dz;ʰp&cKФd0 CX!"""""BiIۀ1CDDDDD1-0D"""""z0CDDDDDDDF!"""""""j#L&b1DDDDDDDDm"""""""6D Qa"0CDDDDDDDF!"""""""j#L&b1DDDDDDDDm"""""""6D Qa"0CDDDDDDDF!"""""""j#L&b1DDDDDDDDm"""""""6D Qa"0CDDDDDDDF!"""""""j#L&b1DDDDD׀% &bx0I96T]l"."""js%-r!!"ꂘ!""f+tE+\8uƆ jRddRD 5ۥ 1CN\!D %(I& l6@a;Q/w Ɇ jfVs\DUBFA+b:-!XD*\ W%sATU.dX IDAT^AT+e:q=AB8M)GG8a/Q8\2jl28ŕ.8 pWV9QV0CY2p@|p8ۉr #8p mj93~SD^DQSj*]HRqC1DUq d01C' 6ķ Y.U8W 9Rcy`@pڌ_/(sLxV:S"ƨBDs KYAp0%Fa".Br$$(ȁw  5]AaZ:(L4 Y?Z*kjl8Wĝ,%Jfn0C;p(p$9 }p!-HI3"j"6UXQJ$E)q8Ɖai::4 /.ġ1*qPN-Re];~.U8CcT؟["dPn~0H 6y۳u.<aޕzCذ Щ!HJ2F|$Lb~t:>vێ pȊƇmc&c](u`hw bpJ2.]kT""]_/7H6rgoJlNN$EV*q/9[TOQX%D;rцpJ[u'-vuy *й'5Z#6昱OPD̵VY W};ol4BXe +=mk$`2(y?`P%S5a ²o!wFq!//pXRc\ic1d}^X%5b1*knӸukտV$D*T_-BեJhUbVQ]r)ٖc :,&[.\ا׈ЫENY{J~0s-: )N \?XyO$`?/'qOJHطҭ3'd1 }7H_̇&dˀ4 *DA}s,^aj+VYOx&W y#:C¶Sfl4X{76r#oDE}x[ W5~)1*wSh Hvd`Y3 &Z3,#)Rb'lNecm؛4-hr%bH WT 5v%0KM cYs IQ*ݾT (D ڨ:筨H)O/S54l2*,St昑!c7 Y9kS1W׎=b"$oNN&a<;す|y{L‰IȉR,PѣK/ximjB`.gue%d@9Nfx.coDIL&OIEwnR7A y;s! !|AF8 .Χ)%~0H#7ȷFr8 a + qRbvHKIq-X6O5U}Qe}MQv\ӻH#4R!|,%.e).%YJ),Hqݲ>dIn[>-Kf4gt{υ4=Gs$cNs6f{to#A%FLV!7X3Ďꢚ]y4x:3V"U.Jl:^l?0\ f1*Y3 ̵ʉӅ6h,f u W4zD 8V`h?cxCS{NU|uL=gFQ^:J*vALǾ+BEcc95ܧ򉘓mzW%V?v'/X9uQ@UĨ,ۣNjv\ov^CŃ(]T؛eA3>l8fD.*TZH4MĔxvu  1$Y t a:H{]\_0ѣ'81@N xkI).LAkҊbc\;RiطޅX"w gw`'?:wfLf&b5$h;X} @tf~#j?L~~޽zNfyYfj8njð$ܮ=@H$)!8w@Ӯ$T[CZ}C lHKRQhp"\t/F⃭S+7ӒUxz9EUFq_ 1Sq2[/Il`0z{43P!wx >NXc->c' 4MQCz+)@x+IQµD$H \ eHI@R"$AWk? 9qԧk]@`60@:Y԰}P=CLNWRER `Q+Vy* J'la&OѧAuAӨ*+0 ͞m>I=k*]񏶙-c]T8SjULײ69L";D5Eo~y=;9jIr-?Tdg?~M2u\`T8X×;EIOѠWѦLr@r+=qڄ>*ײyʵ"1:1\+jDz=z N48 oJÓ+ Y$E+plT 6ABE|].4ZةW*t)JCS4?Ʃ0[p`T)MR Dz]MN\b|siL2!Y%Vuzƪ8/;q`"d|o%:8DU/ Qf'AvH]z,vLсTʧH-: mZ8^Z|+s(ǂ"32W`fZjb0B9cBov" wOj%QHIKR#xwbPRRb q0,?cl/m/ͳQɝ`T+yG/؝/U1cx7 ^[װhn&O {ur+ơ\ HVꘅkLJ8cS QTD/\kD{Z[Jl?m1{XVJP"23 @:ZqҜIxҨ]ɵs'Y=R%9U'&:CBJDaX%O|vs hpp?>Iс !*u\#H5ݠ砺pЀ^qJhMKJԵf^'H(68U@[`?AOczh*ܰ$k^ pѡ޽vC6?t` s\3O[==k36pw{+q ,hQzzC8+ENs.W"6W82 [.J,{PrW w믈;e1]bWLzU~=_H {z(wfzvVxћPWg=a) k؛eFGr!rkma#zDžjq@8%~>Zu'!rĬZ:P+@~S]'&*CbkfSj"tnN"yt׻+-1Jg1eFZY%JӇjO tsDJ`Jr+$(1m@(L2(39}Vk,0`V;NgVa@W5쥅MS*@h{4wXMah+pە^ct]>/q,iBҚ%y Nd^anu%L8_SWnFp.pԐd Xf`20H3\3mNN J댹9uxfEuVx+XsȀMnjCbg12zP(\ ND&i(לBiNBHM¸ߍaN/vT "ÌA:LIB&a\ ZPlp⥵xb<eF,2ZBomu?Sj)zyCG{{n)eFo(0})t4x@RBN8E9ʵ 9F`0XruLOyiӯ+NBiP\;fJ_Yi:ғc8k3&v%~ىMrr;/êzCC^$56ॵ0Yŀc#1$EC8gƁl X~9(\˝czWf;?E6+V_@LI*k]]+`3A8ee#<75{ϙqK`C']͹,9Z*??5O ݻ|sN;cs& I~8XnjIE+sHի<ճwrs@W>mv:k JQ+tItċkJ&"r׼aarb6$x8!A+NovqRJĤ [=rQPnǝ"1Ϭ,(y/5(s)F3d[B㲊 &1鞖ԣndڱ*bFM,;gs;DWG_6|S/?BU饅J"^Z[V eW0*L0+^z+!J)k$dCXL ̴Ѐp"DЛEt3R]lu_)+\y ! ӻT5ZVDDt̩O$A$ݎ7zSft//A:T_S+XW;Θ@. ~]U< 1Z9VX߀4~ @t(CG)"%a\Qk!qV^j, {?oÈ zA2 bb%v O@30YEl=a[RU9(T_Qft`W 3B}Z|^S6Lj7䵖 0E\;j59Zj?u}tRb=V0GDhL3*{ )yױ2O(BUM] T*0;L$v7=~X%G&LҤZQLµ,z05 +0ci0!YTBT(-Ǎxk9d[qڈFC3uMTS&t*kLw%},)0(|'HcPԗ;*PXZ@oqbhrsXsЀQ`'lş/=~R,Xa:ʗ_~C"\jGwϟgaVj4g__0EEI;p~hX _6d]s\V^J;``>Mp-w4gzT->ZUس5w{ $́!l&gQ3-xgS)qp\W^]Tr xfe>\(|jl?eZ!kUr ~;mFT(+`= zƑ,b1{p$/ym{`6eTkF4F|ՋӰ6xjTc^!::5='*iol48vކPu￑ݵ7=`9wN4U]yVxHQi1oWqլb;~"X\;, k2kՌ xM}1( 9vN2yev2&s^k(ĄrX5:Tjg_lW%nj|CYiFK+t%=DLstlj VzRkNAm{2;Nj.^'2JasAQ=$vToGGg%5#{i^vp$D~%UNWWs4:?#M{`J6n9vVXUrsv^ݯ//ށ N\SSgՆƆ} ̵Nâk$]3 <]zlH1ᮣs)ۼf'RE{fzE_a#fLū]xc})h0$I 2/x1oXlEv<W F֙0r3i虴|y1NG r4-NR.SkeI$U?0J1,Ep+2,Ee +m4!i{Bu!?a`bGc]]̝ƔQ0x*5u==B#Ԏ] a IQ 3v16w-~}>k_CH⽖gpUVsA``$z \N9%F0E0'`80u@ R;~:RoE8<:e`];E&D>M]b2>#VZrsOglw`fZ&$:luKETUYQ~.(U7vOZ@Os)CpI܆yߤDa1}θSl)&eܣ]ȷ97(H9N0 .0OM g.V\g.Đ=X|((8NqGFRH]/ggxטiHْ!P"1~T9PU]omX4zUrg kVEՠ;Y$E+01HSغzY F@1MH!OfK(g εɓRC58[hG)*;SPG:E 1~(ӱ145B_t.&CW 0wHƤy1pb/LC(~(~7Q0^gtL[0*{ϙ/ :ֶ?}D !lKx22v[oFttt^(سg89sf!55%ظq8ß'ӧ`۶tǏybddŋT*1cF#,L_Az=ϿŒKOOQQ1/ѣGc+W૯y1vzcϽ @EEBBBѧO/qx8"'33vdFJJNZݨm6[u6deeaѢP(|>o@f)zە_3ѩS &LXs{lj'`X!C~pdffS7o.dP"BH[silߞI& !+*+ ؁*#L,nETT$l6;v؉7뮽m0p&?~(9s;wF='߾}o())ERRb״z1 ̘1 G+W[ JE SUUT̝;ɯ;P|EEEyw#>>\30yDt*#v܅u_&??.\{1sՈž=nz/x5HKKCVV>|%%%[0uq!1F?&M@Ϟ=p]3nPzo(..̙W#""%ض-V Æ JBi22v`HH h4Z>BJq|A.oۖQFbMzc[7. 7߼_hv &ǎ vڃ!CcذgT*ߠ׶if8qYFϞ=頣1 tŇW䟳΁aXtZoIw̙3 b@4u~2xv=w7⧶G+ 6 `̘Q(,,ls,!$$~SRR^zBu{B^^> ;;]ƣo>~̙8{6 gϞ*_HNNœ9|>_rIlڴAatBB! ȍƮ ~kI;0MߧO 01nd>&ł7>rFS`ʔٳ BXUUU(++òep8ѿ_ >Q(>ٳgFѠ+//(!Up8( CsIsbRSSlrTVDXXpOJJ2zLy:$I>a9vrs󑜜33&&@>}zp%rWXAHH D !, BBBݎHLLk=4fCFN\w]s׋QXXSGlV}ߡ (bȐ?~\up;oNըfUUUHO m"?XVlذ}qXرCdddB8q1jk\vx5'NȨwCX/lW CN1tQ4KnW]5 ;vIĈcN ::1{èQ#_j5|UooBѸ82زe+ΝSP46~XŨQ#%)Or'+BCCټy t:n]yV\}+4{ؾ=6mAjj2 J]H ^yEK|(ǒV XӮ]$1B.(H/kx78j* 7x=|'ZVg>^VJGV_ 3fLC>}6ii7:11'Ndb^ \=Qϵ{(J 26fGttǕro#eq睷_6; Qlh(/"o4QVV'%%I1d`t҅:Ky[ԍ-3gθ*;r|ٗ\#Xzq-Z(wپD+05D^^23O[L!]@!$q_#+, -h~Z lv9s*:qܲܲkG=EE8z&?~Ԩ8|<ɄJlٲիPiC?㪫&pphdeeUb`{УGfٞ{R}Ϟ^aa{%֯߀gϿ~r҆}$ C P\J ;w`fǶm޽Wq<%ġCa`pyjʕqb2dBBw Htk/j";;1bD×7ذa3j2x^7yKi^4"ef›o.Fnn^ja'x\J!mI޽q݇rhZ׷Q3cǎ]Xr5l61}4"n~A m*LMEn;v޽0,RSS0o~X,f|mW^9W\1:K!=};> ,(8~bblؤ$O߾}ݏrh4j#G6uݻ$+vM7"..>&πa4b*lvtl;$%%a֬HOߎO>̞=S1c6lш8̙3t)S&c߾X~#L&#"""0a" a6vے1o\: iAex>=oc=nw\KKˏԕǻ rss,]4^s(p:p8 $c(((Ni(ʈDB(~i9<8RVlJEϒ mj\L#b{ zp80c,6}q5<87| J_}UsnϿĖ-[a61p,ZtKn޼?999P=zs!\ }T]P 55 ^界ٳjpMQȑ#? :us_>}=sׯ/B!BJ43Ui$̔)ӱeF\蜒( |^W@p8Xlݺ zDqq8zwAR~O? ܄zV{K.]:ڵ+^}. <W\1N_5kq}߬q110axt܉DB!B!mmaSL#::]{}t z?ѣ+6mڌGA$efŠ+/[nƀ1vx+zuK…[nY6EEEkx$%%aQ_x;>EL -K!B!mDL 3ڀkLqq :u x›oXeYŒ%z-0 y6lİaC1dyߝlu^P( ஻cpƍp=aٲQXX)SzӧY'|F}ϞE5~Xr5\B!B!P"Ӛ۲ecb&}}uםdDXϗٳ]Kv/૯cqQ|GX{_8NϟǮ]gc̘uJ!?wƓO>Sx䑿6zÏ0uT7+VO?B9r>VZM.!~q-Ͽ cN-,Ė-Gٳg_w/O[CIg^̜y z\߄1cLEHnwôi0v$<O>7L6fs<#۷v܅yDc4-BSGb:to/j,_=^4yشi3z=6m/~6{_K;BaHQo!?Ғ1q 0<&%N S^Uk:I8?A>}Ou[lls p >ѣ0z0B۱ IDAT(:p Ͽ#cRSS`4GK}1(…۷BBB JKKW_7^zPմSIP^^,_5Ê+~F<5j@nؿ ֭["?5c _[o -m̙`=?q,3ִ 80vʕ!"8 <|7hgB. J4'xo99$2 d<ģ!mRDX90|{ff&+/w xg^>|˗M;t(,2|6 [lCF|~CE(~\8C^=n۰aV+ 7uUطo?fϞ~âEє$BeEfֻw/,]BHPyxw~bKWOE ŠF#nfʋ4mz| ?"~99x7hѽ>WR&ˠVkhJ!䲢D !nF}}p:?'xaaau>vw0y$>01e$<ôc pm1c:NG}Նnb(//C=5h<|2|X~#>ch4 >l!%ՄByO?mۄu`͚UN.s.9r݋>qqVcϞ}طo?XBEEE_?|1,]f[x3-_CBBW<3_E˸{/K~ okI;Ҫ(C!$E~ZVΝ;a]ƏiUPEZZxG߾}C;th>0Ξ]T@kQlt:2xנP(}7,Fżys_Nܹ3OCiu!аaC;a۶tϾ[q] >fqU0dk%8} DQĩSЕv,` xꩿ2p\66n܌W_} sq[WO⡇ŋuYYPRR99erxHCi]T# @j 摏} EG?<DO08%$e*q` ]8zw\. <8fμcƌѣhǒo~ҥ3Ͽwq!u((8~ZE^k=4E+{):](`P(xiBZGmmw3_{iinQkHd8&hȎ=)4e:ld^GrrRڛs(p:p82"!!5BWN EUUFJN!-tP<8 4;X)4N?%b%<$?fӈVMI`lFi j3U ,˂8 N!A vy a)~!X`$`qX\mU=#hF3uUeY(JShB)/CTV7!?n>h(l02$uU $UX!xWCN{K(:QUEC TUe(: !̲,!?hnyHpDL0䄤 $Qƪԑ`!-],\W%++0i$!`6QYqlb?PҚC:vAu3$NqnUJ-{l֤e1$I^WTXKh4(/!",,v # Jh4<+$"!?xh1 LD <(Ԑ8UP𑷇׀VKZ\MØh4U0MBD: APVVQFg'B.g1ALBA« qjApo8Ո!-wy$늋 (,,B#,LRc* *$a`0TAP*P8^?!5cDL0u&H*hF@0CT\#*45O25t\˺+ 8TVt:!IDQ A$ډ]phM !!Z[\(LC(~(~C(Cc;8epԈN SE^CS2Ƶ5wp:ꆯB#zϚs bWcf%ϥvkb?⇐֎BO 5{Lq!q=*8V"$0{ykeV^W"EDycW&=Wk?Prt N`8B lՅ*KZ鸫J㹚RM#ueJ$j|4v 3!?!4ٵ3ck5H`xm(`DZqPW$Xu?PҖ/LA0µH&z,Rp8`2p8T*q\u1pDBCCFL0ЂA0۲ 0h Q؍t,몌 a&BbB(~i C:JF0:qD}oW>!NLHUA`ENfZZvq`6t:[<?Pr9t "U״:$$e!JF(Zh4PմsVh`Z8q!?\! %b0-v^D I,ynB F:1y6%I Fƅhi ȅIB(~ilÑ1AL#H8 k;A0 wb) DZ8NJ;?tPv8NnRBCHk阨ZVa }YN,WWF%ͪh eP(hB˲r"#!?FpQ,-m݁Ј WO}XxumkD i9(Bh4$hZ  !⇐?DL0,;}!aU$U(ҦGø軯H*t5(\8ѵ.!?NxZ1MM ^iVA0"vKMa^ƪaT̩@ I,KvBF(:)~!E㧦5hZRG{iFT˪ 8#`ĚĒīZ+f{)iD iN`tBdU+$B(~LC:JK ;L$B ~`z$0^ &mWV4,fjbB.G1AUWU|Ua S%-N4>VܫQBCHˠDL`$Σϫrό`ī< D!B! v3+_IFثk{l!-үN &CˤMa(y!* BC(~(~O[ш`9!M^}c7gbIn QѪIm*LNبL :FgӏЖNC(~(~!P"&H0pWr$#c{xUC:M0i bM!nP"&H01Sq)Gv>c;LX!?c47J F0e!o#H,MRhֵGb`D; :%m5-?^!tG B Fh#HfH> kepløFB!BHB ؍XxSKB!}GUsO&4JBAPRWWw]}틂c]iBB$HogΙs~Lf$ܟ0gs=s?Bڅ1=`g`wgUcm9*i$B!Be(C0v3$Yƅ\R=ׇ]UwjPF !B!&!+Mk03|z*0f B!BHoBm5bTݷX`ӍK룢1B!P `VWɰ.6{  HbXȻC!B!](>SW$Svϡ<FCbe3sJnGOw:F!B!}(0v$ o~[Y1>Ir-nV7H[~?B!Bڏ1=#}X9IDgg7 PS B!Bz o-ۤ;ex $?%j>#pi#&B!^1=! ݭN Xfև!B!נ@Lf_.@v3 >xJnB!B!m'&<o c Hf@?㬩|/|\vd3 Ȕ` ys$c/Hr MaM!B!et\.e;a-^sV/Ys5B~{/#l|l$钵#Û`1C_uZ"G]ZZUmqc?B^:+!B!\"Ӊg༾k |܅PIP 0?CX[H"B?!v8 oHoq0pD%^Ю ڜg^lϥ9o>'m(\AOq~_Fk۲ڍn~ڍOC~3ZZI[ç^OAb82oỵ^ kKl( ~Xrav.-XEC!B!N$$\N_̊aYA}@!ɵ~%Avn;[ڭ/@ >6o"'~+pD Y.u{2 ?uzBd:8á YyۖA=3|WAmKA C_0}OFr@y[ɰzW_{ށ},H`[^NEq3Pj6c)a4\i(VB.$}$׺6NqB!BzmXwukv[ߚ҅"`&0; PotGX2 ϦaFȋs + :>vd zO{}G) Xޮl/>q[|Nkm{+!č{ O@^UCP=;ݵ>~,!)ktPCCk&"A`@bbB߳R/Qtv :lӏ(`0")C ,t:d28s#] yϿm6<q(U1K1!t"LP!+1.1C5b!B!B. B!B!\$!B!BH(C!B!rP B!B!"@ !B!BEBB!B!݊CtNNHwDB!B!JA@A A%5!B!J/@!c1HC1B!BJyj-QF !B!n2[@ !B!nRDzI7EB!B!z"bH7EB![Q@TNB*<" M"%BH,%Bj "C' B!v^""1RNA!D X"r/ mBHV Hcћ;cI35!@ECEt;!B!)㱯B A!䢩 US(I@ !cf|{5D3JeHVTeǺFjҢSfwCށ0 u ~(C!")}JR!3 s m;$䝱 IUXaǞhxib Pc'D"TŢڅt?!BZ (QHSǼFj8gL հpp['d!5=cAl 2=C~I$Ij"eBÓHeu<"brOYdV6bZT#tC!-9mSw)j:ꓕ6>2d51TS(ub63rܙa-C1%SE#EV'[%%V7}NQߖUb:wOUmS7;L BxVTeUxqEuo>j B3* AdZ|_h ނ.}R}N#~l/2cɦzҔaT'NEUiF|r ʼޢ<YJXyۊz>U%4ZD PjeŐ1BϷ#LᏓ#PVgǍJpڡ\ۀ: Ƚ8Xuv2Æ 6S>.W'FSfԛ8Yi)èO (d6r뜨!JA)g-JvYXϺ@$kj:x ZzԻ9b Ǡ%VΊ0z+jq Mb~;lD5D(Bb2 \ˡĐ1B.ݧDI IDAT%_h:),oFLB)g0sSoˑw/5_Z'x};Eyb"嘒)!ҦBm.j^^#LU&BN2UX d^=i,Xֹ? wwe5v* T\#;{3!!& J8 `RZ UěbqQk7j=\f˫j`%$F4T1 ވj<1#Avk`sGx`GZ~ey^#2UPʁov5pzJh,^Y]pQcHnp xjmSsVdƤ4MEf8`;Tf>:.Ujw_=N~?aAJbuŒmEf5!9j½#\ׅVt=txbF4*-D3CbHLVF-9*1\o;Io4`@)gOp >.*3\Ǩ@xH?9S)Ym"= ǟ)j ;@ {SHOϢGJCm0pgLLո/y-r U`R#_bŊPXX{s}lي™3gh0lX&ׯG|v=6%soQS?T *+12Y6$Frgb*ybOF LAF+ 1n9Ln 2N YE(9|RYo|#n< *6ףa=Px E68AK#MM&L|*?FsR̉kj 8$,{8 ZoSгre Q<.d+qdRԘ7(Ŏzk9H"^UĖB^fW˃S#2 D xcJky,r Lx`y UӘ,"fA)=(oAPlv70;Gai}}88іz,UL@)so/Dͺ1]vW)\'OBLL˯w[nƃ>Ʉu~?z vF#y6%5 xJ wU 03Aix '*H"%ZsR8q3˫0,Q J9Bpaf$G+pPL9<gjC/˓?T"1CdHӐ8~ګ5CFQd-!G)3 ԙ_簣F0bSh!wg (Pˁ7~`=)5VU b^Hk,p20FC% +lzX> x~`@Ո[<vaps _Ot Tp(@ov !Ypt_P% {wŎ*bFf;Ǖ7T)}ʙ:׾1!*L3\ii}t@gFze;. Yğh 1jF #Ux`r$'P㛝_nk,|Gڐ4U%V;cAB fIrgxf*,#L"-NHVdƾb 0&Cec`-*l(n:Cb #R^Y+0u, EɽĘu `TJp・bz3Q@'\͡ʹ (M99gjx|[WTcD?!=/HL(ӣzw>a:u* DT3^[[CcӦM8t0>۷>;hÇAE=zÇ@||$ײ`"bC{) j-"^6 X/Zצ;Q>tHIIܹ:ۇgyn>OV#==1]6?1" L^=,UWM:WTT;·~>}}w~Ev( w/ !d2$I/իQWW~X.\~Xz'sHJJ_{XkJQysફᡇ;]Ilr\ HNNƂwb1e+--{-#G 1iD<Px?y"q~)\u46-..ȑ#P(0a<|p`-u[>4,} p,`B61B'8ӀoxC y0"6L*`f8XaG+]v 34`Nei^SgzfXFYohUWS:yr "?35V ^ Eq]6^R+^VUUgzfz$G+pą˻|?} QԶ jW!Z@XWɘNz *u52Z/_bElSNUbuuE~Q5z\ǟWTC0)MۡO4) aEA+#aΜy3g~Q ѣx"AhIQ#qA8=?7r!++c1[!92VX{~fϞ_;e_z? iixpy{ÆHKKŏ?elذW~?'|ӯ /nF<__~ Ǐ;3w}m\sLL8 ӦMYz<HLLŋeeg?c֖K-32pa=9<W 6BtmEy[ 4u/>rgaG J3\  0!xZ=d=;pŽϟ#q% JR!k[ql=1 l/2aGx_D0 2SY!oUkʘ"^\Q';6͹+~j+{Üz|mmKUxSm.;dix02ZAM؂pm0#A{yܦtrԦV6kh&*3`3&Ep-G\uP͂%Y6ծrx6fu%P.]Y-pce0kqs?R^ST,cThf #N]tW#2UA 1b<-7 ;ev๟-2c bP( ƥi0޽*ds2l)4!%Z8V;>Tz~|;åtnÄ4My=h6*Bڋ2b:oЀ9z=8~86l؈_~ QQQx3G8{z=FȂ`ěoz,T}\s>puYFV+/ > .l4`Μ(--ҥze=}Yu)))΃[P̚uD/cN|̛76 ?;hy(+;_~Y#G`Ոc=wqv ϪU?![q!de ouY >ȩÕIrCGsp_e劏cI3ԹSggFaYvdfW#eЩ<>\{&Ft yH# P@ e7JxDI־)C*߳vOwr O~WH Dm<5Pˆdu'kKhMu8rΊǗ?9.2U T 7{[H~Hu(֭5 (d ob|2;Tfݣ_9,TcarGsAεF,C0ia#N2tjq2K5/V{2/;'l0ep@X%lו=r~3# {8'W+M}y=FabӰX_;LJ"z͚Zـ˛~XwTXaGY-Y_xI?UzG BKB;nCFHG᫯cv>'==2 GũSg> 8p XE>}=~O{ݷ:yR^ohy%%l?33뾨(wձX,~w-Cyy;dZ6  p˲Vqqq?ڠ"df/,,IIMYB[]VB.Z'x'UA'g fEOp9WjčJaEf\(8QaCEe1K0%͞tsOW- 2; ~h9+]g(Jj<wgZ%9#B%s_fjj: LЩXwdwQŠAmMn]?Ćq`xks|B(s _EXjرcO:9aa?ӧO{edgB~pb6 7\bv\.CRRR/55-Xee6l؈oZUaŋd> 89JR(:.5"3Q٠;ϕ:"۽Ee`JFMLXIYE_M7ErB/ \"!9c60{aZ'xLdxb<9r{|99[** 7x=}wCEE%V^+WnQոvEEE%6l؈zyy{sAEE}wpQ?GPPpfo᮹s砪2!>|u -ѱ "1R9#C'G[Е*~v QۆV]{%bB@k8/ CS#'*fdǐό9bRO|[ZofBW:gd{d83xeuO`Ce/ `pMu١{B;X7΂4b~3 %wcV7xl^\QvsVѽ̓1׾u>_jZ~[%jD0%q|cua5:bT?ڙDh9rj-~wc-^Ub`4aV\cw)&hhR(zM{jtM B~O?%2 IDAT~FСXw]@wEmm#gBBxŨE||}Ϙ1czS%o/^ \.DŽ ?-tעO>WמD7_`‡P(0qx</P+B.. FhO&Ag .'ȟnǐ.P- dT{yh3\V1}g.0w_ƛs')136h,4-KRrFbٞFLVD n*s)FZwERkvկ UxzJ? f k0Ȭd,P$Kl j1ÖWhJ#3Hʋ&k)*Mg0m|۞5s=6춬55u8p37w;Ø1іGЀ~j]4Qp8  kqNd64K,ϭc|w2t:MQ4Qa0*߀zc4{&wz!s V7`|oF4F$|+>uez6N0YE|EkXo-c  "f^5V/X %j<\fc BA&8w?m?*,%bےmx>}ou:SFE0feۯ!!xU"vevV@.'#^/rLJrfgEq=త`^;#fNILFH,l".\UO{X0![ajI뫀0ñh1qJH7RByAg t %PȜ'.8ܫs}[/îf,1-0–c&Dh8hdSF> l=l+x־=۪;B1BsLRnIϕ.FgVs\Euu3C0=ڊ?qKE!B!rP B!B!"@ !B!BEBB!B!v2A`E*w/ @Pc 9B# c 0Pq,ʈ(A"OAvx!lن)S zl۶W]5ؾ}~u=~~?/22wpG||\oG\\_DFF߿Xj &NSP\\~/{Jv΅`=, Xr59}rrf]0TUUcӦX6dg E?>```͚ۇ1cF 駟'Ow=mݺ 2HW?۷DMM-w"7w.|l_!%%sFuu V\DDX~FpS^I 6+,,sjW^9VnS F$!;{d2o߾ Ĵv,8pT*T*0`@|;w6rrb@V|9 }>@Я'P @%Bɱ0QFL'b+䨳P^Қ:0 >;Ăwpa:ڕ/%%%xEE+q\9"1m( رy='.Q4iBG3P_#hӮMIIƁ.=z`IGi^^ 2Z!HO 1b8mgH h4na3fLwn W^9"W&EE'|ާ|J&ye{@jjĜ0P 6f9Bư0fEed;BE`Xܿ nc۶HJJrKo'O0pWUUg{PNƌ1wl8pJs]>˽o~~7flqv?ڀE(%eYt:_~Y(+[h4QQA$IXW9!r%h2 ,P'_SX,ʕS(ZSjf3]v6LK*+pA@FF: (b}lHHp?w6lܹh 8ժ+Q^^ՊӧO#'g ƌM'!YO'22ff꜡:wAcccP4/o/^Yl6cݺ6m*d29w L?-[y444`vڷo?Μ)ƬY3!I.=,͛sv&{ia0ax]'Ntտ` wx.$Iȑ# DBڎ2bHe%p %ǡf ]ж/9 גe4pݻsQWWF!mP9so߉e~fCTTf̘SXE upeH\}4lޜ^\wsȐtdvރ:* :ԧ|끘=$oB\\_ d%x?۞5s=6춬55u\;Siuq9vW!EAހY:⃂h(7Yqd=eqN_hUhhh@rr^i(p@ 'WʠaDQ`DRBrᔕNL&q~3Ov' < _ qOs_w{ΔC, @J&cm<2 Ѷ;uV;2ʆ!B!12;X*@L'T 1u6 <L&B!eY qOL:P!hs R$ !B!B@ ,|,(B$ h7 B-c!cmQQB!BH$eYr0Pl87Cqm$yFF!B!Fe&dY(nC,Ӧ;$P B!B:1˲(8&0i/3/4ePr,,۲@J^%jLB!B Đ.p@: 84kOxJeL۲6eP,C!B!Be"P0,ٖ͜JYۦnPq42faB!!]Mt3#F!c(#< 6dlP vʈvڍY7zݿz/= ~Ͽq7Svíش)#I.OK/ ੧ga?l6+))P^^ALzmv=}~?>ϯm݅g7zl͚㎻pz&]w@)csXXp2RgdPsBO[XW  ߑ#Gull{UTTO?ǺuaFֻXy!--S^INzE<=~m=oxsDQ / qq}I=}V>0 Hy|ɓ'߄ ÇgS.,kB (#tI$!Ip2`lv33*gþUoC% `rRWWӧo¤I}DRRϟBynYYhR#嗵x'I?yy{1`@,]%GiiRSҥARSCI`^Dhh(fc̐!8GYq7bРԨ.1K9Dp qfqY vIhj)ضՈ٠8MCH%K!>>㕕{%'' F)yKxAXX585ꫧ駟Zn=RRRPPp(С#?%˯sF&㫯w@.+8|v;/BJJ ֬Y}]Ԁ.1K:d7O%۩aIow@:3b& 7uR@YI`?8|7t&O >0=}D~~V\'xK|TL2#72ꫧ!9̹o/ѐ$X…"?7owY^x$B$C$CrO 81rN喷Ǿ@9==[!=-M'NܡSr0{qUkz]cZZ;C/* 3H X"q@;V*-R {^׼1FѪQu]?~Ξ=۵zXozt=S}FǏߠ#G:{*yOknn^?sWȑ#k0 Jz;nKUщUA>}F]w<_ӧA"ʷiRpUg*kRqTMkޘ1I1b>{o;:ywu)vש뛳$۷OtUWԩgU*T*-w UO#|jsGjiVVV3W_I%a*Yk;v-,Y/T*w߱ZgX ֋LZ#V"&:UٶHg5TlIG-V}7f(8FD {jZ}Ov׼Zo|Om._ׇ?||b .I^]~e_W.G?z7/^|%'z=~I,I??/g~歺+*@f1lߺiY5o߼{KK۔Sc@3/߿O~xR-_|l߾|^o:zD?}UO? +zeX?}__xQǎrs3-"a T.ꪫ@ؑΞ}A {ltH*Mg_^y'u7Ș9H ZIQm[ojy\-l²{g&!ւ@ػ2sR\-Z{Һ9L#Y0411Ȥjsܶ(IDATes IU@s^{]\xVW1n3Z{D 0MIC0,!LjidʻLaݷ趇gҍSZW=O8ljQ28MFm1<)6!~Y`A&WKb>\.ʻfZϵ϶Ā#uU3@7z]붝?#~0;H ւh["f*~bkRʄʪkELu֙ˊyZ]P)@ϹՊ<5y.?HD 2K0>N@X]]sZU@nMyh΀Yg#q亮|.AD3U?%~0[32X Bb8r@~^uq֣e˥z]+%;7.3WMc8|>R"$(.*o1.F?ɬ]zC&P܁ IZIk=ѻjOk_fT`sP2MāVrEQr'ŽcZ;@Cy[9ۤ'bh2Hy7>岫rIZY.*zL\o1I#dDh躍_%WV.ZR1jƯtl`"rT0FtM%?H#起ɻVIdURqyT*-ҥU* xiUҲy+n ~afG ~מ<(k|IO-_ҕsZomk= B&hMSIVȡm}],?kRQmuYq{*kjmY::?_v0d]q>&oc]xQǎ$QDQj{X, uZMq-ZˈF?*-ڸٍ[}1flBf,0[D|I"FV߽|AgU)#*.,K+# .[k۶/ju[Kf+3J[c {iyRZ~p߸pQ_[8aJSGn3艥e-x~?1:0u!]67YOOk akRj}}]bd`3crKHɕ4xD̈1G[Ŵ&cr.,SE,'bZ0ZuaŃ1RiY*ϷM5ژ`43cTro= o LtKLL"f4!m[4S\c`5G\XKe n^,?"~fg=2k^9~ K͸FL;?Ae^E}ALxk0 8r$rrgB2NE?1u,ժ/5N+is cI$*5~ 0͢(_>|< &~W̢g9]u3R9g&y^aFQ${10-Z m0T>ϯ@7|f ~M4otneQZ~b2kR1eEQtO0m_<)d v"4qk?em,->wwkӨ?Hn~p3ƴϷ@cYguoC"fW閵.wCj]m??~\._VVH3[C05O?җTKҵ|z?رʎ01f4N)?ky=14g#~\mVW?~*սvEttbuusXZ@$xj`dDa=hGpaB!~@ͧ?Kįɓ'-)NEtK$uKփ_s+o!)`VU#N1'ĕcTptWrIs }ixw$;`XpjTۖ6?/> 0]"8Z|!~@?gHETO:WoW[ " LJ5iIl{GYtx$_lj-k9-e܍n2+iJxmgŦ|,WJ!a~|Y3 4VL붻=Թ[gL1XoR Ӻ"ƴfO[aFg1R{0I- )"muxB&H(-wA3NkQrxrY6V$'~k<hz@ٔǓ&QI30:AӫfIrI2'V$,m[7}eӌ؍~6n1Iə&mSʵ.W:W(/CxkRJ0&,~-b1,őLnI0Jǂo#Jx ^;#a2Z$6o2A}-a$m},RnHM7͸1j #eELsGMuS+qdq:I~x^HȦ,)ѩRn`-5>M}YhUy:M{\ ɾniZ$MCmN-eҌ w:P6J 3cREN2)9e5  !u?UL|{hX]QW=yf1=Niie4zlb3"([.7oӭ|]k.;|=*?0YH c~=1;5n;u+~ ͤ&bzR&fP݆9 7# q3mb zF?~ֳC;1&E9iCr07&\MmF^`ɘ^e.MCfvlOg0YM!kvQv70 v2^N.ݼj q]P n&v:"ˉ3w݈ `V ⶇPLB` <:;27s IK !O cݖܙ0II3mТ EIL*jh3uN#~=0I3m[vHնFb&C33|cc،XLCP/dm4% u HM[PgiM*S|C7 C7;?4(0VV._dgeGg51AB񳳶ó !Yq` EIA"I "~t1H-N܆$uIENDB`resources-1.9.1/data/resources/screenshots/4.png000066400000000000000000001642561510634446000217110ustar00rootroot00000000000000PNG  IHDRb6%gAMA asRGB, cHRMz&u0`:pQ< pHYs   IDATxwxTUL:U:R!( EȺv]TPD,ݕf $`p٥B 3#dLB:ɤ}?3ܹ̝s7+AP` !u@NB E8M yP& `&Bg  WbC H d >/(`%&1|B#ݰ2Y~3|^ (;y.P1\yRa $ӺYFbyr= :}QB#%| k\_F FI`(zܘ%t6.I D S/21^؝^NQ ېaPٕÞe(!jd53m%S[@nC `rcrr&7Y`Bp!st^2{owTbo RLw?+&'MfmئX2502B7XibŶ9זư B03r_ g )v3@؄1-Lv#m jJ&;A]9d+_.#*MӱgWEIv[d,7LN"6mvݬ6@qnGYuY*nw[aLa 3ɪR6 M(;aRpH1E1/LgdNzeg cEQnnUmK,0%-0D1d7\: sr9 j!NoBd:H1DLx̘ #|&9 e%g[ەyR˜ ¤׵(;Lfgl_Q;.Şeeg<{Y2Yum*aLQb˜2ɶLIo{S!SCFaEzݏ b)OL(te_9 cJDSXB#uLMŔJ9@a[UҙNΤlr:mRd^0uE2Nu)ŲALvƘ!xG%4iC[&˔-7tk,X 0U+Kgsۦ?MPTٳNUR `4i0i`ٽQF]2 ^LJ _LMbg6 d2XBڵX,T6IW nݞo՝Lr]2 ]i c"gpJhXzɬ{PF-VLʸ)RJj{ZZrTc|N;fLVÒb5LF]LƁIX$[~{tt-  ͮx͖fի׸/"LrٞI`dQnV=)LALnZØ2XY"Ҳ&t[1|Cb (\d6[|WQ6"O)ٳޱ01i ^AL--[5{wwѷVA P$$$ŵ=T ǔH!)!?[R1 #}l0P&;IRjսm bcc6\ret)^ߧ7e܍|miSXdlewwI2׬YsvbbjM ]yĤ|OZ?L ; ERggt cJ2..oN'ð ԝw:N"&kfN~1-z)O=l6f l6{4hQvMJ;kfY{#K/!K۬ʸvHLL ,ww7bdJ̶JLLTBBbct|$&&ONI6yis%蠽9Nf(zdԌ///d2*WWWyyRllsX2Hsnӟ!LLk{\ ;0 ȇ-IUpl6y- CKѥtM=Vl62ddM>[W۳nNKhSЃy]VaLKa2v;6@ҥKPҥ-v CһfO>'Y@vֻ&^1ael*uxyGn6M]w6?79B3s&KElfvwQt)fR7gu۪XrS͋ǵ|gQI%LXXh}B| +IP``;k=z&LxE4B͛BKyeRTTTN74Z?AyB0oN?p^3r^ne2*-cu)IRƍ5szǨU}?0M&ߏB*y^{nZŤVϪ RvgSNիо}k6T=*TGӦ])8XL=XnX4f(m޼^!!{w[׿NUR81BBB:th*U8=SD7mVXCh߾ZhԩXsw:qz/\GƍOC 'O)>>Aoa:z7ǫg'h2Luu> F4r ԦMyUմiorb-[l6_>ʕ+SN~vޓjF|JڵՑ#GuI=hgY*VjݩS'Ţ84Ԓ%iܸS=ztw'5RP*Sx:uZf͗i^z*00@ǏP||6l$I ӛ7oc(,;nj~w-\8O Sty?k"XѹӾcg\MU^zQ׿6hΜ%IcǎQ>4h@͛@ 6$}m޼Uwz_#ؽ{F#IZiaz9ߘ=dEFFd2io/X^^׿Qݺi3ghذJL*0M{Scƌ޽?;;vxK Y%4@vz߿>p+ŬkUjݗ_-WWW}?5}{'h:t{oc 6jڴw?_U['o4m3OY3厒~'= +]3fFΝו+W$IW^իW˖Kj!I9%)/i: ._wU6E#1rASxN:3f7߬$lt==Rm=ﶩG>m9BO%I7TwbmS&Mr(22RTFusOR˜͛ƴGX?/wow$m۶CԧO/o#Gj߾ڸq'X8yBC[}@ k~cǤZM֒>}zOީծ]+_$ٳyN$94CRR$Iڲec-[]$~%L͚OQQQ*UΜ9_~ (x굓sq^3KRA1^)Fڼy*T˥KiϞz$MQ@@[5l@?E]>M?Ogqݞ{gX) 9;oya͟Aeu3gΨKGոq#Q``; _}Wlll?hߚ5_[*U:r%'K%1~`w$#o߰a5UŕfϴJ hy]cLooo-\F+W"3-Ɣ""66V˖-$ ʕ+/{{VR5jL21Ey{ߧm_3f̔t'2~=hgǝ}sGi($%3ΝwB]&rL2ǝ Uf:z?𤐐P^T6V=JJۛP,l޼Ynr ػfWwЯwQpnVҥթSլY3\n׮;~txeٴil6աC{ItKP%8#st0Gc.ooo͙3.AGQ#&'wHbvWz\ Y㏗]45iXf[۫AQ=zѝi4Dڵ֮]-IWKnG= hu2LX\gժŋ?ԩKjժL2C~Չ'3ԤIc}Z?~R[RR^9s$Zj8iW{uj?ӧOqr[bqfWqqq|:t?'_ߦyڵk+vW…ԡC{kV6$5hP_qqqZ,tqãG9xf|w&Lh2zX͙3K˲컼O9'.,oqqZdԿ_\>C_#դIcf<>p,F1cF]Q]tI+Vԇ.vH:E3J<4&̞={`:v쿒ݚ7okǎ:|L~^[5h@խ{bbbaF͝;O6M7nгcC hgjꫯ%Igս{7unݺ[ռy ٿ@1X/ k|ot9tW 0H&oSL&+,PzA0?ٳ:ZfeÆ nI8yyp\s VȜQ@e6ҼNgJ|aI!(>\zM.. h˗n+0Ν;G(ʔ)#ww<-36660>=e˖}%%JlUR[0)+Ų-eҾV#Z+-[/_zoذ@-ww<+::Y(׽P4nHM4՚oYoT jƍyVލ7eZ(1Kp =&MQJLFdGtMHaJ[*]rަ7-) SC+,&&FΏHд)j-bkcVUQQQA|]\\eXd2%]lv%&&*!!^q-)R5 HJ doIEe䓂kZ@aD8A 8 A  (Yt@')A dPE 8 A 8 A 8 A 8 A 8 A 8 A 8 A 8 A 8 A 8 A X裏hʔɪXBtfxO۶m(hrHRJ5iҫT ALncZբEkdz 0uF^B f߿GZ}yRfTre5l@kע(b jUVڿEq} ;](b lցwE;?-[j˖ f֍I͛7GѿYÆ aի+,,T-[>5k{kԩSTiZV{w[4t(]^7/˜v~GyzzjjWjcGwիNѬYE}XgҤW׉'֘1ʗ/ ׂj̘qS}wN:;Z]vΝ+66Vڷoݓmۡm۶+11QǎWs羯gt2;vLڱc=`IIiǎTHHu{l")⼼Ծ}l꘷eVu9U"IaaR>x0LKVjUSku~5hPOt m߾Ck|ޛ~ӓ@65aiJLL$Jz_?c]ԇ’:v]&LRF>Sk3f8 )v}\wQԿiGcVZzFQQQ:>"ut%IW9K?#g^Ӌ@6a+VTV-t:ut埩CiQ4~8}*GKIzAj>P5jO[ǵbJI4ѪU+եˣTڴi-_ߦ:q$lkRʕt}lzNڰa$iժUKhEEEiժ䓥>=Xկ_OgϞդI)$$TOWGի+22R֭q0"lϵr.@ynɯeZfx= <{k(,,4NP1FLz㍿vg7@93N9ϔb^G4Ӗ®_ի]{IU|y$SGu,=z&LxE>}SYpe%YyKV)J\)әv:#ܴp'!86lX#G)$g}bխ IDAT{cy*5{LÇôqԧOTe}٧[~?:uꔺtyT7]qqqڸqhΜY$P͛7O>^^^ZfuI={V~~ml=P`"H|||$INĉS'졲e˪tR>Ze/T||fΜ޽{;jM2YIҡCoߧdٴ|RUR>}N>+1Ѫ;h0k1IҮ]W^Vz =.],IڻgSsR͚5P*I_$iӦͲZ 6]iIRZwop}]A cѲ2 C+WNuUHnH{o^j޼4i6mZkذݻn݊Ѻu_L2ڹsvܥ##eLfIR||c^\\\}2 CRRYZA@`PС_%I>Ujy0 u#I $=hgEQ6muEϯڷP2ecN 6BsΓfM~ᒤ;8 j$Ò$ݮާ݊TNԴiS5Z@1[/>S:}ed2%Ǐ׊+;Fڹs<<> 5nx(6]fInrqqla vnj*!!AqqqZm2蚔O\5oޜT!իW%I~;w\},P㧟vi޼9Y&l6 PҥT|9yzz"nd2rqC˗Sҥdl6|檹sgmۇtM$lٲڷo\mʳ0fӦ޽wѣjjٲ`rɿ=0鷗a bዖ26%_QtEK6< cnܸgٳ ;^{]^^^zB>0ҥKÃ0b!ɓ'$Jʚ==PvvB{ %93rNzKh)oZ#2VmۮFAan]:dd2T=0a*T?\kҵq~)8u:u(ݦ]~p;u^xyUZUg5o{C/^I-\.^I^uujO[GÇԩ9rTsΩrJzz'VZv<==uYըQ]>;H/_֦Mռy3-[Μ9(=@=Ï:x]tISLRTT] hƌUjUرS^^^+66Vf39nW-\a(& (ѿqn$${:ϺrZLsBĘbL04Ӗ®_ʷJus6֑6%8qBa_S~}%~p ܹs> י6MYߧ_NM4A͛7S\\oߡٳ*::ڱNǎ5rծ][W&ո1uք yJH׾}!9s.]JcS4~85l@qqqݚ9s"#Ưݻ yVիWWdd֯ߨ?\츥[1Eխ{\[ŋ?rYVdz\\JvK.ͦ+V._,Te%YyNeiA=MhcK'(NhgA˜Q^$-]$>fnRХKe&L1*aA 擸x7Agz޽@>1@F咆 &%$$h)9rz.ɮ 6iѢr=& LreIT ;l+Q6%VYS5r &k޼7oHrȕ.@e$C2nQk$P-5n+Ȑݕ WYiw"k1t]dH".Tr pLȄ,2sI\NK~3!?`~3!_pρS sp~T Ib Ib Ib Ib Ib Ib Ib Ib Ib Ib & J'PyEGT$*ҥKڰa>pr^ S``;7n(4f͚gr0(DhFzI?*U:*UСC4r䈻~M6{޽F+ժe>B1G0>NfZbx_xWwMG뗳g^׮]~FAL>T$),P>X7yyw+>>^gtJM{S w[o7N:4i5U||mۡ9sWtt=Rkҕ+WjUVܱvZK4s ]z꧷ޚg>OG}N:… B1y(9Li-b4bċX,ڹsc~h^WDDfx1o)ھ[=` ja Z?UlIR}u tG ck׮mU[OzjZ:HIɈ/IXܴcNEFF*22Rݺ=XIҋ/ꫯ?}1-]UMPz1y(7a` ޽{J\]]qʕH:/^LOCSk3f8x{_i͞|ƈC5Fŋti>F:z7oj^reU=z{&:-Z4W~;5k… GttjVBBL&5QDD֬J'O՜94h@Iի#GjO5|HٳW}rYfp" &%*.% ۬c^Gf2,k֬UjUkF|4k{ ;~'K5`@W5jPN4w,UZEVuՔ)Tv-կ_O3f7x]&IZ#3JժUUչ:y$hժQUTImڴoS8q/QԷoU^]m>5}a(J蚔6lؤChŊeY~˗_ԤI}͞=gϞ<59B&ȫZb.㲞M>3%$k߾=0%&&͛=zƏ*..N?[3gΖ$/zꊌԺu|ggM'N6}vzTUFzI=ztSJ]ŋZ~/X @z\\JvldUR\m_ QFZ_tYad*Uʖ-JJdM.ɖfڞbZ)^|(rgOg^@tM 7oy1/i;w~\ |@@ B$1NQP8 A 8 A XdyvM+|W* ~O[?$!:XP+"*JQD#ֲ캲(X`]t-kT@ ^$@maLH! %g涙sCsΕߕx' Wo=2â|]sh;vʈ #}N j~k)?{vn`$i;g%^3/}p]oɾQV=;QfdK!cE_ Ʌ*'ywv7ʺ`ƛp=;mVdTCse%#"@ յJv%':^9du xr+1CfE2y]؇ 2̳7jr\gAN6yEN:οIrK[7Q;\55+\flgM.}dXRvdplS71d5,#U-;8Yz09Ir}OOKYa휴ͲιNrlo2-Y]񐤐z2#[FL IDAT!";eKJt`Pv3LpɌCd-s<[ )C!ec -qy].n-eBV%r+ɑ Sf2yn/IgY]?g6>_KS+?ľVG.f]e4<_N>9ى- 0VW., +DvNMBeP 8y֕xo#"Ff}W&>9"y du!]ylw!gGW,̒YN~ܗ_")9%CFV`v5l_/+8 3*x?Vx~VҏW\{mFFfW30BuޡX-%̰(Y]᎐H7"Zʊ$S(B^^ۈ+w^yFFH=y/+ROfݦRh_p@Nv/<1 SF>w'0o(ޝ e'9f8!2"[h|dRVr2%JcD4Q-SPC'W6jt{o(8ނu#'MdD> }WSFsݱD+e/9ɛF~NdI a%TRwy vٶm9Zj P_=4nrr Ðiޡ[zΒ<Ivs|MsL*+ ALmQbD0b2AΡr 2?%'TpqI dU9Is8bjݓz<4';s'!fP%q :UbjV1@e^ɓGNgV_M@U1FLMݱ@rՑLjT9\";!lTAL^0:81C2P9tMddP F07CB87bJq\]SH\4p!)%"aSq\ A# ;.JN;1~BCC)9 ' AMYq]w+{w7h! "?E9Yk߾,*1^zjӦ5ێ ,]vڼyoZNu˵iFzTݺڿ-[L[hݺuj|yKuMM4QNN>|rrr$Iݺu_$˭8}2qFuA .҅^D^F#7rpJ'ʵn:]pAh:vuկ__C}M:M UfffΜ7̙.].tMǎ{7q]sվԩ\M>C ھ}>ls9[;w$) P={nݺjԨ$m۶:t}˜w^;mڴYIII_~UuF(22R8Җ-[%I%(##S))EEEI:vl~Y999zZ|9lݱlѺu8$).nUNI9眣m۶spJk\#mذA^x-[ /@ׯ/LDD.ڷofY먠@ch8v pu#tPozAA 2x<ڳg:vAڻw/ 41mܸQ#GԺuոqcرSMDh5oˬ[[(**R&$$Daaa5m۶]:tiڵ+NmspJkrs󔐐͛7em:ԴiSIR˖-t̓eU'fӦMѣ eYJܹS[j߾m)15vk1j5lذR뤥i⥚5my<*.ne Շ;wiG9Heݺ馁Zn}yZxZSFF*Nٴi5|0].]zu^ժUK'pp3N O3)_U깫W^YEGGy2dp}5c*?/k>Wfu]GyH֭')999@0pHnwΙmۖ8n|%tSdd.FǦ0*">DEEiU%y$y<:R{#VyyoZԠ>}fkMZcǎ<%T+l7`ӿ߀-etg""}Zx1w,%9ݑCѣGj|qFI:.]-[}KLo۶;a2dy[ oLQ_{!C?Լyǩe˖z`\֛ԩc^vYM.9s֐!K hȐ2e}4}ݭIUb;5W_-TǎR(W˖-4rHرCI3@FF߷kŊJMM-1}Ԩ<&MnN}R=]|EeZhkذ0Yt@=_S5hZ=u /иqwjW5pu뭣K7?yW7D}B*dϞz㍩ǟ(N1g w+.I 5\ X.44TC ĉ/hժ_t@}6WP]Wbٙ3gPk֬;bJرS쳹nKy*))IVW_}]RXXosתU(33Smk۶mOPW+Wt3ybk֬Ujj*I[kU%kݺ'|ZKMM+q'ǣ\ɆJ=__ˆ VZ/W$5mTڝ%KrPgAiiijذ:v쨍7wx݇cE߿_iѢ/ʽ}w'< J"8N,]TƍQuWh JJ: p!A/-ܬɓ_ƺKrƍU^{yz,h͚;vԁrԩGߴN:@ \799Ek׮UW]޽{飏>8#5͞>*jgdd~C=U~QrrreǟGV(66F}\u֭ 7 ЀK.W'ϯpZMo8#"it-7Wi3fg^.3kֽޣF*11QSV6U믿_И1tw+55M~:ҭ[{=}Ǘ pF2N O3)_U깫W^YEGGH,Js]"sMk83QiZ~]sf۶8W{Mj޼L6zYխ[Wi޼z%ƫ;S5kִzV=96CCC5f({bbbyw8\vԩ=H_/Ӕ)l< ի?\aÆ{֢E_hn#2.] smh={_ 9i)ծ/=/Ӛ5k⋓\߻oСCԴiS%$3 ^ߣGw=,LyU_|oބ Qnn^|q߱)2 CY{;DEEiU%y$y<:R{#VyyoZĜ+UsgokRb'WLL 5t322.k۷kܸ;ԤI~I5ek$4դIx)m۶ͷny]].^}ubcc5s,ڵKm۶mS{SQQo%O 5oL?<^?gaaaz4hPэ5q󊎎VB±Ǽ;$gHu~2u Ӵio(..h>}Ƒ (Rƍիn"[ˈ4n8M6mڬ/&N|N))GW?cz畘W/e_aFrA NF&k޽zTx% .֯_?ի "ڵK'I^;ѡCԨQC\.mܸIII>lPiZÆ]nݺZb} >To}tT獏S?=ENtXׁeֵkW/?i۶ 7ޘnPNnnvUbÇ)33S}qu.q\'Lz:vuWru^ׂK~ *4M5kL7oQNNlQƍzB&<[1N518RSSշ84с+|ݵ|7*,-}Y\񨨨zhŊ-YD<Ѓz*oUY'$ĭ#GxT *-yJ5jLi;Uo۶թSG%'q<˿ի9Ii Pllի7ߜv)))If/*-[8w\nh·M.i5c2]bupߺuk=? ݻwE:TgϞj\=ē+Uߪs 7ȲL}ټ2N?[j۶5 U>רgu=NUKsMSO=)ۭ =뢋.tI/@@;vTxx/FT޽4qsze`=+31[$)--M?V\9sU۶m裏~?Ubu#$IW/sM32MSZzu kҤ7oVnQ?.z~Mrsj|˥ѣGiΜTPPPf~u4p5`@IǞ9x}rLJ K/K/?ArIҋ/N҆ }r%iuaz晿% b}'O|7mڤ=*`2ӣ"}w-]J6nܤ)S^Վ;_(-0u%^zz}]ڴi^&ǣ-[m6Zr',8m 1HL+D*$9ٳW?"nݪ/խO?#I:sSO6oޢ j̘Q8y͘1S דO>InݪGL}25oL<}\_ ͞fz[۶mS 4pڵn7hP_M6=ӀմiS_wڷ?_W۷Wo˗kƍ% 0@#G#TNYG رc)++똟u ),,L]\ժCffBBBLyM j\=;wo왪3_LW$%$$sϕij׮j1'+ B! P@&T.E5gλ}]jҤݫ ^zjݺ"##%np=#Ӕ iim_A??.w:O>D3f <3fFXeggkU5jKvyz|ssuV=Ce+֣GwX»*@ddΝJHHΝ֩2HRWYfz+USԿ?qKHH/O…}y?ݩL 6Ёǟj췫}/wܹs$;4%-X0O?~gNVpZ1N O3)_U깫W^ǵv(A Pfqm"99̴Crkwl۶Qttcg0}駟WPcSd1R;EEEiU%y$y<:R{#Vyyjjzk! 9Fxx:u+VR  ]Rnn.'@P" Hb  Hb  Hb  Hb  H\\i8QBj)& A @ A @ A @ A @ A @ A @*bʐXdʐ#89r$yekxeˡ$8.1cr;.dQPK2$dXȫ"CYPmtM+qqR6@@n%&ʰd_88y@!o&1T3[(F̈́ ̈́ !U緢8) J7|Beƪ z *j@pReWYr$ŻS_fJwʖ#'h{E^Z ms85(wa;]Z%Pg\P  ! ! ! !'l IDAT ! ! ! !AP* Jv!A<TW6EPԠx!Zd P(A6 ^:.Y2%2,pKCp !a(( & A @Ĕx,81~^n pC㧨AvY8qbPsN?***iPN/1dg@Ss\ AL)G"NU222x(ALJO?D7%STtܤKӕxtPBBB*-2%G^"8TA@͠k@ A @ A @ A @ A @ A @ A @ AL ez'B1@15(22RC #>^4f(x4hH3f obj/Zu5j1cFɶmʔ@KӦMc5}[ڹsڶm]]Cw'_`N}S԰a3J3g?qrrr8@1'H]+EuoԀČ9\m۶(%%UfZ4j͜9۷|VVK||xi-_D\s 1Avá$EGGWkQ3KLLҿ=]-Z8ڳgoGf_+jrmbjPJp1 Z3p,1AB$1AB$1AB$1AB$.J(cQkP=UF(A P~3"'c A @ A @ A @ A @ A @ A @ A @ A GE_M@U(2<0@9f>EW6E@8dP x /E@5 neQr[Y霄j JSG!J6J@2O=co)JXdʐ#89rtx`^;A $Ia|_(6<*qk$I K]LBp@0uRAwNHWXM18Ab CRsb۫JuQhZtw[ȴti 850X/-{۫{Ltl::ܲ1Vi8Bxa-!Wm;08;~=AdR} jmXJu_'8djr۫,5\!z[JZn%:GMjDn1joJmeGk{{v~O2tVldES]VC~q p'-=8xcHX!վ]dZfZx*B'6e{"-uͶ5tUFq4BS˵2LeTG_Ba Ugq;Qvz3 lx mnĸ8{MeVV :U{[B5 i\lZy4R[8r>Y}v0Q~0Vuriҟxx?%m0ӭ8Vz9P S9nPC- 9o-V齾дtR!mmdii/l d>K@Bsn\fXrI;m[N9 ɥ,S[[؞ =Zz_paLjR]kdgM" }`0ƴ4L4M`ǫ;,9N[-sr[Ej4t=HضZnu5LlW"9aCx>W)-2zVZq޽[|rss)PM5ݟĨ27OyRn/p˭9%Wekv9JpQٱq쒭M0ClUGf9%.;Z+DYnr?ɒ"G#-ʩaa(Fn\%_8h=f"Ergt)8!Lz8R[{U=*8>^bfZZy0-WVVGjuHKl *8;ϗeΑc[nx1x`%%%iѢ/fZ5mT:u[80  XXOd}LJ?ȣsxObZČ\jb6 mvlmt\4s[Ջz[Rh]n;92% @ӥ LLniReK:0ͱkd$%Kb4ѱUTA(JS^z^nZ5  $Tt0Nі[u CEr*q /_RΑ!+D[*;+CVr| 9u4uUWj޼/Q|| /˭dKyy:x wߥ[P\M}^=zYڻ7^GW^K͛7%\/չ瞫/3@Cs1tMA+ъ.CYn-4LJ ԯABc 9X^BqDǶG9jek5ܔRi*UdH##G )Ä$^G^Be1AUTfkVJ.ab:4NƿKmL|4- 9} 5U3V8ض;wO>ZrSxcIR\nJ6mRLL^Zj 6(&&FR&MtYmSvvjuU}$ /|tuA_?@33AL/jx.J:qM~WI^[a($B%H/0y"9J hS&^QrGҞ#w2r{ 1 }O`p88߇ݶs cݻ"##cXRڽ{~VZjժ_uE}H<>Hanݺ/P}m6K6mڤ/QLL8p3AL%9jJw)@(q 2OpKVqH;gnDN?mk Z~ԭ[7pÏ\EG7VVxnJэպu+ϒ77,y<^~KgVV֭Kp2)#pݻwVxx:{ꬳR $k.x<5m}ںu[_?ES誫z /Phh֭+t;.n.b۷Owot}h"Ia(2:ws9G͚5aKTXX3]jPy-"JpgWT^zsILLڻw$)99Y^Gqq}˯;PVVvڥ&M_Aݻ_Xjg4$l*6}u[U:|KnҏW\{mFFf 1'8p&Js~HnwΙmۖ8n|~+\Z 'uSdLvTի:KD(X|+ks|_Wf@415y'G^Ց@$ AL Hʢ I7R:5 Hb  Hb  HbWգGw=_TXX߳gOם3=M}$)22Rƍիn"[>ҠA7ߣGwo4yZru몿)eeeNll͙>S4q|=7o^xԴiyiիWO/rmw߽:tfz[&hĈazh̘JLL:Zu]sMԎ;ԳgOO~6o,Iuict k:tK(VcǎU߾է5z?? I;}vBpFk m66lrΝJtYZ I[tE?ukӦMzɧD;_XfÆ U65vm쳹ZnΝ;:Zbl'(>>A7n҄ SӦMձccc.k߾:p@W_-]v?KtfLLv< JH?bpZ]v~ԣ>oRÆ lc5jzLYV˗/wٻ(ʵ ̖lɦAHD@JAPzD#TX?+bAi" Mz b- -!BH$[fcɚM#,pk}gvf]ϋsקTI__Gk?s&۷@^= `g1lٲIf!1 TbErr2p ԯ_Z{莏? 1CDDwt K,bqзo8qo.j&Mz\j oѫ@NCjj*^yeJ5QjԨu^g Y!"/{-u{J߄3gW$̛7Æ$I駵ә8p +[χ(JtSB7ov E޽Q~0 cAA4 Z V׌UVcժPt ᇈ"" =ztի]%Ib+Ln$[>RpX 'o/? :x-:}Ƃ_g !X&#zʼn'p&ʕ,|ۧvI]ؽ{7G`Ҥ:uay0?KΆK {j5hذ!_Zo=//Q>%0biQb =jѝ""a(bĈXGP$&&:0FK{Z8s&ZG9992dC5js 1c&j֬w-|۵+XVŘ1bʔם4?7RS0{,,_#f5%-- ΝCzumkA``s'ĉ%p ZwSe IDATסjoXkƍa1.ܹs1Wu)T\qؾ};v!n1য়V?(#"""m; F=HWTÊ+KhҤ T^z.AB!C# ^MbbвeK_|233a4J'hӦuǐKVKi~̙d2vڸp`q2l6\ݎadeeZ_EvmѺukgۅ Pdee!))F~?&LBJJ˺ӧ 55 ]v-xbaaxG'4lLѝ""=/h4pL_?4j<sFbb"Jllr={~ 닰Pt'Ǽylo0PvmԮ]AAAx~ٳvY7mv'.`k6}o_`sc^댊A߾chذy+^~y2>R#>|KYfgA˖-_^O?eOe"{ƌys̅(  FHH0ׯ1 0~8<# ‹/NBpp~aijxBΝ}݋jժZjp"?lDDDtG$""5jAj50ΝB:utRر'@ڵ~:"v??#F ǐ!PV-"6v Q"gٳЦsa֬oJ=v"&&暳BM&Ǝ}'|2n݆/ #ۥA{sua/aۯϜòꫯaܸ?9\>/<̙SN'`ذ!$ G&`Ҥ"ƍQ1u.III)ڵ?C`qV??/cǎaζ3ޚF3g!//6"""# `5Eڊ >.\V[Vرs|ef Kfh4wwp@E͟~i 'n8 Q{".n_ vR) زRdEziSJi+\e͡IDDwyP`@XX(bbbDDDhtKphnByyy ""[^̈!"#9FmlVvq|G+Zu& ݁qX, """"cX@ HW]$0CDDD) ,Ι#FbJ A@^^XSG:`n K\v-̆Ҩbaax7|((8}4M{GaQE@Y1EFCDDDt yd..ZBBB*j&BBB;o#C/l6#''ÔHQ\fftbFL n/j>^ڵq/%_82yMX,Vń ϣg0;?IezaРp!/;1g<91b&Ojɓ0oؽ{O ^1"55 wƂ rܾ m>^zf$JD( Q ΋CDDDtX`6!I3"  z ˖-O?[.]M\]1 ;;f:4 j5ADDDDIQ'v;l6ّE%[@MRv-!99 jK8):V޽{^āоزe˾B1rp;waƌ0r2?7Q)_ea60QtHT(*jW bnTZpRj㠔RB$ <Ov)FVT߾}?}6ǏNCAAAcaZ+Enԯ_1 27oСCcN|ذa=yl6lو1cß6m*իc:uAA qR*V\%KWȲ@Z$_ n*]pDFv,s]UaG d2aسg'V^ݻ9˲\jpb?lѣt:+M6u j_=zLA/// : 6֭Tu&%%!33M4vVZ2d>c/_={J¿0֭siӦ5fWG}#cg;Qpr2Q=A* 3bn"wdĜ8qF۶mGJ%t~$;6mR}5oٳʕ+%֛L&g홊/ѻ8Av8ulm6CHs~ݺ_0m`Z[n ,X+V.\>_|t}Yp-rj%""" ~bbnȎeք+WaUG7FY@L@@5̛7;v?,+ul-_ˬO>;Yoܹsbj >}*F/_Q뇬l㌌ Liv؉ӧ"2vڍŦM[Y;[Gu 4ZooohJ"cJ/DDDDDTܑS?܏=Wx{sg#9z2;z4᭰pζ^zZs+^̙Dh1ҁ~joBΝ;cҤ- {}+ܢõ D3}ѻw/ƍ zJŒAQd ֭[vh۶8s&aar% IL ʽIE&MGrJ=w_=]";; \wQԫW.]r =|ˬCDDDDDDt#sh~)z_U/fرch׮~z$^{mj^zuvgee#--eCc%3S,\-bbbVC0hSxw]jԩSǹc垓ԩV bȐA ƨQ/iiixǕ.Y3={PNmL>ԩ%"""""*@f }=E Qf $%ԩӱik>~z17|nժxKQޗIr5{o 4*s׹-*ȳ+HDDDDDtw Uؙ?Je`0n.$i0i۶ﴢ V"""""phR2.pb%xdj Fխ h3CDDDDDtaFLVaA-èة̤pr9|4wgF75P o 1̤ܢa5j >;4̡=DDDDDD MPz&y5Rߢ%F$ e """""0t #3bJJPnI Ƥ'0EM""""""0t*Y$eH(D[#."׮Bm3bn' xE #˪OdRKȲpqL>|;VZ /L[p&wIjժViAY+вe 6o~?n! {s\qq :GQ\Vm۶ 3gp{;֯_#G}VL>>>>-[páCfJ_ """"a kdX%S#S2,v6Yэ2ZB$BX|I?k Q%t:qt'OjŬYäIhT_3?)ϙ3?Azz:.]-[`EY&YǥС=MS#]b2gvZ8yssnR_1k !&&KF/QŋC8t06l؀&M/?GXX(DDDD,?E V8&2D@WDL 6iU^VdXq E0t`@l>ڵ;222ФIc 0r3Cxx+X zļy_ ;;? }>>>ؼyѿ?̛&N|ZW| x8IVeՍ,^/p ˗yRGSbg$bǟOm۶ k!CaȐAIJe&!"""5b;?fk8C͛9:wQFEE!2֭Evv6|||h̟ v6$ay6m*fϞXÐYfGhDݐq:90w'""""`FҩdX%Ǐm"@GVK.Ct{&Ye0#nɓ_ƼyLDDL̙3/jm_~y DQ`0rh\t ##fػ7 7B>|{$_FB1!4Y}b8u4ڶm{_݀\\pC ǎ;ѤIt01ut,YB\M,VVqᲪز}ǎ㳲iW^)?&U.ZWlwV'?T2ώfn9I-!.fHx~:jz[gES̼ PV-ٳоCHIIaQ".n_ vR) زRdEziSJi+\*˘1$,aF':kJ֡I *d`HP㜈1iD4 ruh$rhVK]HW4*A|4 M_-ȵP͍haщ2l֪0i$&t(&)M;v6kxȭRRRҘADDDDTÄ0z2+N]O⣑`Qdz{'ղPpQ6jx`/c U?-oֈ(&?ר@s%k@]Du=1DDDDDDWKɈL xo, `(fLDDDDDDb<^a]-Qg M2%XRXUe!"""""p xZvɈ"jAj%+*0!#G-!9̈!"""""-0a1EJ"ڣ42,E2bnʈ1i%˥ds*X/c 2E4*jQax@#*.YK6YpK^ڵHpQf & c 2??8b1ͨQ`Q4aSפLm^ ռHDDDDDD%@ E8<#xkJNI>jɥsqvDDDDDD0zk^(9GVK((v}l;jh$X$6jN Gc 52l2.,obǦB#S~" oA ҐeU@1 $/LQ@ps""" I IDAT1a j}$phVIψE0}d}r*VXoϺѺZ%UgjBRzh@1a*«beo^;,+PDt^h4PT~a """^(I``X I2D_&y(Z|$YIkgxD0& Ы3kRyMFZvfFT?VG٘~^vpy0"ۦU%&XDe~0hEan (@Q`&7A,sS%2.,fĔ௵C&K>&2 ʙZc j^ڵ7#͢Az ۪v^U$%9 f/9So"""rhtwbF;?l"g"ٻz]yM̈i3?"Y-0l-s69D{#,r1& J{c3,ү]\jT; c2zrm*LltϫTZ 5Kƾt L`7WCbb"nlnŚ5?Uj?AHMMťK,DDDD%1;n@L"l- J^%#&݄O8 j2>6)Xo]̰)|*01e`eoMp^ъ :T¶-iTˈ K[W>LQ's% $&<tC꣑`+#LR4CT>*5Xѡz)3+uyvV` P$jl|f3Z cJ;waÆn:t䍴tlݺ /_FN {/֬ ҥ kƦMv]Y޾""-!N8]vn5j^yۑN%_t'ZռJƾ )Xw$|ioTFFU. cSZ^2<^1PB{XXbǶ]C}]k_KgzT]p8kMLHsTm0r(ӀAiwE\^[Vs*G0;T}tkgW|ѯ3I*N*\N!튀<;1Je:utvNW̉,z ׶K~))k|-TrSzQӧ7v؉FCBBsTLL,Zh NDDDD ܎RXu6B~_Mۦ[$s-F#ޑny\yVKhA*!2:CC!""{?+Vlg4Җ oҋ9&DFFbԨ|9QQQ8w|%L@a UNԯ_5 %7;;܂""*ñcػw/&L5g6CB±Ry Iٳj~:ZhtXŋWj\r>DDDD,@DD%v_Ѽh4⡇:!336eF&QV-@XXz=6PE#F G͚5( , 2ms]кuӡ( .\,Q""""˃ nNCJʅ/p=/~EQr_=u ` ĈĈ`TŖ;v/Dw+h,CQT7JKK Ż?}}}; Le2<.zC9 TY`C܄""""""""7a M!"""""""rb܄""""""""7a M!"""""""rbL}>իWbϞС h4;o… gN_Æ (DDDDt[S 4ݺ=ɓwy'ODGg"!!S1c!#rԯ_g%K⭷AFW_nDzeyq@ _Ǖؼy ̙D4iz@L@@:.s=SꫯgϞ|?1DDDDt[c JL6JYV| >|(>}_}5w[kȸ9R+??R&""""F *11 uEǎ]sƍ'? O?Gm^m@+JOjj*RRRj5Wn̈!"ktwo[6zԩY6lXX6XV筢^y%tz,\-/֘CDDE{j5xwܮat8p ޥx4i亏?lPt /*rssyAƌ""*kƍa10lYWۥ[Gsc1y+8q/CDDe=i%"""""b(b9r8|}}K]j׮.]:cŐeNJO@j4h5jzŕ+Y#::6mѣ :ٳg1~ .m{%lڴ/qGbo1sF߾}1j38vmw_} L&xP>%"""""1U~>"#+4@``ujzVIѶmL3hRQJǟns0L֭AB#P0{ f!99ue>i&3?1]vOO׿2}JDDDDDDw'MB>퐞qcԨgr*:u YYƩSr* ƍ{h׮->|NC#""֦MًXnlǾ}:3Y6n={\NG͚5K]})4oޗؽ{jG .6mp+YBVGCFAbɒѻtb 4QQ8p9 z]njq DD#::h۶uR!7[fM:]xx0pxзZ3f|ȶ.:t0ƏΝѣG1s E^=phza?zO8׏7Æ ug_1k i/,ZϟǠAC1a  o >|~i-lي6m"a-00-@RY 8OD` Bϕ,TF\V \ Ehh(z &!-- cFGGBբ~CloNC@@5Hs=o_Kg%K\??_de]{ȕ^ǰaC0eسg/`ժ jgH~:))8=x5ɓqqzOذa#Z+0b0L0 Zl94O<qEc5c`XZ =?.)غwrs%""""";17ٳ Ν_ ? c>P̞= Æ:tv͛ߏ{llٳgYr gϞ-uCƤI]چcd‹./_\.hqqAA w=Җ\.S8lȱ>e+WPn]@ppz=f͚YVt^PĸΝ;uiڴIr$&&d wDDDDDDta fuZ'Ng!33~ڵ_6ʍ$ p4jt𣨨i]BLLÒ,YZnvfÙ3u~G& <.ĺڵkWX;:)Rg!QE_PGPi߄CDDDDDDK]ps 8ĹܡC{L>;ݻX1x. KG'fa֮K|6mZ#6v˺qƠa?>}hٲ%vܦe̜ł:ujc߾?.\HHH@]W^]DFFbU!K .0 8g"r"""""@L>9S#=tѱx՗a6qag{l쟨[.DQ,1]M7,œ9o!6vF#'~7ߨ'|JUUwբEfT@Jr= AL'+ưjmݺUK.y-wޭ%K>TEEEsJk֬ե^)S.S}}-ZK/j_u<@YVMI/tM7jnz'O3gMmv\o^O=bfϞ;r'|JGu~_%,~z\M={N(C])L9 R7o~HyL&-ڹsWUr$k(>4 @~Pg̾Z:/@ںu1rA߾}`1\I^?$?Mx?Jدm6Ͷי#ƛ*1 tNBIXG6-2Sl)2(8Ͳ&#I+k|FУF+ `P6L8,9JR (2{c(1| McG/kn]iK;>}zk„ :CeUMM^}5544t58; sRZ(6ڴ e#~g.'OVmmyQ=بs9:VC"QϥQw2 EwLeqxORcc$^װa$I#GG={C* IDATVo֮]+I B:I9rkEm3cG}k4kSH+aꡫ eQy}_ktgꠃ$իW>|֭[is=gG4iDIC~:4r6}Fi#^F1Э HD6HCap@I;ZHXUUU8qjkk$IzUN$ :DÇիyVX'( *sGu$XRǟJB!|x =bЊqxO stv4L^~8"JAݫ3fNՄ y֯_3Rf ۷+بYfi׮]s_OW\.T]]5m[x飯|Ԩ_CÇAmĠ{1]C!7&2QVNB6n2Lo}EsjO,Ӌ/l~7[Zu?nIh-4麴PX<٘?\A Z#2d})BPHb2'EbHDƍIUR ?\Ouf^2 #pDbn,|Oe E tU&#ƸlzĠ[$g]0A b#Qד<_6g`@ 0PY%ߏdPbZ$"2w8:,yJQz@9Zv}`C*$ϥˀ G=b,.f/|ڲeK>X_N:$9s{S}}*+uW3P0[o[۷oOK/X\p ˗Շ.mu-^z*]u5zyi׸q4nxUVVWf&}ZKkZ@A#iWMURJ,&b&AL4In=藿O@@S\nQ>J?'#F뾣o|[߿~{8T_|N[_eZ||ԧ>?ۇ cǶ߳g;˳[_pE-eѨ:54Pp1hņz}7 ƯbriPXseXuַٳG-7lؐtO6|͛7(8"y0(e†Wyc_-[W_koKzI'W^ծ]ZQs`BIر'jݚ7o0#k.J=^תUzu&OB`0ɓ3֮=I1n8M|5=կ;_ A ? &EG6M %ד="G 0@]Us}iiڵI.ZtiK2r|)S.̙ы/>32#Giĉiz}ӧй+4N8AhܹN:eޙ{Y^nE]'@ Y (p\)e󑔅PH^uI6̐1[^ -[,g}_>쮖m}矫ѣG;~[oMF{O6lGժCZrH{Y0`@|0y9bO>p@ |{}I *kWcG;_rAdL):zm 2_RƇXLtQG鬳ԃ*nߥKtyt 7i?]]}5:t)'0zWl2~ZF\o?A/?\I!qjƌOE>޽{%Ik4w+zӟX_Re%xZF?#x}s[Y)'$bK.jYJܸ,+'!O_zimܸͲÇ]wݩi̙Mڷm6-ZHʎڰa VmڴI4}-]TC ӧԤIկ_?Zp>v'%-mՍ7ެo|[Zb8tMgq|A.1Hb"Qɍ1'/{B)_z`Bah0x`s.͛{KtIҳU^{MKك:Pw^z%7:׻ᄃ#7߫N֔)71c;ל9suGu\ӪUZsg_ܣ;.\aÆkz]b,?p+^2dTZHN |$fb1UWIּDuum߾]tghԨOKxIo6Kjhأk_C{}QI~o߾Zd?y??KW_}}955uǟyZ۲wӝwޥ+5h o{FӦ/ V6^'ns4o~::iMZs箂W_٫!'095@Pؓ뜎u'-R~ ,_"g ~J%VE+0/?t[X0.i]s~Pg̾Z:߇=o4} =T([#/tҷo_-X0$WO+Oym^+}+aM-u&P1HfoBMϕr9[Y%$XB!Y/WJQ21|FCedh˪Id}O&/JAwN((a\,tɧR(:z Y4ڲҎ$/&m^JM()?߳Iu]p J Il$*0ѥq2m~x`Ƥ+KSZi=b  Y$p{W%5I{_D*R z6)ɆbbEd܄xדrdURQd\z_\(Բtx(S/Pb1Hb"av912M-XVM*`HX,A A PX%Lk})1ъ++b1 $1R (+S?BI^yRq1n,L( K^B;ZDybbY=Odmd1/H Z*pRI(Eb†+$7%܆UT&6JL[ e x|@I`{$"<\VM?Y$sGTjɓJ@I1vE]/yE* 1zĔN(,ݛܖ+ P;=;Ġ %/9Iъ65ѨKxF<-&os=z{S ehmTB$0LJ;Rns8N|4usZm aA?91G@u ҬG[M뵽u4_mzzL[Ji&ϡw_<~ u[=Pl6Z%7% Ƈ%I|%Ճz2#AJP*+VLjyGL2jn|Bf (z`h bNAiBrR1M C~8*XϕmGLEL׮+UĔD (Y_ֶxzbD"K#UZ8+?|$%]7D9dRcT͕{0n,{JٔzHJ%bMХScyE#B'} k[Y%Ӕfkz_o`DĆBT$̘1:ICpXG{Y& v 49V-J/Kሔf^IK F#VLjfbM#rvz rz?^~Ve}?C[C$"gӦ=;jK+WsϽPap 1>."_X|W0GVI^j#u`_h8Gqcf>|N=TK[nscE"]vW裏s=#GH >}heڲeƍJ͟?_ .ƍcp8 6襗^֞=^Æ ӄ wڼyfzIZ]qIWL/QMMM{K.Xk֬Gŋwr㶓t]tC:'Dd3})!lbRˏv 4DI{IGgNSF5>sl>EAuݲZ͊]S~t9g+V@ I !Z>\:Tttkaz'SOSNQ$r1b~O{bu֙zz_ijM޽[?;76E8=4B2v1i^w>ݿ"M(,wi 8^ގb;6\ (ci'PXށԋ &+GlEe|ޑL'Cd|OGkYR|'q!CA4hs_2;~4ٴN Lq0^ X*}1+11T r%'tGhŊڸq$cСCq&| w]uum6][#kvڥz[[}QtU#[ϛygl٢1޽:~#8\Vn i͚5i/۽|$IZxL..?H5L6C>s=X] ,/c} wҩ@fͪoC,='"#_ 2;ҚI?ﬕ=ܾ 鳟Y9:B6\@ʑV HgT6>#g29LM]$gV:ul&HΆu'N[r1rG eCNaCP}}R?j*&oU^%m~MZ?hc2[jU9bѨ>O:'HzRmmrHkWKk@.y';pɩl)tF(,9oh?1:LA:vJ'ӯpU(,iOh}9T6\^1u /3h_߀5qi/?hTUҶIp|97&_o6CNsoh6dj+њ7t9۷oҶ~iٲv 'x\#^Z}5-ׯ_;mSЃ<lY.=b҅36͟V1"$2f.?\Axbiy~m-gUhG杫+43;~S<6q֮2 %lt+Vԅ^e˖kӦM:cTQQu)V1ݻƌ9V e-_\7n#GbѨ飺w$y]W>b _̅%Si+MCZ8Sɘ_mm^xa:L[[nՌ3y^1:L]yTWW5khIwgw>ںu^xa$Q.b͞=G+Wx/(@؏>I}-嶼u›@ŘYΤٞII9Ix:4vI4ķA' =|ߗVt _2u6c8NH$H$+soܗnl$uz4R{$6.}=a QYY`00sQ|t!Lgt2.1.UnYjC7ɮիJ@aK``…!l̞i)\3Ws6Z.mO_.Keet3U3gK4tNoԳMoׅ^+\f=3gԩwgi_?'_g?'9s=ѣGH G쵣}=a 'ZKVIǧ+;t5rZ?7Æ qUU剾u庞|ߗ&=ϿzXԯW.o~+]pڽ{w\=͛7kԻm6}њ2?4fr˭-enj9V_US|?}kԟg[oygOwߩN͘לm˖-={6mėhkcOVW/n{xjQ"LK{3_ bst!R*1inV[dF>Hdb$88~rgU0u A555i];wg?O>5kKr/r6nܤnEJjj>ҢE跿?<͞=G4tQ%K>DtGyeʕq&pw﨡dX,I,1FtqG/ٳgϼ+9~~IDAT;׋u"m-SP(.f`,g23iާlKq4 {HͤtnR3bsܗ:eHӉS$ݚ:RVJ?WL⹳}yXRWLJ?4WLaI&!{7(L FJ2!tEBLazש!U|Rjl|nS9GEn4S$9J8J?D)5i.j$'1_AL3O>:L& Zcڪ)vH`Q.]I)kl4ly[aHMsfOӉu @GTt v3I$79\v9&v,6yOmRs-R{4N4nR*@W-I&q_[aL\0\m϶;”g+&]l[&uRԞ0Rz|z5Yo>_ C6oxs7zH#FM2M򛩗L<2q8IseB(G62LCem{[z\*ڔg+F<_YNݯ4lϽJ#E.T-CmL=er&5wߢ631mR.Ë eR.4BE<>]eZGTjS |YLN=u_JmRFaLLg5%zFo뵯=éKm0ٮ2\'6T(St+\<&^*mm6)S_{k|G)0z>}Y e C `×/|ۥ c2ld7@W֐t:!LPvH91ʷ'Iܟk/d,lDgڞ.ɧL0)n Ƥמ@&[\ÔivL$וH]8)eaL~i+):r cڞ%^.6NlÀښǥ@&1bzv|؞}U)SNۑЦt=^ef;X&m+D(ux` \>[ |zt|[(׼ݶz U`!0>(3{2%/ګXvb|\l hjqU#)԰![s>:EL\W8ʵ׋-е%gt PN@C9\C7&]\VTJmC‚b1m53"y>]:) XӁ9=wR>uwr L5,bHhb;XPY$"F3P=Ul]㋢+t3M7s@a T&z\BS@arR!?,tt9@~ ѣvu\W :khӍ*g;zBW L ezH p")rX`|(,$C`ʒ"4)p0%gy;Uw  u@3:Ew  @nyEC7?hzJP`V@eV_ g{ @@g{DPtK>P'LBB"xɂ_rD@B DHD<*M`+IENDB`resources-1.9.1/data/resources/screenshots/5.png000066400000000000000000001655261510634446000217130ustar00rootroot00000000000000PNG  IHDRb6%gAMA asRGB, cHRMz&u0`:pQ< pHYs   IDATxwxSe;g)C /S((S:X(C(C ɔʒQ@EA6eXG-mI uIIϐ|!Cw 8Am DxpgD1 7dc@^"IЁc3Ȉ+ "+2ϙo'4[)әq>_E(HlN.W |\)Phݼ,#_1yr= :y}QBCnKnsy^mog0r6() `% PQd n0' /Ġ rq 7r|r,? E,Q]pecnstn2[.ow3vA6 Ipr-lS(2BG رf¶9ךɏaA^003{%G;Rvf5/'L c[0p''` ` YlǑly\Nfd ZlY'?/B0@AhJ(@@1%$06PɸG0I5YYhhs[1!4f` 9\/kc8*G 9R&k[}0 1bfyVLVdV#0PP ˲ S dV˜"Eh:99 jwBNl(8R;@1w2!LV3*>cf$Y_/=[oM.*S3C̚9dW{+hPr,Gse1}@fM ESGBc3ւ1d1m2ޘώ)y!"G14}V6gXor &0L14iCcr< ̑L gpI;1l)Ra'2C"n2YceG!xF% ӶŶ4Ck6˔e,7t{uGƘ i0YsZ0iCөϦ,d6 @Aetf5\,JX>p41d֐a cƙALnwfHFY55*x1*%|1={~*KFwj7׮]UJ83n  dKHBBsׯQ)!E72͗6Y.te,ɍ)3knr^vakUcL0;`L ^l6,epW>y啗^:JRRԇMLv5n)SxjU0Y0IЋﹹwZF"~lȔjժSJȒ1YUY5sfޚa@~ brR&cGi~0W6lE|1@w҇1}ɤ!#H9c}gybujLg:c`tadF@|1&&fF{q[A"=2LN.]֐<:Չɪ3޴M̒WX~0ק^:&=y{3f,ʸ]fCS+ M=Ѧ B'S|O+Cw!FLfI6[bT^1<(#0}¤hӐ!+xxxt kʔ)5K)Z2<2oqd%)a,,0]գ̖eUe)`h0V+~kN>&Iruu߯}ybb7{+k:u/IC=3jΜr'u\]]U\YhBݻbŊe~h7Vݺup˟5**Zmڴ$w.;vC{k6\rz޽fs]~E=_ }1cƍPCK.da׮]/Ж-5V>ԤIc:Zxl٪p(QB-[6W~}c_/,,L{ﮮ^zۧZ|͛/OOOZʔ)#I믿ԣGo%''kʔIo'c4:wVD={ѥKl6NڪY3@IIڽ{ xUϟ/TǿBSJ*k$hPj͚:z$i]ڸqL&Fi/RLL<==矇#c.zÆZ jҤ,dYV?FEE_w+))IJjذںu,GK[Tfbcc5}$ժw}OjٲZj*UUNmթS[ʕ$yzzթS3}FI޽tڵL׿{okR{UP^'#= u})Sռy+u.]fȑ%lZ{שSn(;99Y-SOuQkZtDDDw}jbm/߼y7naFjÆ䓝բ#zͷtUGV-7oÇGֈtW>,~$Cŋ$-7q \\\$D2 2Lm.Izgֺu*]t2 Pn)߿ٳiѢ!CDPdDEE)""B1JJJwJ+!ժD(""BQQQxxxS݉dvo]HPClh>Wh<ܔ4hP_*WlF0]主N:|\9scǎ;M\\STlJ"o5F˖ڵkX͟P ,$?UX1j̘wn({whl65kTW^Ӵi3l  xE~<==ԠA}?~Bo=F|>]YGsUR%YVmݺ]~8wޔBQJ/QN-{w$i7IFV\D1byQu_رK5kԢֈ榾}h„Iիf %KjܹwU]/+}e:uJ/_V&CvHd)>>^JHHpxEDD*>>k2(H< m85H/c&' Ir):$;TLFe2rV!!!lv|<_ߔz-r`_:tRHHOHzѣGiɒz뭑z;vJEEEl27o{qL~qF̙#k$I˖-W||6lAgϞSr2͜^{UI҂՜vV\ٳ?:u^y5u&ONiվ}:3~䑇ӽ];>Qbcc,I4]EEEQ@EEEkٲ;ce˖S t%mBCCUBy{xk:&&⢺u 7n@6)::Z֯Mъߕ={B<ɘO [YY[3BΜ ҬYSIR$I"""n[?p}֭VNP0ُZo/:|R.Ν*U%IիWSbbL^zU3f$I:}:=>IWG$ jӦ^x!eD$^Ӥ@Mrt?*dɔ4j؃:w}?o9ufϞʕfY}׼y{jܸђu뾔bѩS4lhqڴMΟG#hvxj˖kb-_2&rxv91T3fx{[ cdWP-纪qaV6oޚŧMڵ$:tHjѢ ٳ)Cj̔(QB;jէ|b[SgWz,.)\Νu#utl/ ^Ϝ\ƍ1L;ԶmJg&G֭R&I"IZx=H5l>a71MJHHP:mm[{(11I}F*U(I:~ߦdqqqHU;^Ȧ'+66V۷S͚rf*t,cr3 fl* v%&&uG={^y5{s(Z2~}@A,IJ HI͛7~'EEEyYŋ5nl6=*_MR_>̝;_t)i+WV׫tChRjUI{gJ Tjw߽Y3@wQDDUٴ)%*UJ.+_2ڻw~7M4Y6M?u{A*))I'HDC?s:,YB>.I=8JYޢE IҚ5\}]/ի?o헗^}e :XA?Q۷̏]J P,rܸ/0yP!Js#GU4MrիEǏ/pRG10 w`<կ_Ͼl۶5r(WZj I$+6ѣOPxxl6ʕ+QF:~~ڨWpUZUFQ.]l6ÑT:׊+]{b p WW˖͵uvG{:ϫi#ԡC;ZFΝS/bŊ_%IP UR~w;cp|.^$???G#Եk9rT+W~=P^>}vu'[:v|L~4Çŋ*^.=S=jM:s挞|/~Ξ='!Cُ.ռy)۠AT*U|k4{= q%G:*!!A2L9אEZtig9ruX;$U c`l4{L[FM%gӦoEŋOA$5n|<<>^={vɓ$I?:th&N|G:=OCk۶c.}F+Ôŋd:QٲexjRQ:s&DjԻNOtkɒԩ,(..V?,Yh?G>>>Z`ڵ{TfY:ujk)zV}:^*ժ')!!AӦMA&M~ G"##_dkJJ:00U*U`0hԨ:u/U…g~. $%gfx<2Vgkie5] }[ pZW6>LҒRF_< ֭Uh5xz5WI&맟6TRСdRYVt_|DruuwmФIu_[f֯No9J6M< F)SF ާOhԨuIҧ~+?QRR:th2eД)pGX,. PΜ9#ȑoԩTlYM4{\KRm yh7U|9]\"Iџ|չS޽$?Ҷm_{Sn^PӦK:{jԸ[gSbb5kqHƎ]vO>oܹ%ժ#ޔ$=JLLԐ!K.k߾}:jԸ[ gΜKgɔ>5kW_}Y ڳgâV;ޥy7+x*UJSNш.S{]-[޾`1c(' SXXAm6?SRJ3uLݹs)pjR'O5jܭƍP%Iǎt|l\vѣr~6l(///I?ã-Swuu՜93;2'S3 -[6ݻ_iǎ{@ f_Nu›ݶ/;P{Xtʗ/={ҥK/3Rz={H7${{_7Rp?~\[lUPf2dp_0CR(*g6=4íTREmݺMGӯݻa?nYQ_FC5W"""4r:{*IΝ;7|KSNq<󡜎?>3 ٬ݻJ֬Ԭ IJLLPՠA}EDDSrqqQ||;>|X?_(Iڳg2jJoپm۶+]tQY,l6ݻtR*Q$i˖kW^ 7JNNVzuՠA}yzz?c5FgܹKmbWTM&}ʔ)#peʕtmswwbccMy)3F =6n RBB*Uhm߾C5j-_biuնme6Ul]MT^]0dߤ$Y,ɲZS |=woLI#j lҾ}jmrssSKR3y6]6)%lJv HW@KIɒ,<ۮ?[Og|]_GiItVr-D0r Ib I zp-: F  Z2p/Q#Ib Ib Ib Ib Ib Ib Ib Ib Ib Ib Iܳmv͙3OW\v%KYD 1j[ a$)<@!G aL&~q9'fjꩧQ6 ",:t գvȕ27F-[F;w &I6|:kܮ͛Q@ A ;bkFܹKo1D^^^zъPtC]<#GhǎTvm=e2^ҥ˚3g/Iz&8Uxsb .___կ_O{:'ʚ>} I1\TTۧ-[jRGӅ ҭ[Ftkժ]t-ZCiٲ:{FF8;VRR&N|Wm۶W۶5bětCt-ʻ:;?+E:w ŋp"p}pAA[Tvm yKY=zt;rHuTREֱX,:vj':':ꫯ…ԧOoN7A,,,LTѵ po=z̾ɓl >}Z[lKձrssshx[5kΜ ѡCeUZSmٲMF7,U*TMTVMIҳvљ3!8p<==cի׋n///M>U/ԠA)$5lx_Q@b .]:KY._bimvѰaC5lЬ7Y' f̘+44T[?zK>brшn)PP3܁ 7N;Ϙf^GשӦ aaWl}eD5o$iOo__iS/^ӹ4,ɒɳM5ô-ʹҼNPJ3ϖɼYɵ1NB$t Mtf5hP_իK.]si׮`%%%Z=H+{6i0w߽z63UTQk׮$EDDhڵkTE#N 5$kwꪶmڵkھg=zT_|Vz+j(PKƍA=zqo߯=z$zjx>hvkWt9ժUS˗< ͙3S{'A @t IRjU5jL&رK%K;cu5=6lAvqzuJF5s2 :t:{j ЬY'ɠ~ڨifh9 Z1I҃6тt1kj֬zce6e6WI6QF+44$%%JN:-Ij׮ ڶm]vsQIұcզMt!$$B  1(11IW _ZKGTVD6С_jXTVE{W\\5kMR2e}2V{il)#5lxndPc$( ֭+IY "I:x>|$AyoPZ5Ӵ~W*W~رK111j׮-ѐn+W$ܹ>o]֩U+@{iW^^^ڿwN =j@!k꥗^ձcձTTT$_]t$;wA ,~ue{ё#G$I۷ЬYstMgyZܨȫ2 :rhuڷo>[jժڵkaˆ1P?tB=p+S||ʗ/V͗$Cvz P~i(0̙ʕԶmK^^od6GnբEsHUXA )gpf̳e2/tֹ: a/^(Iv-J{/}~Ѹq7E#00Ps5vhY, :LW^dEXJlׂ|}8lo1(..NP4䲌!SնmkIRR4m>}j1^^W -[rB"*m'ERbcceX%MI4%%%W֯&I 5nM>UÆ1&kRx$iX,rssSPfK;?͟P;wRBBԩzjBBj޼:tԤIcO>>ޒX͟@;vjUzԷo/{D-XH[nSLLj T$ҥ˚3g/Iz&8U˗oVk~˗/L20zA(҆0VU𐻻;qwwŒrmz]f47FL.ZlO]_Pٲe/jƌ%IkGwu$߿r1˖՛K.Dy;vTb>5#il6FcǎiQ*Q yC/_$]!Cސf̘:1c3zX8qJ&L d5~8-_D; sgi왺p,Xp{ܹwrr=lM4BEMf)))IRJ0RɒwK͘1(ujI={fϞc]lY} mݺMzujӦ֬\6mR~}n=DGGO>SRR7of_Y}[KUbI҈ԿK˯5`@?}zyxxhԨNyg=*Ţ?|X!!guA͝$w~*]momھgI)/[ƍr)[lmN8%KC)eLu9:uj[*]Jn*I:~ԣGte(44FSO=1cƩw~j>6T``Cݺ iݪ_|.eoխ[O5j{iMK")cm"јkp\\\d4eXd2dZiT䢶m[kժ5::u'NWF4eTsթZ|֭RԦM[oݺu4x TRg]-uSGjǕ(QB3g S;_>tݧ?8iӦOӦ/٬ΝVӦMGРAk3OO]wiڿwZF/Gʕ+˗EjURR!OOOl67E={PF7|EYrwwF~Kq]H5 TϞ=nyJR*UTJ.PZF _QhhhyHw}$) >lo(I WRR]&WWW+W8}/{ӣJHHҐ!4}TLAAr}F۷]EFF߿r `NJJRLL*T( PyyyIZQ'եdILmmiuڇ,WyLe &11S+Izኍ͕@zcXUH]*oo/{?111yY^bOjB Ĥ1QQѪT_|MSFMCfYcǎ+q&ImZ=ztg8YKrl%%I -& ..2KfnqY oo>۷Nho-> .E6Exe7j(xNk0iev[F"#:ZD@D٢9%1]KA p̈́\G")5A F Q 5A 8 A 8 A 8 A 8 A 8 A 8 A 8 A 8 A 8 A 8 A ֭=1Nbd-]\6my%Kmٳ[? o=V{챿Rݺu4`@?U\@>B-[իdNxxՒ ӧm/00P$EF^矯Сôx"O䁍$I3gjO:tX O?m KիW[~l٪'  ᒤڵe缛6h_7uyM*Uŋ%ISNb6w^)hڹsTNmOիWrVסC&M~$jڱcVի}{ٛE%&&jEںubbbTf*U%I.]֜9~I҃6˿{xu롑#V)22R_~/! _\Ժ4*ҦM?Z#I6M.]Vvةb|4kGjl6=Vǎѣ3TD ._,Ir%BC!oo/͘1Mo=JuZcƌg:q&L>&ww7 4TRikqZ|+w&jJƏD͝;Kgԅ `tgSYV/<@gȷRÔ1Y#&::Z|> k IDATԼy3|۷KUbI҈ԿK˯5`@?}zyxxhԨ2LwGb?ر쳕$9\=UAAչ *UNڒ_MIII2S2PjR~~~ӧٻ(+Y98A$īXj>zKţjZZzR- ܧ A$!asYs!!Nڙ|v潟$Ik~2V暫t)'4(jNk̲e>$YݻgGqw^em۶+99)pHa6lnvdm:tH$N$mݺMeeeϸ)**Ҿ}E}huiԨ4z(=*2e@sӊ+4|p?Vl2Vѣ;; #"fذ喛$)^)))2 :TLj wRR}/5I?Q=>S]|!G><fμP&Lʕ__֬Ykn2О(:ZψIIIQ~ԯ_RSSHӾ}_~  I80C7n*++Ӑ!CƍyHaS?B|=#u5g\}*,,z#}?'ըQ'?Q8 3U_Wtu{䭵f2MS3z%ͭuyєj+4˲ez7k~VN;@#yCV^~y<@Lϛ)ɔՖdU+uTi*kWS36xt5W륗ܚTW_I@B*t,1!pA Cbo'GiI![pd8n)kC 2(LK u%NJiQ:(* 0@#GHb( AL>1!pA CbB8 !1!pA CbB8 !1!pA CbB8 !1!pA CbB8 !1!pA CbB8 !1!pA CbBx(gGNX:nAsX{Һr˨1ܴm-l݊Q^Xڜm5j]}mζ=2JF_Q@sXMets)QXV:y)4I˲Kvɐ!ɖX۲%-:W}iݭғ$ٵ[EA[_QA\6أi.^VT> ˴A]/}KSAi\/Gqi4g-;lIk,ܪscAE3q[=;W[ڿOWCY-u̇1%TֹC\շo ]}s5Fz d1`c6ڴVΒm/L2R\zҹC\2ǹ8=ʭ$+_ K%A[#ܺl72-ٖ<.餴oqZRn]%0I{Ê-PkQ{Ӱ MDk}+ۦ{c5{M>ܲm +Kc5_U[R\:>E:d!tPNݼenl[8 3U_Wtu{䭵m;ꅹ7ֿWEVXinw5#P&+5ޥԄw.K ]7Se4Ki] a=4Ko`(aFqW. *;?`ɐ4K MfD]-~_5]HhuiP7FKlrSپö>Vd\ZÖ[mC6f[mǨs$ٶb*ơ֧ԣsg[RV&/s^7QWzzUWie)4Mn>!Ҭ鲲v*?/6͔dJ jKuەU4\ٵ]eAL[ b.}D=:4JRp^]\*bn.%5 VDC2$ЖVeImR#aɨb˖b9o砩* nRpUTXfWY=y/_qǕ?21"%֨la9,jRUJ6pJenY}_ ٵUR|?hbbbbb:@䊠[.4TXjE" I5ԫK.AVzWW?މ&ͿU/^Ov@Kl@+۬Cܮh7A QA211QZ!$uO=!zHM!oR,y-WsUOߤ-//>])S~_|)0<jbthv(ҿK>,K|O13gP0ZAL]RآƢ 5͐cNksaVhէ˂:Vp dܥOPųd .zS튿g2| L5uޥ:uP~F]a}S@4ك=J191rr}@%UxN+/k_̑='I>Cybs\{tJR+U?VAVe(;ޭٟFBC1U19P߇L;wڶC (2tڬyFL^9TbkvV1@#]^y11Q9Q,yU@)] ڭg@ gHK!+@M޴M~}3gdP]Xet:^xz|;~ٸT ?QݺnPH_ڶCm2l~RJM8U+{}=ucO.//HiI![pp 1$yRh &:AL //[5rtg4gsYck۶#]pXO>QV&W/zNk^a[ @G+CvT(1Ͻ?R0$`\zgP<2h`PYro8yƌȽ;O'v\FFLbŁLxn>S7M׸r>rYd7tB^WsI2\HK.eH"WJX*"'2Y~{APPtv{ʈi{F*l(T\| C]OF{B T)ubMi\܃)֟VynLϏ׸sw)rumqܸEr+rse̕/С Νx:Ɉȏ7WgKR>vn»z\y2OGFKŸ  !iIs|kqOYɫq"MoƏġxvݴexMm܉$uZJK+ܽ{XھY'u l-ee bهUFbbIN[J_ Ec27QRGШ^e{sWRqxS'q2~ޣw "JJe~KvY\d$$HqrR-݂ A AL(u[O"Q]f}Vbv %+'GjWݷ!55$jo5Dڟ-s:)#w>2]FBBNȣ)d Rم^@66v'Xq =0eK"%l 4|vqIC llߖGݷO-d]К2 #Wbb۩[ O ̐w)͞ A AL %f߱Yh%d NXy'uxZpْ` 0 DкOq+F߆֯7\z7mjAqu0Nڲ1mY\<' r潼}\ GFRW)+ۊGU[EwҖ0A s;$٥C!)P@vze:8iᑑ ZE8 !1!pA CbB8 !1!pA Cb}ŗZlYf̘;iwة8ճ_ĉԷoyJ u-үPC7S\| P4t [xsJ;v(99QA jp\'Qz#dɻڿ4~8 Kƍ$I۷OiMЀGe9oߡWT=ztgx?Ԯ]rcD[|֮]'OբEՍ7X^Wkwhjm4A I, 5h@]pڿ?[ ,TbbN?}aS5$IҪU(#c.۷_/ 7\W%iR_-_B۶mWfpmܸI[W_}B^z?ݻ7hM䒋w]VcF /@w…t嗩sg?-Fho'45v:t6nܤnRkIʂrݲm[@@III-Z0$;Į?~\dѣ$IVQQPqqq:t(_}[4f)5Qtɣm۶Ⱥy#B!%&&*2eYvd#ҥKu? {lxDA ITPPPߡCPc@ ?XW^C~ٶ'xQCUBC ӕ.4lZ=͜]RM0^fH_G\\@en]$ꪫ.gCU۟&ի<V\%4w^mذQCʒ4 O "nJJJj}Oe׶mkn-^&I:t(_?+ɐL evة'*( jUU0U>isϽ<6<1Q ҥK}ҞiӦ骫h'akswiժU4}5ڵK^{^zk @\.]p -YT~Z~yV oߡ/\3Ϝ8}gJMFG("yg3=t#6}{kⷫ4zӬXR?э:uW_|M;K˗~v;o~UTTGfͺH3g^_|0T]uՕZp*?;gԳgOiʔ)*--լY35iD[[l$]֭[#G*#c~S " կ~N8A)))>KLӔ$mٲU_e=E1"99Y'|?~{=~|/TXK]|H"IR KIIt{ Uy#?Cmv%''w^ahذaںu[_BBB_LS'kΜ''jqz%6lذc AL%'')77O6lСCu? { GMnsYWaa}wM;[{|>JvڄT\\Ҍw =SN0T-YTcƜe˖esbhڴiz饗uͷ5y3Ϝ;v-ƍu7:ޠA=Gڵ[`Y~M<۷O={_~F:>,͞}>lʂ4i";3b+/_."]q-~ǣ3Θ9sjРJO[x^-Z_Kꫯr*yl-\9\Æ o;}Zm߾C=gegg f48JLLO<ɓ')66 p!"׫뮻]{5x8sp{g9ѣtwÖju IDAT?֍7ޤ&NFe><(۶-PH]v }+/#ya|>o$SRW[UۮԭJWSϮ_:O<#4MNNj^}J h#շo_ҿW5Ƶ,K{{ÖnUI#@G~^W+Os6gw80q4W P(?A6m RbprM喛(VjjjMJJߟu++%%Y~B>v-JNNPj K/׮]կ_nZr{0{)SO]iiܒT jĈLMvܤg Xc'h 7nܤrKP A VVu?ѿz%[oVrryg}1|>uNCrQF}`\sS>}t9g) #Y7c0a"&lӒUb+1Đ [8 Yp[uu?֕W^^vM6gNq&-XF䖤{Qll?N =,K.AL٦2EaCa;ƴQn[={A7O4͟PFͩs`-IԳg(+kvܩ>}aaDUbe3nhfϾ]?>G#***ԠAcѰaCfyJKK9旺kzu=wQ谌0?\U^EZkNNZێ~bbM17S))\˫-ɪmWV+pUgүzw=W7A(*YЙ+Z=qJx s .g/WcXɆ ,O U7P<>5_}/{]:P$l qADv3@=YALu:W\nV]Vp}evjen>QiR QPghGu'O>Ю4M+2) ( -Az/ @ĭI*(8L1 v 4R@4 J?1S* J #D(drv .YhM1 cZAL%E!jbB8 &*͝;OP5DQaa/~[O?/ 緿Gwu/~[ݨihҤ/m jٲuA%&&jʔɺw՟Gt+-$i7pBOxW^yUK,՜9h(:tH/Ђo0 5yp8vZ3ft}7zZ w߽U#2^*I*(8 j#sg?VDJ^}Fyql} b-oߡ|@z$tHtI/~{ߛSNׯ_+s9 @+19Z_ D5k qw֤:U\fcoT>#eJ={*Wfv-!2QhNy NZ^/Rp:oyz)ac@xeӻز3|9IѸ`wtEum:͘SV:_o)Wr\]jwZZL_e6ӌҥqCVUڲmϾ9rsnQ=3bxӔB61~ +Lj̫.Ճ?p@٣rزU|^]k˓}/wZC8kJ?[#;s[55t(rY߉ <ͷ۰[7;R¬ $;~ޯf*)Q&{ͷSgU+/#-ב:0U|LIp-$Z][JU]Ku11A A A Ik0/ݫpqaU;0XTɣӊ4RpV[_"L] _s_ѣ=UPW8@{\ZTCznX綒_b7(v7nڱ!wΏ*oؓFXԿ=,O3Ϸbbbb1m hMc/tTB>%/UhZގmBhNY jG!i2 .C?#O >M;!߿C'oSm`?TS pA CbB8 !1!pA CbB8 SZ@;آ5ݔvS:)73 `|vSxzp΄v P".Bnߠ Lh7b5O*^qq/hdxMݣ|CO87fYA ~pY/q&7O4M@AyEkV0Q#[h$i„-^_|Y7*7oެ/\.@gWYYP11H[j \. r\.gVz^]U?<|Ymr\om*,,Ԛ5_襗.bbbpAq !11Q)ھ}"I,K۶Ќ%I[lUnm[B֭С|-]VbbMxZG~~,yWWBBƏ3\6[_YYΝShUw|un @b)л4QPASP y;=穠;T/JIY$!ټGݙgg';|, }ڴiNz]ֳg K,''G͛'iĈt)Hۯ9sJMMU&MBΝms-eі-[uM+&&JmZGYN@@:ug0 ݻO}ۧXqر$5{߿_)))JHH$ vQ c,^ IDATյk_!xǎLEEEU]j2224n暫n@ O>oСC4cg .kӦnf9Bf־}~_yyyktE߫@7ߪ@_ƎL6mњ5k.بWH*i?kyn&eF@@7x.d,Y 2wޣ㯨pw-Qti̘v:y^eeԮ]u[neYZx$Y:֛evs pΪsVΝ)IZf֭۠+\]wrrrw???qi֛3>m!nfuA|2CeO?SumGѶYrڭΝu睷U9) 6lWV^^O@@3f|Tv-ݻV^} 1js&936RQ;k׮0cÆ ҥsu7lhvڐ]v4շo9kNmeڵ[Uzt*9w例kׅݎɯLy3dy޽p8ԪUK5mT4|pEGG+>>^]vwvС/Z226SJMMСCtOFFw^ڵԠAe139YƪHnz 2HqqqСCqc7Cj׮N㯐aOڶmv-I4hN:thԑ)I ԩqp8tPLe˒0 GO޲,LӔmӮ]ڮ][%''>@ !Cr8duxB"=zHyQĽ K&q#kh*#cz͛hܸ+®[PP˯yjѢT4kLY[KW]ueql iH~@MʬW҇De͚5S~~r,3 CMJo7\e;>R;8T-XP| á>}z~suEGG5m4d;>UٶK[dee)++KnwɹÞ-+=wY&M,+[#mS#cȶÜk6Ms_6 \.-_B˖Rbb39fMCX:&f/5YVc~7+L L|?O { G c\7y+\\;7nRܫSdG*v*.ƶ^Z)*2XrSr8~9V~/[g\rJ_'`y^VJjBݎ|?HŽz쇹[xgu\׮]| 5mT !e5jHJI)fNNvpYƍT]wueeTNNvСJG1 UyhC99j֬d=nwee_Z_k[e^W?Pbcctࡐy^WjԨ "Çi߾6ClRk׮U||~$IK(&&Zyyy!_- pΪ9+7(%Jrrz.]*qF:t(;d^~~7nv١CԹs*cvvc9oY|5vyK}@3f|~Znݺk8ٶI^9|ފQnnV^0P:}H-%%PܯUܣ +6B rn,$V~a;ogc,$)Wž I*Ou]4gZfmM%KJNNVtt,X\ֺu+hbW9999+wޯԺu+9N-\H_{՚5kueB?G54MuY~;\{g_gիg2׫yWN֭kl:ws9猐mۚ3ko.YtMչs7ߩeN*j5jNi:dmFeɲ,eggkժN:;uꨩSk׮jӦ/^"[- pΪ9qO?);;'8vn]`j޼dRhҥy]m۶]mv:b]\JEEEj6Ma0 -XH֭۴s`smMLL:vgRƍuV-Y.BI%ddlԹ#!T2/**J˖-۴i-߯%K_ճggzQsWtyiܴô'TKdWz U2WHuml@$Uxȗ&_ ]}ZHEg܇g XvII)92w{:n9re/](ܻ_!ozG۴3-sΐ tgܻ?ŻvW}ջr}md۵[I|O޸9~:zͷGH1ȶmYۇ+سW;euh'熌JզtQ^^r^3 s.9=g ]?h#11¼l6y9-eۜkϞ=WW7ߤ_BoN.K6DmkZrLȑ#4cƧ;tќ9s{n6R߾#dgh9ڽ{k!ԩSszw*̿jݺ&MzEwugN;mڶM+72K={А!GM2Mz 5iÆ |y<O;wԩ7|74աCHo ;=o2335oB߿_.K:g fR}կ__/gi=JLLTrregg/֮] )R>k. ?8jRe Dx2 Cj۶_ٱtOZl^Zn:3x[NH?(77IgCe99FMڿm45kLaO;67oޢK9 7o226H 4h`p#˲j-Q:L9VXŋo߾Zr~󛋔={jΜJMMQfMeIG'ک89Nc4nWoI$߶@i̴<.2Uff^Jr Ƒ $/s^eF$iӣ^:U-[TXf8 GlRVa/m3hϓc~嚶Ed\\h u8 w~=/KP=Q~Aidgh VHl;&a_Cr^eW@vs2%#A wyOgqRSS w}/ґ2@C)A &Ur| =GFQrM9\O8PQ^^OT3RIIh˖>SNIrSOرQg} "T7ӔݨQEeTA\\z+ E0ti5kEGGW^j߾ "a>}zSꍔ]yX*@ jA @-!)4,bp:23 5 M%|fĔs;P\NAL9TgXR_N?,s>dWtˮTVΐeYY;5r䯕E}ƌNckǵN,]~8}< )=ST<Jbq:kLEuX\\c[lwܭtM/{g4cga_~>}t /ٶ1põJIIrT>BO?.t&O~I#F?!-^J5a5|}tM:M7o .[G-XP|@r"ۭ*@Q׮]tJzCi4z2 #dw]Q.5kޛ*۶5veT,G Giܸ^zj˖5`ǼNY۶ЕWULLҔګP=|5jԈT A [o__C[nUCm-[@VVvm%42Mkr8h f/Y'NڪUյkm۶-x^0 }z+!!A-[yDŽ _5k駟k4u4u7V[?l7iݺJKKTi>Ҕ)ok~+߯UVkժZ~C 瞯0JRrr֭[lٳCzQsWtyiܴmwPJKkX_Ki@@~_e)//嘆O?-ϿM6+)u%t@ nM#Fqٿ'|ZfVV4qj<@9o߾ W:-\H>N_Hk׮?|]{պ $+kt:efXGW$r]%Ya~ے2*,Wyvy+]IuA ES}A jALpk@-!%1 ZBPKTAZ~yYm߾C}a PZZst*Gj>m۶5$۶mv=̳T -bَ;$I3g~.kY;m۶w> ?.xɒzvzsTXX={;nWJJrۜ5k>xmۦh 2X_|4k.Kڵյ^TڣF]"IiJLLԠA5nJJJ:b]ddd衇~Hݺu`91լ%Lf_i/+.]XZTfr\zWC7iDRIK4g\wҾ}C{ŗbJo)**Z}>EGGWOOוWߪlMn6ҋjѢyp6m'$_7dTZ;C*Ν'umwj„gSNIԼy"N"a#G*o>%&&Ma:;2꫓5o|M>#髯fGݻKZx8Z~N 78Aĉ'w!վ};b}<wEeJHh|^jjGyL>;Q'>{~t@: }qJ[Ŝ}+)J'&&g!0*,s8zg, ̙_~!!T_+**R 7\kA;wR6_飏>ְaiȐoUW]w}G.ScǎO?޽{_k„{= 7LrJFK/@}ЌJ zkЧ~Ra1.7[4w7GiСCmTs~"ٳջwﰯիWO=?+ a+33Sg1LNNVӦڼyspގڷo^zq!7mTst#%I˖-.ך25q:AT-bڵk'ǣCOSRR͛'xRêZzu +>Ij$_oǎLuNNnlڸq9xNuם2MS瞣 ~wN.I>/x;OW^yF%IjٲN_/ v15O?Oj3z=ΝUPPߟZ СCz5d`>@Snn^ȼn#dԧgyZݻw$j*Yo +sUXErYsssKԬY`ΐ!5aZ' 4P_l| -_B|2=߯|*BԠhN޽4gc^/yH[xOuI+WW\)77Ow}bbbw֛"ϧ>A̶mە:s\.eee꣏>Ѷm5a3Unݺ*11Q' /?N?w%$4ӀjϞ0yuUw//Ԃ/W.T7xSPrr}?̮]_IaԨ U97tڶmӧkd:w'xLⓕZRM6 ]Gܯ[5h@w߽:S9gxMsȐ_>g;.6M;>p ۶kB9<ٶ3??j?#e.a5k&G#PMڠ\zN ,KyyyJNnPeeT\\NLӔQrкIp]%Ya~ے2*,Wyvy+]]eEL5KKKնmuysڶmKYo5vSiڵk{@@jֹs^{*T@ZBPK5 pT'X+B@b [fL !CEe{< x~qc9I 1"3vsR !/rA1dnF&u֡^*l IDAT,q!OO!&x͓ȹdK7Aeex 4#ì|Bp~^|ZYou^d{ t2CI2eFNdGVyrHßwv$#x<}>*UFSJnG:`͉:͎gaCS |gB ֤je=0"D^yy|Tg3ܒw&ZD'. 0˓q!΄Aa oAD]ˆSt hb"/+ȸð<2ER@CEa _dd #bmFGDg剔Pu1ፀ[yB٦pÇ"*aH2R6ds@C! _l̅3^l&k͋@CC! oAȅypax $l#ÛA剖Q̨ID*Lg~}.ã@lÔ+8w q!PQŅ-*l~\ I+ކp|b"+LWw![z܂#9\!lWlº|yl[F+,^h@b"-\2|U(B#('2c%U 4(1vcc<%8C㌩CX-SGTAL0᫥=+,U0屝rXt AL0B:JZ\85ȯGU S9 E\Q2iΨY#<[q!@Y>p>bKrx#<[F1-b!!@v GQ$g OvtKB),TE3F,WteGNyQ AL0r-.\rx*G;|uG 4$1°b!4.cm#o%-|BDDyDoa%vF[y쀌W:p -[LJ & \2|<>۬ lW#c?`Xo{d;\2lK Yy * 䊑ˍcdx b!!bGn Gv`IlWE9QpP@{9 /_v%-HlW_>oR= bV#'@A _d_/0YI GTiCrITeeUK3|Sҧ/(Ε/L0Nj=VJ 9(ʮv(ɖZ/ekh@hS]?ʕ5_g!GZ/MQ/{hb}-IGW(9Kfj[׮ߩѬ{k:Ry䊮!9;Ca1<)`\_bx; aFm[~3ZF;Ƴ(E/Rΐy(C?%lj*z|mz=[yMj޻Z$Kŝ/#wr/|S2OKVqEG*툪 ƵkMs2vWiv7>ɟ1$58K>]FQb|lo ېƶ-׶o.3rXSk,yIFq|ɧK!Bgyz_/u5'5Vy?W tUܗR P0coڶ*Q̒|5A5s*l#vFD9_$0Uc ޥN2s3Z;U5sr9B9;Y巠@2NG.;Qf^奏Kr8®[o`ÛSTrٮFarZl +3{֧עZ dɗ2Tfbeə0kE*O¶0ro-GvY˹jy!Œ$oG XG:Ŋ^V094lV@4yۍp_dls*v8d +ˉG)j\fY~T#aLvvRɼeY^ϻwptIir8J. aw]%Ya~ے2*,Wyvy+MS'[ d˹gۿtu||(#JkѷJV޴d{`$kk?/4 >:G#^d)U~M_%V!pmFˎZ΅!}pLur^,3g wG*/ unTy9111111Z bN`C1 ZBPKbj A @-!%1 ZBPKbj A @-!%1 ZBPKbj A @-!%1 Z jFaaZK,ƍ-IWNuꩧjĈ{ۘ4i6mڢg}:dWW||ʤ7xF8[\2F7x."s+UߨQ#M222C?nݺV:~MH۶mSllz졫J~{cS@ESNߟ ۧ}i޼ر/QIӧ~.'%Iҁ?+77WM4$hׯnNǴ6m' g%{)I>|7Ozucu-7@3g~;K&<;Ի_zIz$u hbQnnI-]$g:ճg%&&H~VZsjժz)ezɱի֭[^zI/_֭[+??_+W$XR77p1orMa%$4Zs7nܤ~GO=?h@ԋ/*u hbEJHH}ݫUX'..Nmۦi dR=3駟꥗^bbbԥK-_2$0Th!AL>e$iuuh'T={ꪫֻᆪS*,9K/$)uh9,KNSm?g})--U\sGLyC;wRJJ~E=3V _#I9rnV)Im[|0M3f|Ck ܷLdYF.KÆ[nI111;Q4g\4r u}M֬Y#ۭO[n)x;ڱ+ Yo5rJOOפI/~,K|2]5"u.}tYSOI^Tzznqm_Zbe+l2W CjZFF;-k+toM>Cw}tG 0*5mz(=GgϞNéz5{}oMHw}LyM;R#=QZ/T6l3ϔyᅉg/T#F]l=Qm4iҋzǔSCmYhS&N|68?!eddamذAg?D{{/ϧ;w)77W}V^^{n:$>>8?55U Խ/:혦^zjںukHˑi2Ma.7Glr9r\שS'\RW\qye{s4veJ_l`R]&MzQPNIm>t}zhBIݻwkɒ4zJB@ Pv;i…!rssNu_3N@g`„~߿?T~jU,K]t ӧv}>'4nܕzњ5kx=ou%}DGGK^Kg^}1SweOLL.dghяڳgfϞ?-YT4z(ٳG/𢲲n:=ZΏz]N3z(۷_/Q4D\w5jܸ^zi~gnJwu~s%I 4a³4in\.~Pvۭ׸ qF{}!-L=&MzEzn8cn P?'L(3Oǥfig\q}TE[Ԝl62~,R^^eNp-\(wznVNt4M9% n$K?o[Rܴ]fZeQ*33t_̴лMEG @-!%1 uP#_@y&qTQI%ߵelZ~dO6ٶtmTFr84tTHݦs#}uT-bKSm<< $o OVOJ]ըs'*(̘(*UFS -?L5d̠nrhݻPhܽ @T#_ @%T3?|KETkgnk6lSrSlP*Dž Z~{i5Q]ڸ]g,iԯhPF]4WTNX~i5Q]2_Q5͆ U!ze G@b [fL#ĠN+,*,mǗKNt' uZ?ALudi8YbP۶LgYr,ܣ:cp!Eϯ" uVel5r) Z,y,8YbPg2 CѦCr,ۖ/P2$!AUm:v|WN"MeIB:o+t(t1',g%? 89bPgZ~9 qr: y' 1< &P>A v2MZ0 uVQ$qG +YvrO 41<%i(4ẺYrM-b$!A 2 LSẢZr4UX~y0NA ,'FyOnӔ0߮w6eRpT*eroSSӔ4WϝE^E9M*N-bPg2M ,E9 S*sXy>:LnH,X>,MF}}[_' #5q YkMO@ BĠXᖫIϧ()CUby# kPv[2?##Cp8ԭ[WuҥV+::Z6m_k׮Wll,oTX8Y۷T `kذe[sOW/V~0=?d۶$ɶȅ /մiSUӧOW,R~~xMIM!њ5/K_%K먣&gyqhuQUX8Y;w iv0kUX8YW]uf>I$XE.Ӆ~W۷imۮbwt%w&t-@~hj b͖TeJNHj̝GP-3W;u'fʔ¨e?pN:irrr9sN ;x9;XkQڳgD>Og,áѣGicTTTl4iQ*//WYYys(QcxLѣGɲ,rl6nƌ-ѣ$I;v|'hr8:㕞}̚uN ФIGO^ku2U]]M8A_O|>mTP0.n>iUL,ӧOӿvڭK/ӌM۶+>ڣ@ !Ӵ!GсNt6oޢy<mܘص@E RVc/KM7.Ap{rMA0Ux/J3 YUy| eY:ꨉڶm=-fiӦZO=,޽{%5u9s˯h˖-㎛$I{֯Y[[Y?wcSoh  믿* / ,+8n"rss`WkZÆ չ-3q:7n>CyWbcgJ2oZ ̙3cyNի^xQ:2MSgy^~zUPP wܱrz'eYN;?{3x YhYȑZw# >Q/S 0 y\' FR1'ٽ7:_5>^wP+O;)mWQYGt:ahް IwuVVVjܸN | @e:rL_WzX<A}Ke52=ReggpȲuc.s$$@s;B^>^!("'wg3]-meInjj4}%t%eK0 @@UU***e;V~Fn[>_7C&!%5 #;MKnOnZO{01卍-a%ե >x֬yAӦM \ kժZ+\A)y4T_Ue6}[fٶ 4{鴔0TC$ qZtIaw84w;T.@ kRRN,51ti*G硋4U`}^eX\L!AJ b,Bp{}J "͑X7#mSe*ͲTUtA RR7"1-in5ҬF [(a4 Y @b\W1.PlkiltRVI1HI>\!cjj=I.T]]*<м˲A1HI, iڶiϧ iKQUW鎦1iZ/A tW#%5BrBCRiWm2|$GH 5$5Qiۥ;-W?_C>ј1ct啗,vz-_~cwqkjŊf͋QGMԲe 'sEEӟoSccf̘%Kӂe{ s}NSƍՕW. w<} u֭jȑ2=8q.xwD-KkÇ?>`w,ꫯ}iĈZRuւEQQ.dQi:tshe2?Lzo}| +;ax/OF?o i!KG)#o^eXM0 I<~\!kw= λl4m1ڸq/Q995k։Q9|ƎoU#Grmڸq-[#Gײe/yBFj7ؠ|,pu2MSk׮ӢEujSesrrJS7S\BS|_xwިA̓O>{?]kּ\_ܨW?^{Cْ{n=vn޼E_]y"͚un}G7+G Ioȑ#T\Cw{/lg"V=\k/x NK;>h͚gS[%Im릛~/ݥ p8TEFj}>e8i)+<,hi ҢUyr\m/b]rɅ?ka~]xwu u'ϵ b I*(qc9Z%%nv1꡺Z >}Zkj߾5~|2224eJ֭[\Sm:o%1@wijc-sY:i5ހҭE#1b51-;:Pׯt?OnРAImsa :4 ˭)ÈvlV뮺Jvء?.{:-3Bbvۯ;ѪMի /BQ몸xGb UǪCK ~ iϞlʕP)TFT Zj,rTѺe%6 UǯLglK D8xƛsCZ^xJJ`ZV=r͟z;4y$ 8պk?=R_u-~csݴiFօ*T %c=(--Mkbe] Ժڴigtu?hg"ֹ16lxK_ |UK^u:o8OC_߮@ oE% m1HIr?NӢEL;z}J요`z )ݲf ~A_\3%jHcgF>OYz5,ӟ ']{ڲJKKӝwު#G_MMrrr>r͙eIiZ҄ nq&͞}rX#&ؕ-5l뢋KW_~vLԙgP]Hw{ C:t,Kb#m:/psUZzPo駟;oŗk˃|iٶϧKb~ 6\A$HN'޺e*ojm[^B5,CnJg/t=w2w3kkOꗿEغo\Ckwtu7??#Lvvv0lw^V=|}ek$jŊۯ[o;n-ZtY޸qG#߯G}LKLTcG]s=[4u1c=*I.D#Gm:pT~?ឨT[[2yx~xeKҽޯcƎ;Myy">/v_ϯV.T ''>ӰTF˖jGKf.ÒKzt}S^^^rdLS3gonȑ:ttGkU裧h]. jcZ1 4Ha2@ o}CW_}x⩘ǸwofI֋/# ަe<1]OO:\-u\P0NK_~۵if}ўoW^Y &tsr^[K/رcڵsSad=п{|FCJj(2UK4+WD)O_]׀TM~k{~c-hbaˋwhĈᒤۋx5:x0<-$tI*)٧)S iӦ/"Sz{$[e{)-x蚔FoEi64j@5Hhӟ+db~}ө)S %Iw;ܹKMEKxd۶>3\^2mTy][tgRk}_;>OSYƌR^W;4n8 Z@tjˊ CetMJZק1i/a ѫtGe x*>kH***TVV&n[xu귿GnN}NӦM +V<{~T[[1cFkK7X~x7jhhرctUW\"Ґ!uijҫjwd r謳hذaa"& /QzzxbJKK5fz:y I>80[~t:;2iQ5|_YY:暫bntM_ct,t,͟@#F~w_FЧ=?̐efVsKMaS#Gߋ:ʝ/S P}>(]sfRAIv;1xgl[+wo_s{*ž:ׯNi7$\YYq;-h󩦦&o͛7jݺd4ReggpȲ`o9SO?OgyO5|BʄdM:Y06kR20vL/2V7FiZ&%UZX/$eg_ e8#ƈ1 ;-[J%ve{~S#)V2M5ę9Q0X/>vԭ蚄෕e!d KT'i4[C _-bLSi*So b|~9tRAUE $eZfz٥hjISX= ŤeUzG޻!NfcpXQ׹,#f$m78V4 IhxMГOu;;= "ơ!@j>[aje:2$TCk 0^ۯ[)!9r9|~^3sRR=]gM-iL1Nݼ]<͟ݲ{ۥt)էz -ˈtR`T^m䴢* ǘsZtjǿ3^ $G.ys<@r=Dj~4,OWLLg^gKJʭ,)Iv:4cpX~z1ORNIC<:O[>+בos\NMшQ bzkRW]:O?7״6(}ˌpY|ZV1C]54Oc8NRm'a@ĭX罒C3b7" }ފ'tܔdE<-#G߳οvGl'%zt\ ?`m6nD1:B߯>DRvHݳ_fiwU4j@<~[u6h4PFqڶjm֨ e>W߯4=/GۅV^%Z2245/G}"e QCr֪\im>vׅ-TZWK#334;PkP.C5p.o(|;Jxd;-DALG l_% zPɗ{=hf kUU#U8)?OGlZuZjWSV~\eZZmy, Ռ_VwT/^+:JvHNaSV~Fz\'σL}c 81p% &2x! &41պULh,+x70<G" "F2 ;$yDi _0&.G`LqvA îk@z:D{,YڥFLt~pa] `oH% u$pߞp%ѬG S$2:rJ|+**^#@ٱcf5uAHIf)?Ro;0FQ$Mt ð Cs~#dQ ƽ|{[ŤI.@o')_w÷'Hy}%:&ڨʁnrZн C^'cݯ+V01(+Zs@VS]XС*S Q kIDATTTt+RK{DǎWGuE܉fkDF^࣠`͒!a ]̙3Dޟ+vk[OYVf7R9.@d+ 2di 44?wfJDv-5z[TUE^薇//o2vyqork*D3cmN\Ԗ0!$ߐ!wݫMӴ d8PyqqO[bܓG랔H>h%!?ۻ}B+hfE]v ޼h[L:mClɕOvo\ Padt,9M>|Ojh$9N5RUvvvp׿~vb#Z{2x+lҥKaȑU\pnuCXݓb. :} J2(B0-U#jy#<#BkkrssòѶmd3Re >"Cdڵ[A_)1bjkڸq֮] *IJKKӹ瞭!ChÆ~+ <0YO3M3nߠ HzvܽiΜ#[c<Z$~{2T}w6,gXgDy,ai)g5?,3"ڷ[O3Np]!N:vk8RbBݒz|$&Xݓⵊ--c5PxhAB4-#C[Mݕ" x}={v9E)2i)]̈C[Ĵ|Z^G1Sfm MQ^G@'2D_ Ʊv1mAhGhAF23eynK-uC|ng4d7n1™Fۧb ]($s^γS9RbIRK #bYElXo@*J%I[ (nH6o"ƤTk)uZĴĺXj%:L~L5O x׈eBHEveb( &ƧITh##V1Rbk; 'u$HJi L"D;ۥMw]JR"݋e") h1^GkXST$uF] >,FCs;ڴB@_KXId}[:|(%[.7R.?ʷZ<*iR!0:yCɷIۓ@{uU+h+Ϋ yG @_Y݆.ggGRb]]3%c}LPvv  cINd?+,qcKdFu}6R/,0FvN |zuAE(ۑm 3^K{.%wKm @WHhbw|ggH ;݈p_tVK wtw ӑ4H$] `z[(`tpstf|ЛBA-jn:C:u@{ٝTI 5D0z`_F?[]9,0RhF?ޣ'`S\zD_ d}v8=eV}-d03Gޣ[Ptv. iv?._cS6M? ZDk0A @ϳ @@g'.6U@@е`B:PGt&8/:%A ! tBP-@)9WIENDB`resources-1.9.1/data/resources/screenshots/6.png000066400000000000000000002302141510634446000216770ustar00rootroot00000000000000PNG  IHDRb6%gAMA asRGB, cHRMz&u0`:pQ< pHYs   IDATxwxSeoNZhKeoʆ"K(:yEAA%* )CjY3ؑNҖs]rrrsNmgHdPEDDDDDD rBաHf( T_"""""""JL)XPd'2iPȠ:I fQ蠺 dPEDDDDDD$=A[DDDDDDD.1}2<[B#|Rfnr,*""""""Xsy.+O1ueK [DDDDDDA`͡ms<Šד˚MyFA  9Y70~GG1"""""vo0`21pppj oq- 7+ILZ-nҚ)̌SǘuIJmLB$ `lРB 3FG`X$)F#899]%y ^usd>S.9&!L/D&05lts(CLLZcQQQLFU}bZl+ԾTҞ 1]'3&aIb5Lj]q8qL7f2+GDQ#R(,+111LK.S>44rfFJ|oM#w0Snzr|$׮]/lٷl+K./ǷX,:u:…){>)28w<rʶ7|ER߻w/f̘NZ8F]tbomew-]*U;o駟`4&lZz*nݦdɒك5kVҶVg8::ri*T&0qLo`` ?^<ӏ*USlO&b SLi^zi$I^f4k4ॗFRz5",0V^ vMJ>kzAKZ9AZa?{ YfMP٩u\\>"""0NGÍYF#C_6^#5۷#Gs@}9~DDuLr7nBzꑤUF"EH`Ĉt֯߀$an<3f̢}N?ٳgg0uLhѢ5ja̘qҶ/IoߦI|Ν[$GBxfڶ}Gm@nOpv_~8ёӧ&iA$"dͭPx1/ʖ8\]]vݎb}o)$`n$rqqFDDAVP![8z O{^)R2ӧO`EYS~ZBB}rݻw`2غu#!!y≮,Z#G㏭˶ϔ) 9Δ)"0p/!!iܸ=L77RϱxyyѡC{ۺ=₽c -2^jSNW>xnŊL>_e P… ۂB\z*cǎ'448~i-ӧ`xxxz+W2~D^7;ƇJ_}jjѱc"""֭Yk׮1k֜0}m<== ̟ms8v-ڿ۷||]:iT?ڵk3|PB) L"E''/F#NNNM"E)10 z$C  \cȁ3-JLFWuKyt3h wQ'JG>tnnnܹ?c]?ۺ_~ē +õka.])S&[ <fܸL&ƍ iقܶ~[Д}.iш'VK@>ȂQܿݐbMp"+Wڂ-x;J/2w4_Wtt4wQ ,\9}4PƏ-u7K9v8nnntɓ$9J*&7V~7n2Z ֭HꊷwQ\\\2 Equubcb1T H r3۰>Ք(0&I3&hZiy "m>~L4M0q$_n6IVR.Qp b~Wа#e ~$nٲ_ٙ͛TR$8hrj Gf֬TZC^&uOka{iܸM6oVʉ' :D׮۶ҧϓ:t ӦMkUFǎ]sN_; |~w0.A߾}hݺqxx8&fׯ߰wr;fuO clf⯘:.\/{$WBkdr? ӦMeq"=˗ h4q'S{ZV <]'7۹83} gu4{} ~DDD._ˆen݊N:c2y9:G^ 4eE)ʴX,9s6://Olϝ;Aԯ_f͚rMs<d߀@| OPTTSt ʻOfOkAjaժՌ9}P+V|06mAʕ :Ddd$ŋcu)Spw0OO-ZHݺqH0Gbp5ըQv_p!cxyy&)/)Z(C fذhҤ1wΝH6CL̿x8SteL&xF?3S.s֭SFBtJڶmC:1b~3$sܱXDFFfvWB$qxb/HΘ?3i5Gʉ&I"""RԪU_~sU֬W^yzV+<2>|;*TMQl-*vk|8~jd]ҰÜ(HɔlCeSv߾)[rV>}zөSGbcc*DGp//_!88$=>>>,[m̘͛ oKm^|%c8;;ӤI$U^&Mk 6f͚lŅ&M$)cĈIn-JDjՈ`ݺ_xI*Tȶ_ࡇ$׼|Haܸfz_,"d 5~~ b'i )$(h۞=;YkڷLJyMD$.ѣx7l㳘L&֭k AAz*h%Jɉ aԨغTQӧl+<òeKyxxwjQۅIFMD= so~%JfOl]j׮mEi1-YÇϾ/|&uevf o̦k:1dbt7ȱR+ÀZ◮:u`ԩ*FDD={ȢE  Áĉ"OLL ̛Q...YiZ=#Kff_q &'C*ŐJlIZy }aAR#Y4ʐ!Ø7SN: fC_`dW("떔e˖a!XV&Ob?7y1^rӆ ֭[\xwb0h,\éYׯ_gEk̟?/`̛7]3d5JgB*3ph,cO>xC_Ԧ{ɶmӧǏϤзo&M۷i"uڵy[!9x0ٳa̘4o૯؎PF|Yby$~Mzkx:t#G `Cmt鷔,YV2dܹ#Rܹsm`Μ\f+/GG'N I8} ϟqFs>|$w0b0 Lxx8B5I}3U}8DDP...,^U㻕]s0MKv أ FDv0f̛̫7ʕ+'ZTR/:xFkxCN%9^賔fKf1ϟOo0| 899k9cFE^=fϞKʗ/O `ذ2vň͟?f͚2t^}uB722nzhO>[̟9nnTRuf͚/_!Cg߿%FT^ -[~wŅݟl<0I"Rծ]:ujsV^[oܱc'+WW勈Fcڗɗ/_aѶ0zWx1ֵ}b PPߨɉJ*O:իаaEvn]֭kݸq]>Δ)1b?l_bM}7nDfMSNw}w9*S4E1 DD:ضݻ˗g%)׷<6mϯ%zU+g^~y> ""PN}UYqDGGG$y9V/ 훧[ܯ FW}ٳOx{{`ٵkwaǎ]FtԁΝ;ĉIIB4t0^?wcFm33™sFJ>ŗ_.~Q9ܽ;ݻpwwߏ2ePH {_dzԩhٲ2h߾@풔q5k`41L4m$p-9~"E[ O8zVktwu`ghҤ1˗g ~f ___}@DDDDD$%853gN0#Gfќ={___fΧA#R\r</ΐ!裙|BZlAS64k/͛iӊիӡC{=jδsg| ?_@˖-h֬)+W~@ժUvzF#鞳lf/4iÇߏRJRHNCr~RNmV^ɓhܸnL>RJ3Oӧϓ@*].^ ̙pHIs֤jժq_;e̜ժUM{ηwoMck~*9.:: _O'Yd)Ga9rud2xw>ߚ_bԨiٲ:ʕ+|=z_`Ԩa׮̝_یI;vd  ^^^lٲ#G8q|w˹s'JDFFv̚5­[8pmm?;wYW0c,nܸw]ܹs ~eOr}zED&MӶm$,YʹsY&:l޼oAڹsGʕ+۷ٶw(h4ҢEsի+ٳC<`QQ9̦M1)ٳm8^J@NЩSG"""lω<(qssOfRv-g%mT^ZwI6nL6m> ï{wqqq.\@œ1EQ:}mӧO?Po߾ͱc'(Qx˩SXj5 >|AA[!Vիrv׮]cԨY{.]tW]jԨ+s玔,Yׯi""UDD..xIm%"""2k~{c??C.'""""wyxNZ 6AR "V+klٙ%Kz1v*Tԩ)fr劭eMsn:d/]ĝ;/*JDDs|伏=jPF  h4ҧOo2c,6nLϞqwwDD5̭[[n:L "PP*]DDD$? :DddҥKӭ[Wf)2f09t0ׯH򜫫 ozjtDS3f| [!&Lg[ N`pzjM#Gy'ضw\\\(S4Wl2DGGx3gRREx6""Udd$F!b26y!-e4صo߿|]~bŊQv 1۷jm~L7ػ_ƈquuU+v?kpwwΝŒk/^ `$T:u .LҥxlF.\wX.N4Xu+B+/1j""""W ԨQcǎ%iAb2ݷU+|JOΜ9.DF=J\rŒbH~Fz1ïdɒ8;;seȑ`jԨNR ֭\t C!"Vdd$111exߨ("""r;RNfyŌ1}>ֈJ˖i֬)-[q؉4kܸ+Wb͚1 888`4&y5N8SOL2RJڷoǎ;HzuS̾d+WW6a= "R f""wT9p3x1Ѻ䷄F;&æ$~~nܸw_ rfÃ8lz>iN{HhmHMSmݚzEDDDDDDDr\ FDDDDDDD$(%=t"""""""|EH.)AZɈ?OR\ FDDDDDDD$(% bDDDDDDDDr\ FDDDDDDD$(% bDDDDDDDDr\ FDDDDDDD$(% bDDDDDDDDr\ FDDDDDDD$(% bDDDDDDDDr\ FDDDDDDD$(% bDDDDDDDDr\*>?ĉ~W\eilڴY(""""""REL6JPǿ )d0fnl0^ 6l[7BDDDDDD$RsL&EF8p`O٠A}/NթX*YDDDDDD$Rsf5j޽l-bU.ضѹs'UH >0L8vi1֯%eatލٳgw._2d0ҥK aŊoٻwVG[')I,[{wqz7TDDDDDD$4kRW oaL˖qttPBL0q`PF|ȫNrJ|4lی*o6!!!1edFz{ܹ3w5e*UȇNlݺMoH:"ܹ3[n#**0k{ҦM[شi3qqq?~Y>g׹s'vEϞiy{qȑ6j0f͚pM.^ MuMr \\\Z GYpC`׮CoH(|||hԨ! .3InM֭tjڴ)۟V)S <4]t⫯CuXl :Xb4iҘzrJoHkR>֩SG] -h۶?X,m(k ӨQC^zi$7odٲ⋅I2e2jժr9Ə}w>L#StiX'/ZoH(ǖ,%K\tt4͚%Yw&Lx-2Ϟ~?֨EDDDDDD@AL6:ʖ-CP,{^(""""""Riloq?ܹ?EDDDDDD 8}(ϐruDOxlJϯuЍ7PSLb߾tڝࣶFرp`zQeH 0po= 0۹dD$zFIjg]XuEH.Q#"""""""KĈMOvo__|1*U*۞/Q83fLg߾ WI֭+7JP~͛C 9N@6>>>L>{w+߿)4вe f̘N\ 6PP!} uԡMLjQJӧOӡC{MBtt4?M0sG@Lr5k֠AIƊ%$Νi&|}v0;vԛ!""""f͚>}q&Kn]paw""g (ҥSٳm۶1h@:̓O>ba⅔(Qv^z˙3gxřiӦ5ӧOeWĈH FDDmKTZ#U~ʕ@Ϟݙ5#ʕ+G͚5prrZ[ fkѲe q} *{$Pb""""R))"""Z /d%Kp-/:uʓOAԩS&M3d`z͝;Y=Eaغ7.^ i4NrNo5G3<7MDDDD 4 +"Rpaxc*b0С=O> }о};zƁ0`Mҥ899ѴiZH"lٲ!C1kl,s={6mZ%j9j% `;v$,,GmMݺuH1""ҥ_SRE6o1>?y$_}ĶѣapuuDřٽ;___6mRxq5kX}-[/'..5'gR^]~uuf͚7LDDDD 4S6g6S[zc7_ #7#** I \ʦM)Z(Eqtt.bJƍ۷ 9ũS-O(] ^ BBNa6Ruhڴ 'O/9y2WRjUʕ+㫯жm""`DGG~z}V*իWa,YToŅ  `sYǚW_> Ƙh &yb >\JϯuЍ7)ïCŨ\27nܰGӿ?y-/:v|\$""""xxx'2I8DCANFBl vt"""٦U+N(6oނl]X|*HDDDDx bDD$۬\ h1, 'Ot2V^$""""<1""/_/"""""h""""""""DAH.Q#"""""""KĈ1""""""""DAH.Q#"""""""KĈ1""""""""DAH.Q#"""""""KĈ1""""""""AUxt8?O?UwV+k#0TbȌquu_ՇHn1paw\]] &[99 aN:EzPDqf̘ƩSR1NN阘Ξe{SLfϞ;r2rs~ҡC&M?ymڴZݻ?ɇNgР BL& ɤ+p5)%LQ 0i&M`{|E zSpao-[v: w91l 888uVw+l9BCC:umݸqټWyaСCX|m1cZ$'OSlHFomB_Μ9Kҥ儆^`ذmSwx̖-[ #,,.] ** C`X=.\>dҤ|gi/KUݑDDDD\]]}6 &Ņ5kp1nܸAzuT >̄ f*.] ۇ=ݣΞ=/ڵ06/_NO͚5 L9sZjo~j׮ŗ_.NluԦQd\[9s/XțoAǎطo?[lԩ<[X[v޽ؼy-iԨ!5uϾ111i/"a\\U""""y3w()y)F?[WRf ,;vRd &O~ŋ7X|%/8vY>-[3V+ok@j7Ѯ^O?<`-YMׂ a!̝;%KbZ;v}']WRdI:w;m]m+>}3gf0GҠA$<==PGM6I7U+;NrtA a4U&X=&Lb ...TZ,\CGknz#-[6I jM|jj*Ƀlc rjR[oL[aDtttWlfӦԪUիѮ][oIxx|a4.ر/͎;3,kҹs'nݺ;RG`ZmN>?Gɒ%9w>>j*"""羫իW1tA`z@`sʘ4 ˉkb'I-Hhm\ c^|%.77l aD>1`XZ-+HtU #F F^~y,3fLU+cwܥFDrljQbcc7n"#F k+k׮O?0""叅ъттID$c8]V\)+2DhXECh@FU%JxwG"|SVd&bbڏT!3bG RU5u%g.AL}TAi.rJTHK%"""xaSiAL&9ԥhMāR7dx=IRpD $G66Dt Nр Zewk#*&C`䖍)BA"1!"""*:B!% ΧhӺw#ft((R{BR h`CDDDDIs4Sa 0! bev~UVCMTŴ\%JWХ0$CcCDDDDIݗ _KG@D G:FALHc!r 1DDDD4}%–@kpD Qǫ|7b)CcCDDDDI(:"]!2ukQ#E!O61D5e""""Jw՝SgmhǙRc2J\a6Qǫx@B|ֈ `CDDDDI(:7+L^X/>*fӓ܏)LM  )Q| k~9( Qe h~9I!Mq2A Ա ]kHqDPS*j*J b܏T*Q! aCDDDD)ul. ,ji+rU1 Q"xȲ4 ,MbCDDDDI(:&WM$l f0L!%6br {ub̰ ]kHȕɯjhXQ05ӓ&dBL$.aMcaׯh_%[6"Tт"l z+&u(cC'Ҿ:(K ^ b()n@Mо+'ǧhFSQ15KX)ԇ6$x5LfOQpb|?*K.#C裿s[[֮ w?***f<c$xUQd!2t昂IGMG{|Jja:D KX8"&:\qe((>˱xi޲ew{ݳp 70 <ğrf}2$.jkRC`OQ1D}(Q†_d駷+0sq.Jg|7kk X ~OrpADDDb"!6Op݆\։!ǧjĄL lPPPX>Μyh};q]bv܅c~C4dee㿃%^ pb֬bX|~ ~c444ggyĉ%a֬Cx?V@qq1nG8ái{} n_f#M7SLFss3{n x/`k;_ɒSm_o_q}3fN;{FHDDA^%~&%mwj-{FY/1AMn1d/kSZc]A@QQjk:;S~zzxͷ'|;w_&LAB{#8w/^yU,Xp>\}8sj>|qTUU.7Mo~P(Z.ƍ 7,|C=M̟㧸 ;w~{/csp]w || .8>;DpC$""0#vI~xe:QS85(<%e} "\l16S crpWCeׯ]Ο TWW{~yݏ~tyMz!Xf-{XUVV'pm׸뮻;Gxx()(**/Auu{@r#kOp8bŻhllDcc#N; D"W_%K^K/w}/Ud XCnDDDz3!CDZƣ&VdM (pPadǫ@EȐ0(0@矋> *v܉n R[u(/߉˰fZxnӄ@Ì{>#rw; N>y>֬Y+;۶}wY^xV}իwVt1eeߞ}ӉKaF@MM-7>""AW4 ¦`%ɯ1!$6/aCK6  K`-hFĬX.~ò,7$({iJ}yW?Mg/_y;\=… :_CfB$AyNnpDDDCձuxS$x8~x&@{wv-d+fZz `HN ٺmm:>5k&S /1[1aL^֯sc.=wqqØ1Kɓ'nĉ%:u ;Q(,iӦ4> ? 8#0s{_q{9Xh!ov<_;U. r d!'FTLr :xT]攢.0!pjR,] W^y9zo X_߀+C,Y7D1 7wN裏q뭷ckq-&<3XŽQ+ ?}çW|#n7߄K.h|!~V^7p؈W_}{_zXZvۏP__{O= 72""!"K1⮚ YbM(>#b&~4bv>2, "|vI/:u=:nyǮoiiX*믿~ ާ?AӘ٩2sf4aY Sz|>W=!>:<+<8߃=Q+ 獭Ɓ>JˉclOީ{T⍪gn~3jqcIŘGSSWWA #wugq[._r;\gŹ6S2@4EGMƥc6)j *`CE}Ebsc<$x8"&-~UK> 2S(hs4Sa/ |!6,0!Jw!"}I#WWK6 K(ʯj}L7-1FtF65هAə^Dgd~j.)-si:Ȉƨ"''#%{}vI?%q4 "Wހ`Pe%eXӿ0$gGؐ4ҘOȔH3""""JWL s A=-1DȲ<& b(! I_:߬)ټfk%Xl Ҿb# &()zOȐ8ҏl QtD́?>F 1)QM#P5`y6׈ <2kd1DDDD!!"3ǩp:tSa^޲BD#xiɰW#0!""":B 2T:-:'^n@Sxl1!"""xe B1ZBҪ(fC#G2%[3KN ـA %ě0Z̧Doewq$Tф(XvwÆȕ b(!&%|\uRS5mӬ\šF~h69" Q]ZC2! -I~ gc2 95F(#dՍ" b bh@`!$PsB{\։IZbO&#[4%qd<^Ue?)dHg^""""P#Y'&~UCІ3&MgJ#W14~k>1DDDD4pơ#IJ!CI)m+4k X'FJ3C`CDDDD(1a1u UA͞ UPdyaԤ kd1DDDD4p@$WD6js .ɰX/j2gsD <~UCPEe"X= XI13ɶqP`B5C#ߡ!1&t(M bh@^EG$3aCO∘d6SPȩI4yR&ӓ bh@~UKh!]Jrm#hc1dHpH&\\šF#ge9 Mc6y8Y>YCذ1ӓh NL*8NFrA  ȫ&Ws!I($çjЬ\9F0V !3A  (W֓6Eʜ C,~P̕hZ)bs0d0!"""ItnbA$*OݖqN14rk/)164A K,8dQ3]I;4;ͺC#OB? SQrAMB%BKS*c2ţZ*KA  hб iG$Ίn{m!A,0§ht(} b_9 S$DM(X:""O275)jPh)e b_^5CCSutXqEQ:14BzJ#e0!"""~y=B@c'yT2n&8+'H9^iRF_#3d40!"""~yU*;+PZdcC#GuO!]+'QQH gCxU u5Ůsj6iDrda=܈!q%EfQ!ڨ¦b kSPyM]b% N9ڏ1DDDD/#l2"FB.8",U(vFQ-?˪ |tvrd U:̏5" b(u b_UG(1ـ/~EKiD5F9:1,\2 獯+PUQv|aHS5wqCBYCH; IDATOc2DLfg6VtDwt bAy0 1eHx[ bznZ݃ϛsgS4 D >̔jM0h@Xp=W!Ye$A9t13!MPxҳ0DDhrN1覀ԳA zZ 5b!df~:`/aU4^XhL1!7W3(&Tۧr,TE4~)VqU MK)!_)% bÛ>L Vg"f_}?KNi`fjXAOdq5Ņd.1tu b̓<5 pM71=7:9]a<<{Cxb 5S!<<{&)=(g ;kqAُ:t yNla&tԇ C2ÝTpn 3`U4bUf H+6QU;yk0ig:!"[6! ,#8gc2F NՈR\(tS-n, j񫃷`k o!j"ޮ×n-d|Y54xpA0wۏt5uS( M0R=t܃lِf_-7. y'HSለEuҖ:4zݢ:88<9pdM"revXU51)"bU.P/݃:B!iqfW)p[qjQ=^/[zסږwƷ q(t?e ǍjKG& KVj"*,΀ _+%+i1CݡR曽iXVfאD]VkD4rڶpt *E4qZa}NP@eWT&DXy9K:ard38̴ƘTov6$l f:۞s^~>d#4 .@T6MkPvwl©qjX9b}RZ5Ǟ|޵ lI\ Wm?jߖڧ]3l%Kv=AApÍTpQ3o] 2 iYS`0|15*cfQb? paV5c!L VbNտYe1MVh)Me0!dHK)W16A[٫UQsd.$jb>kIkLٍŵxahD( `.۰|ђa'W|x {evaB?.EEoT}ɯj냷)"G6Pǒ=l&7@XTP ǵIf@^Ӛ9ع3tLI2*?L eªX x10]&6=I/|M'{_{2*ȳ%0v,%?Q>oֿ??W5SĚ\\S³Ʌ:B6 "*GS5[®DRFWN%gضySLAU؁F79A ȑ {t!LW1/ d⏇nԟ)dq_Ru $,K㈘vN{R(߾ n̚u}l3·8z6 JI@J6̚+u qLHcBj,s{!Aн 0)IV0*>$߶Z* ΁ gPFӟDwþ|-2*Mܣ!BP}AXr<` K?#+Ph럄g-QO3<dBG]lhs\OGZi ұ"k)Ɗ6(z;4dAWTbmS.Aᓪ/ZrpθcO>L$U sXYÎ`z K^ 9!By(kd,e;_aO1rECuD  b3JG0d[5!|-06u_M0[PR dhRHEv/f[M/v{  u |e6@gaٝSz=K>흞$8V&k a:׸ Bk%߆7 G`FZnoCBY:Ŋ`6tomX5sհ\US'P c{P kY)ocDDi_ߴ|5vcܤ;p#&$Pu[G4٩ FS0ۗ{0.;UaUabA/Γ`e;]!gʏrbuC.:hntPģ^:lHs1Z~ `6lzՇ+34mDB8ye}v@ @p2X a|{>7!䗶Jm0U×iܼ2aw 7Z/mod p6"kohbz!指fVCa|]@N*ai?3gֵ]Dvg6lرEMƔB־=5kJU17"G!gw~mIy;,l%1v qTHOvAT@D]o8F*ѼϰC}hr@505}VpβLX5CVrvW_X<{݌4'I17X^Q*BUDWWRUQ1S=<5k؍KD<4d<& Y V ip('nDe؉V-54zpj'?n'x w|MM ?WZ]IMi*Ө]!g ,\1 4QImvid; ac"}{V7.P*[9p;>mv&+fǞ|\6 ",%ṃ8߂I0T <B!#bhBDϛsQ㚉qلOu1t1i"DcGDwjŇI jqʒ*jsI{&qB)<8ePqQtlaDLȔ1 7Oى ^14#+4 c]WNJ$ٟ覀/[X4n>7MمVMW L_Z4qeI%vGXU''X`Ƒ|+c"B]DAȐՅ!Mjǧ, d0D;ZB6QL~(uz}Ls3 ۧUV_\8!|^f~G*FUn܎?/pٰK! TDlv;˶ãxjts9͚qٽtō W"4kGZX9\9z#TGD (fpFaL<%s;E an~ Z N|[5y0̡_ $t0P B(!Jiz@7PEKP`cA! c2@Dy>M=1 6pf>zE Gqx^kB}˸pܛslhs\O8d#4vhl N-VpX` 6ₘю(>x*BN|r[t~E,X-aD0hv:,!-븳t;Vzٗ5D4DmEd>2; Z:z>Qv d!ڻ δT> lf@,v }f$sVXF71`GșPD`l-jqH=2-6xaq D7YK*%mmMzA;f!Cw ۰ō$eh herDF|M15'n|6!'ۿ9lHC(Y b)¹1hᨼf^X aljsʂ^2I~ѓr:o³;Ǥ\\)`ewn JW &b?5ʉXY]<~ć075ȕuʊaieg&?ò ' 0 z~¿}7 ˁnmPֈ=s]3OprtZ@B|lfRHiW+X2joŮsXGloVTHz0$QX73٫*@qVq-^5&饗igbCDDq 9[W5|ƆV66g$ ^ECC_0ߒDt d\a]Є5shq`[[66pF-iܼ7CwDWW<,YEx6oXǍQT1Qtm\ j{0 9A^c#;ǜ7C32VOcLanL` ;I A).wNr]ϯ;~,,>oޱ[ZZ(#;g6Me ⡧1(pP䌢)`c ;N[U y /~U%&#d2!H|U(g{m|UC#=Pr!X( v[E<*rsE:WrɵG:>s]TE#W+G sI_e{mM2 ‡ ݏ.TۏXڶm `Ql dCȝxntFeet܎.YqCDCDDǞ|Uh! czncz,}-lG4k흤}egG9cNHKG-hF=tm,lhK~(v=]!'6v.o/G[m"hADj/1ENGqD w8"1DDDDd?#bX♈h0!"""""""$ b """""""A h0!"""""""$ b """""""A h0!"""""""$ b """""""A h0!"""""""$2kDQS>55}>K.;wN''ֶ*:h֮ zh_E$qB>^ADDDD.!">=3x'۱`y>555سӦ&UUq!tֆ_o_~%6o9 D'|s&M:gu&:L\w5G5>>^{ D3矄;PRRK/_3<}vvv6 b b;P\}UX:p$ nޕp]ȲOzɘ={vsx<,^|-$IBii)&M: s|8ӺW^1H(! b(a[lرc;;v,>t5?뛚y_I0qDl޼^'tzk9?WմiӰmרoi=zTmeee:u*}yOAQ|[G!ǟ@0?nϹiL2)S&cm0 xϱmV7>wԨeϞjnDDDD1DDP(UU:GԠ*}7ov? hkkôiSaFTWk֬sTLYY)lٲ9˰zA^5kwrL͛7'QSS &&O-[r """X/%,;;h it]7o+Ŕ)i&A@Y7$IBkkkèQ8+W4Mnt_u>a&mۆ)S&cp{weBmuVL< _5&M7|%A %lڴiH辁@M?~JJ&W ֭>GYY)֮ +W~y矇 cǎrAx^ֶ$2TUE(7oނs$IزekUٺu̙<ȲDDDDD$""̙#G}6mڌc=5m޼ӦMCaa!`ܸ8E  6mj紤7o,ڻaF̝;.̙4MDnn.AUVV"7746ş90q1GsZ%#bl*na1N;T'z2<iZүC#G[[[;)M6㪫DDIXUU{GCCCߺu=X|'555CNNZZZ+;;u;a-[ਣ@UUlذ.W6.(m۾kh~).B ܹX[aĒ>G|Ph֭8rJn$DDDDaOr.긽RrƼp嗦' |C裿~I:L?Ú5kЈ E9i,+PSX8't"z6 |}B5k&z ~i)1ֆ  b-:;H""JMVVf͚ """F:yyg^x_~)wj`<+/bYݞc%O??_~i KO>Eaa!nюXn5f͚ɍEQp啗CUՄw""""bŻXn/Z|W뮻\r1n,Xp.]Gqx}JJ&㤓Nq~{5V IDAT;=xŗ`9뮻qw{ .8>;D`e85jT}N>$TVVCDÎix?^Ohl""""'^z?$\.i^{9N\v%;jՇs=^;.\y?˲h WƍrJlڴh>G\}UXE˨ĪU%\]Z![`&j1I9x|Sh f?zSO>$ VuLDVV>+:,8EEEvW4Οc(`Jn^kݺt:1qbIu=W?KSh_%e2?~zmTWW|̚5ãuJ]]]گ˯`Ѣ/a³+Z_kX}*gweYVܟ{^Ӳe~pƏN:k~*nPDDDDDDac7X+ O=Dҏ]tYگkK_3<3f[o}w"W~֬ړkoܸ 2 +V9g!|gkp'a\OdG#|#1ojjŠg?)V5 3/~7[(**iG}G57~q`Ѣ(**·u~E8K.E]cpc""""""b1<~܃>/wȲ_{ϿnrW_Ku?z8眅xӟށ{>iwp8|;Bܘh$ \z庞_wqYqY}޼c׷fQׯ_gSf(Ȟyi&,BAA~Z3gΑΟ"bEn;䒋7ⷿ}6my~; I2~y~SB!woшQWWA #w|ugq[._r;\gŹXvݬ V3mT,Xp&jkխ!#2SN7a̘n?q]w۶m…gϿ0no?/gO5ox0 sٳpщhD$R_!wUhp~LX .￿m kc=AyN7|.hDEEEظq*++avߎH$F'"""#bhH!z,^|C'NQF7v[o>>ؽVie?{cݺulp""""1Q/N7n,(]}{g㣨?} *QE okUDųjV֪?JZh녷r( }'l#$&$96z>yd3;3fUWrG}2d9]|1Cg!4IZZ*x^YY)q 97oޗªaK0YsϽ I1&FJII<;;K av뭷h)Z;DzOhXbMzjeee*77kСGCG1cFk:s4x`q4.v{ MjfLe˖ՌCr)&W%=Zt u'[SNь3.33S?5Cz?,uߪOޚ9s AL3d*]a`[ɖ%۰TaL{| @Oz! lA @+!h%1 VBJbZ A @+!h%6MM4Db`7ֱc nP Mh%1 VBJbZ A @+!h%1 Vb0 _2hhmu^h4@rSp2]< ےnz > m(N(riXdMFhT1X!$6}F4v5b J7=BHN\\cJ7=; Pm G$a2$: Haӗ?bO, BH&nHyN8gB;GF '全p΄ PST@ȴ\E=KQR=bΙI,qU[x84s1@˲\U"M 0y3:O#k 1(Yb8 J }SêP+9p؎,+x`̵ѡF w1ho{aT4(P6T*O҂6j LhϐF ڨk-ۑi*|K(-)fuFؓmOV'eԨлrJv`>ۭ,Դ`UխڕqvdY~UEV^(i4 S1@3+W*hhBWV$m@9vB^U( 5I,JrK2R'@F$LUeP#ܳ%ОI,TUG\G]5 ۮ*16C#T y!jhRm4S1@ʴn1IPĵW W1@ʲ\U b$̷N W1@ʴܚE\[A W1@ʲ]ł=b<hb$iyFeVW&@E$l;V=b"!hb$m%TU̚A &S eZ. A 5IJ\[ Ov HRV1T̜A J=UO][9 %f)aFY!?3ZLhb&@hiVyP#%f(W <hLUކg4A)U>2*,[, 0zʓO{ЈF JRԷj >[ yUYvBFB J]GRi,hG$iqm3<  eۮ*DK̜A 62V0A 71@ƬIRФΡJ  U͚DI(}ztp2XЎIP4S,htݓJR!L)c땺63'@;C$,;6%UxBԉ H2U3&mT=YLhWb$S5cҎЮI&rYZĵ9DhOb$eФ2VG1ОI&IP ߒmJ3=  dۮ*w`$I*M8cx1@2;vl@A$&),uN 1@ɰ\Uz;v^YLa A T'R, C}HgZ? Mv H"Yև&e F@@;@$LUE?0T`+ dZ*ԉ H"xk+! H"YVB&1QRA 1@v&1VW&@@ӌ>d C4vJP z s f .8O?m4vJkb̚M4+ZO>.<]py;MQQx-o*߹?pXW\q8tuY7n+b׿>cHDgߟj*IїꬳFs.8G_s9[guo6@ ɰ\U6GL<0P*qɌOf糛Mǎ5z}_˸{D]vO<%KO>暫tC4vJ$5[$u萫ѣ/SO=QSyy9o"@˴]UM︾9(?SS|Hf|Jz2@S1 b.b[w6n,$}]/.Gzꩧk֏DjzZJwyLO<^'І,#P\#FTӐĨ ͛w*4gԄ0֭[ u}qXreUaۖ:3s$=zĴByfpƤw^5緻0ԭ[7f,aE\KHv1XFF$tOOO5׌mۚ *77W{ ѣ4i_@ƍyoաC]zԡC_Ol+SSWWRiLHR1-Ս Oܩq]W\sƌ\]#uUHDӧEHVj>n]v%jLӦ}{W֭h!YℳGK!z@2#ic6l믿{|cow7x}=x=x Vm%.KzPAL 0`}-uҹ׭[Ϡ jJo&:*$F_ѡ<֭ӯ[ 52LOP#f(va4&$)z43"M:/رs#cA &;\_gӨ$ UԵ~6CVN@"@PEѠb$iTZA,)Qܷb$e5Cx`*+\I@Xo 4h$T!^*4I !ZUT =b-)K08[~WH^*5&7~ԉDӌ ;+N(XͲXX}S b 4#z*GfQ*b 0$ dZ3k$Tkr A 2lW~%BFɆ H jmԟtb6fBf 7hXX=S2Db6ezVF&TԳW$B-ALs+O*ub m,gLmR?@R!X*7yA,1Lb6e' |(va42$ eٮ-#&NN $ eY Ux-sj1R4H1@˶\E1R @ XXxX=S2b6BWKR7ll/LGd2v=@GdL&V*H !ZU6{9vB7TeK;Ԓ6SΡJQC7i(l:7KE$K (I hC2&7~ieSFKmEd)v7LP!})OSK:(HXF26ЊX>ؔͮ#IRW5}Z2b6e'B)Ojy]~}f,Gu4/-}^*}StlnQeSmJ8ue'OjPkb8^203NSw>庳"UEo3+Ўm(ro!&ܐic(е{-׺xVT%m{/fkR ݛbR_e54u47y[fq}^2 `"]a]C27hS"h;1@ʴ]UzV7פMyIK:hD_;I tV)OʼngʲڷV/tS5;LmeIu`z~7znCM+/b6ayRQ*rU5~)`._!ZY(rjʴޜU::ܬ76vޥ)[K75\w-_/ :/ڤqw2u4'/epS[H_eiM,EaԺ\ɊN@=^ Y 56=I44ɗxX ݗܳzAvL_iTS)tQqGURϞ.啩mzF׳@Wt]}RfTKfW'Bz{cgY^/eiZY.gWʴ\Q"I,[/9/]@@qS ~!M tzqfhiEzHJ|S%rxmMi2}ݸReZ&%,P >/њp,c'1ֲhLf gR,OvBN\YD`ctW萌y?Z IDAT ڬJLaHvYu.AŦs:jR͊A&# LE--r[IQ<~euut⺶2Y.2wϸL֔z}gŐjb)52up48XmάI(؁זc%J(׊+N(ǩVڪFB_1 ,#YC26 -.'߷i逌N-T`Hsr4'o3*-5xΡJQC7ihZ)5yt1zP76 c%e٭]$S|:*{.JߖgjZIG{Pt{6yjM !CupfB|SQRQ,]o)!uub P\'DXK+ҕn?-b/) OyRvK$=\u^\+o*N ܬs WBKzSe78t@}K1 -%v[Po jVߴ2[>Q}.E35jJi%iA4C 0R{P8Q;z^-ʝWpTp4,K)) Y~YR%Cam=1FE<[7/L1^g=ӷzkc];jJcs44Y 袮*}K;ZK}oei0%1mQiZnJeYLz@XK,}=/J=[Y *o4z:Õj2X`&}f$?$i* qy l!!`71isЀ%^Φ|-BIH ?`O".6q-jaii$LʤW ڭ-GWXDhWI mWAq@si=Ğ0d>xTS!M7L  |jV C盶0-M~LvVאti+0;w5 `Zʪo ViLK> >r, ueS$4F$qipˌIs}_r S[!azTeli*lH a93i;'J C?0 h²';MEk824t4l!riS|-}$$ S_26! aʖaK9a1PWII 00qKH乚x (׾n^[uo[^ dmў1,[/OHZzs].;f'C#M[S=O}_ơ EÐ*Uճ j!I S_~k_k`20ud;([7LWR3%˜<aZ%ٞ@Bm#{`H:4uiTo쐾}EhvxR0tiU7:AL80UEM=C⹺ "Ӯ$![˜S~4S &yktva C&^IY^iZ+|W5c4M1̚)IN=lh-C&rBW@Z)0%{`4qn7lƖ[ݮիWbX7fNlsi)S]J($Cǚ>Pri)6;THڨ@Z)ء9 SCZTA*4b*[!yAŪ_ǗI|CZbc퐂@rv;Pu[fC' |%f:ɴnϴtiihDQ<UՓeu-[% T )!iikij6x+noTQee,kΙg[KOO/@F2 COʔ_-KAߵ{jvmR~pٺ5w}[X{ZU`PH%}bzWBj{<,i6j䚦RfEV\f9zPWayF/W!O^muiiaFǵAI[f%Tdt6|OkjˊJWOԁ>K_o~|z?iE>=WNTՙwXE暫"IJ$\_^S|f} .8_ӧOʕ׽^6lTYY ѴiMg2d^|e1-`@cv^֮ A#ye9Z@4gLulF7iDa$n9}jS;d`!>MI~0-a%gښ6Xց2'Uq .0tSp@GbU@aCZ7<*ȬvZ+_gahY&LU͓4tekNiSƏ6m*8:C5bǷckȑl2edO̙xs.44-s0, 4+AR,^BY6m='or^OZ+m-Յkom CUt\`ʐO)Ø;-Gfqmo^4*SY!WB3_ Ѻ v)kґFB7QW´DB>[C V8V,S޽u1Ôkj)*-_ut) k͚5zI֯_? zRSS_5;vPii-Z$I*.ެwyWc=FDB]tQVVˣ4i7KrrrtI'(//_%OjjI8:>{+kΜ9yp8O>I={PYYK$Xa !%A·uL2zՖA j 窧ajbS!IV!JuXR}:ƴt H7L껭:4a{a+S!?mRn^Av*/*)''Gr&N|CׯנA5rz畟_t'hРOձcGx zUPP#8\;7xoP(֐! DTZZZH^xQ:4rLYg9s{Yݻw׈g?yF:c%IO~<O! ШQgIk}5AET\\,IZ` vlQ,U=nV^UVW^Zp'xR몬Ls>Wh}O<)D_h1ͨp 5c[v&HJ*m?5&N|]ś4p@uQk֬$edd蠃~߿f}˲x<N8^]tV$zBJKK Nj~KK}>}OqJMMѴiI":G"qBҥƎ[nRRR8F>4v:f8i WϞ=e۶:t#\3Jw_uMa#W<WAA֮]+qtoyY󕓓#p"{1m[PHÇ<-YDs,p#e44A2g\]qܹ6lؠߟN:A*)}}lrI걊D"Zt >駟&۶_ku >ފ+5m4qRee/^O?Z_i#ԥKmT_S^{mN8 v*++5g\m\5St骫 _,Y*I):ucURRٳ@0`vn^fZW?W߶mo裏cse$j*aIzZdr=;g}_A(/n=EQ͚9P),(0(dggkY$[.HԺZ?RUkYo7يz#9/S$P.M`C\I4 .54c5 VBJbZ A @+!4SO /xzFCh֬lS{v>r4vU v￿f͚zt4kteffJ~_~ڵf͚z맧'nT(-ܬo$=̳z7]sZbE㠃>%KֻG5̓>>LnUw3{u0qizi[tYtT{wx=zhܸg}JT'[رD"Q2.޺/|y䮻hw޹:t*+c>H<{=ȣ1c9}]*+jʔ) #Gyu3{TgyffN<E"ziժՒUV~us!Cgh~7wOw-?$iʕW/ӧF8]>h~ qʪ[nӟOT͚5]6\HW^~wee5x rO4a *,,n]y裏tmwg###CV/ 7oOnqwg5Qzwn4v5^.{[|2E#ٳ'@4oN>$yٶ!COwAۘKwy>z`]q}T-^]:u*++tI'Y>jYzWzÆ S~}<6{ul3$qtegU<^5ԩO>}_)))_g_x+k.5:vc9Zv9眣ku衇nԹ^Kw @h3K/kܸ} ^ԩӶ]vv~ 9ŋi4 95fUܟ{8u}(ےj~Co To_>{=2MSpXsՓOֽs_C?I >O?M#GOz{>-kp$ xۯ?C%%%_>k7;-ʃ:4{{Zd?P3իVXnݺ 6H~jzp$ j>P6ꩧrMzVlwW\q>lv61 9_~fYVV<ӃA<yQ 2Xo>b ͛7Ogu{3E7<&N|9 ^'|n…5aC9)V 8,˔d(@ yb @=R9Bk-^XnFm\'|"~Kխ[7 ~'5z*.\zYZ`v˫NWQ>lr}(M<&uK^)''W]w~I]|FL{_\P=4if\I)??_zR(h9zulhiŊu^[<ח_ί5kknWTT(*5GAߩuU+VГOKwuN=͞=GSLѲe˛K4|p]u*++Y~u]գGw|IkeY=R=܄: ? /h#I/nF= @FE" Sw3uҝw~?l'~H<3^3fдiiΜ|@6m+##]16cȲ,Y%qu]B!]}XqS%I .RAAƍ&Lx^ kٲZlN^xN#GY[n:Stu7ٰa>lF:KS:tͷ4~bܢ_M'px-#8\/b6śukР8pƎJ_⪚=s_jun7 ֮mQm IDAT^{m<ɓ5tQ:tc裏chSuu[ŋ,UW]g^Ә1k9?v/++K,߸ϮҨQgns~~4lPqwmtzWZ  sQ׮]nsЈgiУt衇w͛;y@FF.@rssa$8U[mEKP(F**m[))) tx i6T{^m>ZҌ4c4{=޽f̘VtN0iG^.]L6?8 uܼ[:Q:眳{PjŒT^6tCewG] :ԭ[7>M#fmegg!H@2iA2#wiܸiŊѣnF}T)%%E=}D-YTIO4jԙٳy1:u-59}ɧ#溹9ڵ!#F] W2dfΜUG矧N_>_AG9D:TgGL>CWok=cJ$^zYnVKrG7pzϿH)))zG /_|e5ظH{: -]T[ 9hq*{ܷ| M2E_umFK.X_|֭їiuzl}I '|= zꩧt=w4M-ZH'p.z;5W:=Sk%w C`066'\ZЌc |J K5r & d69?Zewhxg_{KKK!@ii .c[nFkkﷰmv*cB 0DY hhhdS- \rjcǎx睿' z<&Q\X!Z,\x=RJ^_| lJe˖H)׿;Z[[g᪫Id@|ḷ>@ ;PYY?j˯ 7\Gc ``@멭E]?Gb1\.xAKK \y83aY1|x1e^x;īI0ɞ{34̙sZҼ?uuuhjJalٲ6|34uqq1~p7&q'K/n?Ͽו?~<***q?>LM6c͚X~}}x+_*xOn_{iO˯쒍FDDDL'xqaZnwzmt#\b //GQhll춀o}}LstǙPJ!.҉;)N;#1ZHcF~jNqGDDZ! xWUVv ;V^|tuORV5b:h7;Kfz눽6MO?$.R;%%%71c:/^㎈3b:(,,<*Q`F 3bݔ){aѢK>{# /ģ>pDDD]3z3bX#]gDO?W_ˆ """.& ;KDDDDD> e1DDDDDDDD@ QXoMZMׯPJ᫯*pw>gb_#!ph4`FLM4p'q0l+--O?ec O?lYuX 睷 1`q1G!`ڏrK(|())Iz_?(N;y?BD.[zxCG~~9C+}׉VUUox^|G?gGeee<+>?~N9xku{y ш@L*%%%CUUu 1i$\|' 14Mw1喟O>y=xp{'kʔ0wxX_K.=܉7tv>ƍ0{,qaxzvO,WQQK[j\}z]Quu;DDDDD#1i+*) כ뮻J.󤔸첫W_%)`&]ʕ%ax# ˲z<¶J)矇'^znۋ(FhbiTax & {_2y?qQG&K){ * 6$u:ڵwy{h͚{ x~8q{o-[Јw=1lJJ¸첫%+V|#Ǜo1c:~[k /ƃ>ssKDDDDDDi4DF̦Mxao1\Ż7uM8W^y}1466u M4g{Ƕm  %~m \&75\!83i@ggy*`۶q'LDDDDDD)@L}X&U1^yϟ}9 ~ù W,Y_sinnFnnNҴ~ߌtu7Onݚ(֫i:Ok +]sssM !Β%Kq5Walrۿw}/3}>}r7ust]G0iBEDDDDDDb(1Yz >~ߏ_?P]w}o/0m~xnv-1sJ3Θ3@LyyrssaÆ~/c6wqQGbժOX,VZeپ'"""""" ֈILԈ暫pq&M}ضm{u(G7|fČӶmۆJLPY544 wB `͚:ezmz!w@SSsR>cǎAMMmGnn.QZ0#&͎9DKS ^z _l̙3_Zk^{nͨKz~E|*C9'so1cueepKzLyyy3ib„ 8SP^^knnzE}%)nŎXCSk};/1ОTxᅗ‚#c˖-wgˎ7n<4W2_b8`9p]}9n|Qr 㩧 >zS]]?uUwŲe+pwnPm[oc[o'MÕ_s¢Eǻ,KDDDDDDi#a}iu>zF8ݍ o:83bxU(pH4555]74Gw}p ш6z+aժpNUs0nu~ݓկ`FL}U{͛7ለFM;7oWW6oތ;7 GDDDDDD4 0#&>s,\ ADDDDDDD]0#(C!"""""""vM"">P0!$#DDDC(:qJ`+ nц""OɆ ""6;e5!1!t6( 1nPiInOUM;n M-{pgF3sPcPlFQSp&t ADDDY/G8!#$4(*N l6P5blL aAm ;?v m9XߒC5l)$L#&`.0DDD?hB14(B~7mo"öFEHs?NQ#i;3rPDDDD@#Rs:Њbw.BØmz,ȰSLLj1m~gx>#"""^zPh0 u!݆[Y71ùh` ^T.#EzBf` pЇ7J"Y1Q̍f,#ȮH@DDD4ץAѦfxШr1^bzXg0CDDDD%$XJG2X瑆1 b8Ph=(2y".8&kǮ,`/e\f#3[;" { #b(+t CkÓxwB K&bbJG` 2+G؈i:3bhX1CYɧ1pccڰU|P`G71]LjDDDDD6XgĴ)E91|z|D[iV#dhrL{x"F[%bl!Ġe_I~@ eTRsx^hqM`o!~RGɮ\DDDD8HE( a Ow( 1!dfKnڙqt( CDDDD~lH~@" ֈa@ e%paC- M2a2Ԯ1Q̂ͅjP얨˂DDDD9!a';kU 4vM@ e獾&YRG@\EHw֩Mkub:evQWG`F eFNkSK0!a c O׈2%ۉ۵GNp`1ґÌ"""" ]#@Ƈy PV읇j4XnFWIۨY 3b(SצZ #@'0` W|S֒:F va#0k$t1DDDD ^]2b 14,վvbZɌeĤv!Q( R.Z"DÀJ>݅3+%43X7װauq < lŒ:r87e@@8hva4PČ PV 7qoK-zsV@Ȱ ŝ \}q(K[@ e1}P04ggz-5̎duZ] ZGj152p9y >L Ӳ (x#e,! nFjvM{R^%"""LJ &B )ݤAV@1GN^2b᫉(3څB c Osaw8t-# v34Pȑm;3bnf+Ҝ.e:j Y'2:>EC $&3wc ~71!wg uz)>݅DDDDf^&@Q$(ג -#QZ<$!DavM4Rˆ"""" 2j*aY P.@@LnM4ɌPh1%i,KDDDDԜ^3bZ1q P Ρ &]]D2D{.(Ik.,WKj՝l]""""צzψ)52:^Mm!RKH{,B6Q^$=].2CDDDD%nz-Ä)$2:>݁_RGL}P9Qhu xFwD=h׈ DDDDDԠzɝW"@vb(5nC7*u3P'&G%ۣ5Q8ʻ'6tu!""" h|_D(b$ b(4Lj[RG0_CkڈcxmXSK<#](}} ]. 1Q P NRLdĄ рQ>rR_2CDDDD2 q$ b( b2P5W{)zߜ̭˺}2*O&.pU!fDaݓ M;y$Pmucn4;F{+vfˎB./Q64"' XmS: 2i98"%cgum:9iv^ 31:^`]K>үϹ_N}Svk,vf(ҟU IDAT+GQED4(xo^\F@ >[B$NY)1!a#ڏ@L4PI-~o{s4=M(0{Bc7un1/2mݜ4eG'DD.GyBD#K@8Ao4Pke14hcmРB2# G N]-Ka:bRVWGq/"[C޶#6pX5ld5W~= ԍK8￷S@saZӝԑ3CD!(9zW 4vM` mP>bP}Tn04 #(kR{^wy)rpd.ӿh]{@Tߚ8:YD໧tX\yc7%+&gk.TD4K?c)&$L!xv РM˩1l\NΊ/פt>B<+&ݓBӯ.7@QAEz _a/4}/5B&?^y,4/4!"zzL'&Gs=tuDDq$ M@OoԌ|ҒSJ*&u1\]ۢ~,kl>݅ѝ{:Mܰ{vG@AQ6cj0^ R-GmÓU-(1.Smu_=+fecр ȭCj}$GrWl!ȮIDDY+\xvg"twv@׮ Hi@ J{}Gc`K4l>[&ZT7>1+r5t@O&qLq5V4}w PЄ5埠%>9lűExz281[!#-svjU;K0fzL7'~iTEhqN)]EHa[XDDzM*7X QhD viS:3b(#AiѺ|Da#hxpbGATjWm!έ`icW*4& 4x‘Pe93jI_O$nDHs-ǟ4J{=W|~FbBD(f^"Arf9V@ e1#p@n W'tnLd+L0#&5:6GspLQ5^^63bbJCPK} }Oq \0~dž\VSxn֥|DE[8JY?ݩ(4Njh(,Mc66!VyL4ƣc &-:Cffa؍-HVדacр̼:Bb]K>u(ݼa:M-u-ynq$jh&4N/Rf,npFcm'[iX٩mxpP~--mjJҰ YPySPU[/-FDD#KX @ژK}ż&L5oHyP&}~9ϩKzm#hCA l6WOpx"nuu,o(r5'm*JCSQҠhQ<͆ɛ"pBW Ĥ@H8hV&҆wA)T™Č:[C*h IHJ>%潻dg4o'R bV^BкUDCX\=el_i.s[w1ZTzۓcC0. xND 5 mRO^;G>6 + !::EfJbR,&5,kcYC8-a{% v^!ۼ,i(Q*v嗁viaBSBMDXg _@85.@fabCRڰ@ XE^D9F݁7hQ؈V рm0;EDD#@ Ĵ*a)IDQ?Q4w, y!lXm uHi@L+DQ?j"2bZT%p ܭn2Pk1ضF wɱ !DH&p b2?Jb:~,>!wRYhBס]#'{ f/>^ ?J#b:bmeێ!h8hRv9Fz"@'Q1IKK,J4ҩU""%zn7{h KV7 1V t8` Ha "REuԢLrk"fA8AMx Ii@L7bMhw]WfYv͈i" hnR1z1IoaCRl9Fx<x^ ]6Q(m۰,"@DPCnC}D4,(SA_ ijEP؈tG4T !cAP"""v%iBvpJBE~6e\@8J}H&:D#O|6*UQkQ4˞7K#'Ѱ j6j跹rCPz0CDDDD֣vKjaDD$$VE:1 QhQi&J!ab)ͭm0Gӥc -܏IavM"aR5Qc E@P-#F(-)2e^Ps4bRG eDi@ Ka+כy#lXJOɺ%1 Q(8r a(#^z1Iz Q("}ip$"!-5&bRJ1CDDDDRGڟ@b G@s`ֹ^LҙC@ K|꾻&5K%DD DST#2ub(!"""~)-43#Xg*?u#\xBB,K)@ +\6w M 4hQh1,P)\g@8ы""""SE4u4JŬCD8[/XRO:V8JbOaB4i"̑F1Q`AP)]wH8ݓ(!""">ŇV{izll~LԧtAAL);e:1: QJ6D2b1z@G ώ;ٰUoq]/&)>C1i 1g޻b|xpw3  i_#mXze :uiœO>%KoWq=! SOO? O?˺|M7"''7ymJDDU7Pm_:6Ky HD8Un qN*ߣcS5^L##iI<r0࣏Vo{} 508`N8xp \u8ٸƛAZ#躎iÇx,TVnANNfΜw;`֬hnn@?ضn7e{ .x!. ,],1߆n.ҦDDD٤P&T$JGfN؈DXc$~qmpPi҃|+掤!cפzp!] _† ؄&lذ/,XE.Cmm> <V]1f͚6{,,^-[>kLXa"7^ʼn'0yܸqXz%JKK)'ceIAv>x0xYˊ jK.K ̚5K.ҥKqA&xn!>{'u:ۺu+8.w̛7+zx饗q]wCJZs¥^#<֭=ܕ8nz|;GKI'38=1Ѣq$+{*((c=*y9+1uTv睷?oٳ믿w+..c=yK@Y$Ccc]~?=lxXK/7vۭ ^%K "wضm;xwSN9V/X_kog^矋/* zPV6 ~*/_s砺z+nWm^w 8x֌m۰+HQ >L4P‘F= X wEqk \O*(cDϝJ ČD/N[T/YB߾䒋Sqsi;k~ q0m~c=vLjD"D"Y ĶmQQQ:9,\uI;o֯PYY+&iZ766u[v+êUZ/v)IjjjwϯIzCC#Ə>r V !̵:q 'mz9JC21Vk厥!aפ KG 6֭~Enii.cM8眳pb8vڊ&cM rW1F:T>߷ckbNH8i+QAтJ7ȝK&a}iu>zF8ՍMk? (/GF 0gRB)pxPjNlAb\oMhTmh ~73!$U㞦hQ;ܻ$ͅt'#'5e BMUjՊ8nWdתkt?tT7:Iʞ3#&1;6Qf4699l!(P|2Q!F=;M n?dy*𶂚;7{{siHX#v9cV܈"aY]4P$8rh4hIU9~ B@פ4 pD8bhRYڀc*Y`̠6ZP#U6 q" B2j\bmCF,zչ^L#4h .# ,}vnҋV1d0fPJ -҄BYA i"1hrgn<^PKI2;"""%x _`uab-fiy=n"^;Bnx X5 X*3u14x Q3¹hU>`萺%k@ h13ewH/Pgh9pm@.w6 1DD+9P6PpyRcD%iQcgA[mT= d(#FA^z0Qo5 N5M2=nnqjC!`|{ $tT?N lAR+ G-g#0QWa-vސ,MerWQq;}z,-2<_oЯ3!0\ʌ#i4~O(AP P!vR@; OA#o(;ۊoMX+wAZX:$&`YpF/(j"ȈQ4k5hxfݨ:i0Ѧ 4חH0ٿEAk&fĤBh3R}6bHB Ƭ@o-GK|!\ag7dlڙCbцqz+&GPYh4J&D;ywlRra+ 64i6$NdzӀb-w⸏Sg=ifxP v,8 1 Kp0^ Ĥg i0vv@Lڿ3zQC!x3S}[~A^|w |aޚtiR&ifM( f쩁Ńvb-&el}M*>r1 IDAT#f@(ӈ_K6!TE;qo6`o N.wW"O|-ψj0(M:=ŞF3Ppo8I%P|9X ' WİA^H7A "SwbƃxPGь&A $r\-rMMAZ׋&Z##'|Z6.x܏FMD@4mKO3gl,vJRv~u}lNni:H3H4[D6@yl]4=CYNzQ9Z# f?{ڵu}iYf@MM-JKKq CSS(03y<\;w>bF ez 6@ (fPı].&Nuc=ˊa„ }Yظq#go]10m~8y8slr,Y8昣{s`Æغu ,+5k m@yy9 P]] z p1>hu &ЛwH;>j@ zLwGr]CSFǘ1'`Mފ &$UTT$)((?Ȣi/O<$,Y MۻsgM71[7J@Uk(Zm7ܭZm֭|Zi]jk*Zb"bT ((d d{L2LfM&|<17{$| 'ŋ̙t1Ǩ[*rvm7 >\k~h#F駟C=,q4nXI@ˑG3^}ݯ+W㎉Ks.K>Ss}Z`FyzQ>䄛ލ:K+aCQx$',c"؊+4x`YwQ^#ÓvihIZhpz+**بE>$֪F-ʮYF< Yg N;+`BA99sjw$nϴzu7Wnճgϴ0hPEMPj> &ûWjV0J )hy7e9nLȖ\S]BGZ]V@@OV>} iӦhP(Uݻw׎;ԤI\.WtQzƛwG!vsؼyn^w=w×}F> 1EhBf2r<ȬIEUV6RՑ!Hm]re}7z'2ejݺuZ~$v>s :$ݻVZմKPP@@[l…jwZs{Rջwu{R}}= CF%I2_3'R0 ribqG1p$(p85kh XQ#G K$ jrTWW'ǣKS:A{nuG_~r2dFիDHuMn[cǎK$I/ﮊ I6&"˲ҞêUx{K*++5t> z)% x}Yn~)fN*{a9R$(+Vh믣몫Wh=T[[u=gGv7|K/;0rAڶm,X 6oΜ:4~˴qF͟?_K.E?DuC˗/;̒$_^80C~ɶmIJ{/8]Gq:@Fme PɰΊYjs+aٝ>vx{^iyri$/ ]b gQ0$'ˠ+ `P+Yނr{PL~(;$Е^dON8E8$erBAqdAA ܿ K1Е)2,.|}69~M,5%^&]{xwG$'@'5b`PN { be8$W o+I֛eWO "b 9a@WG ޽([rlO7#F 3'ɶ3rzh֬SOG?:"ewyKUUs3^ѯ~u˓Ǐ?I;<,<|pUUU޽[ls﫪jz!I0=*/eEEjv(ӻ+Lv\1Fgq{7m+++W\eLi]wI{O&O0幟{UU5WFۧ5ol³:ӓz4iD|Gō@L=Hj)n$#cGM0$9b crĠ|ԩҬYtnArH}LSǟ'nҨQtW(uUWakAжmE\K|rڧo>瞿hju뭷cTـuSNVmmmrF>@7{TWW{s4ȕq+#?>> N;t=uykQn1F)29+i`21nod8R3ۖM~|!XB/|;ob}֭[Zhy:eYnFW+Wi͚5E{{7V[6[oҥK5kֻͩLQFiٲtg&>ӿ޺hyZdn|>|A)jܸ-֏}zpDHSMM//[>|':Blj[c4oNF|qrr{{-K^ye}wn7?$MX~{;z'5fÆUj?i̷+uרgϞ woo"ã}aMp:Ǫ>JtwIw`ܺ͛7ǵ}6e?j֖֮]꫘mݺ5mP뤓NhN>S~|>旚1͚ :/5 $$ Ą/i1a$)'YoAyR(v$YP2w>}W%I;48cKK[<=ZsFǎ=D]tn};D=?_~~ݗ\2Yw~?ʕ+:ܟkԿҧ~;- Ozj*u+wUS;nSCC&L&N k{^xE[:q`XmmSYԫW/}Y:t??RW.ebի.Ra{)==z**vׯƍ{>?X,KGm۷vygUU} I jKtɧjٲe?EMWJșÑ0>dCdx2ApX*瞠446n>+ [TMʲ,|>-\P>P\vA;4H/$ Tu>P(K/Mkm۶%=Ʈ믿N})[1)˗i„Stuܹs%I>FwWv?k*StGi=4|e?FPW^yfxE֠AzuŗF{yAٔ)wguͷ[~/HeiѢE̩L{ڸqjhhHYZ}N8_%I,Y?_t_|.[GO>f͚Wfj˖-ŋt;+in1$xݼ)LC$`dkjsqe1 Ez<%axа%~wg͙3GԻw]xzugG<1裏3^ө6M;R[Ϟ=UY94nO2\p6mڔ5eψa*NjWU};&nʕu[Aee7\7JA UWWJ??~how}t7顇sԷoMtK/\mgU&W^{S+J ,LYgץ^щ'~4}M6J2kZׯ~}a%IOD~&&p /b}Lz-|A9r=5mg^x~{,XP3f1cFk9YU]]pBG?io*r ݻ^}մ7[MM֬ZӦ=jjct_z*…cO}Gz>#]{uI;9b0WD$ycZL{񓰷`<{b2o-f/R֭˪@ M6)yeY:1}5w.O| &<bP:yQ=?4iDkt7!>}VEE$g:cTQQ4| Ztit NGnIWсQ^^{Mta/^.":\i̘њ7o^|HԫW/覛~Eu5Or&OHuM}OʺkjҤue@ .P(͛ueWK/gƀfϞScuwL/r g|_ :Steh۶FUUUΏ&ͦLH!V'ɓ/ԝwNӲe_^{=c}r}">K[qG7n- s^}}~zPG狀KN L3cY1_$ﮦe"co71mg5oV$Aos{OC*}ɔ>I_+k++W]OHP\n5}sfƭ |G~67Ń^mq пo{y߯Ecd]1q:uy-2~_o1CO@@曵2<3ի.[RHR8ɻn7-'=2)n9!GL1=,XqAIR($e|2!M&Ӎ1CqIbмy9;h]}jCtꩧ 3r侪[ER/\fW&!ϋ$pPʐP^$`F@Lny/ۖqx!E}{.|uםׯV^iӞOٳj'PRq([P5$]H&FzRv"9zѰ-f$+HbT__[nBo}@&OW2vw<}9~#$9K@UjS '$Irɗ"O+c8eL( v˄7SX@WX4\xdL0 ;U^7I z%Ovك+;^zM!hbV'l@'x${x’ϗt+KޓqdA߶=Q x꠴Hn;Y1YiID1q{$;F)1L;IΠ+g˭ԭӸUK3IDAT=&Oka&@W~/nnDL[HvIN82|s˘@PNYyOSeY {-cI7-kUm݂. ZU+SN=GbA0{q$^7;y~/2NrcL~K޲)k8icmNv  t^8H˪J R_Arb ]Or=JJ*/Wc;}|0rƭ2k3NקCT2Lc$[,cxe&[ԗ~ɖKMk(ܼyqf:7qw6m[h| 7߬1F51ƨG~XCIAI!I"$?+R3,-;Sƃe3U ]@\,˩V J>a]ڋPшlwZNB`@\nٶ(gW5dL)t &;rFM|q|(ۭnr }R7L &Z{,r@Dz,K.~ɒލYmxom=o'u7޺u|78'|73|kEbIU^|nq@Gp]x˖}9-C &rt%d'o1U}׫7o\Yo/Ӷm[ܴi& ${O|6wl\&q;ٔMG-} X\^^ƷvT^^.2~'/'>+uoGOYlϹ.򦔳I' H%{|0臨m}vRddAdɞJFb* Bݻ1Rv7I x6o~fO5u1^Qc9e=&>MJySWپ}Э[=\.ض-q%h۶mrͿu+Pd1S^eY'=Ap+6'FJ;&rEA1ɂ)1ZZ$Vb-I}w8lذ[l6PHPXfұ~y<.Ϳ ߪkOvn{gU[[rOZƩAUUĭׯ>۶5jٲe9sy¥^S"۶7keeu@4rvr'IJe_>iӦ͊ VLbdS\cΔk~\fT_c$.77iAV2InKgSz$\~\V1Vg V8r] "={j˫< |}꭬԰aCfS^^=z( Gk*Wq#3g孝,˒UϞ=  zt@8`YNu8luyK|^svbpKz{ڳDݞa| OjK1e%1 V²pLKP ,ꍒlܭy\ ebbNw|)Ϙ$_\orbYss#{Ǹ7l{&Y FBP!RCC0"Õ˧ (qsqM3y'vQR!J!md%#w& ?P̜,N I~N,0*x<;Źf3R[ o;H`ZQ.S^i{/TSR[j^nRISg4ESE,nJz$֩b+>\W+wlġI*51 oRbdM2tAdabe $INrNLaz$+.o6e&O֛5PrI)YodR'.od)0RiPöTI~S#XĻ&IfB0P,ˤ lԼ-]/t3bihSdȵW:_Il8Vi+Iv2BjK"^*ɦN7UOl$;&mנMG3cХlY)$NQݞSVӎ)~N+&TSTgz^CVKb2:myR"Øi=Ӳ=edr ¤;ϢcX&M7T(UdՕbn{9m'^*֧ޔ*,s k &YcԹa˶>ux\gJ 5#%t˹\Ok˷JGL+jt'ݵLC~2bm˴O0Cm,&IU5r19KcPjMj}`L.g/_5[ $֚Lr\)Ҷ2 dԚTAB::|6_2mMhceӒM/NJ'ntÀ2qI)= z8Y&xʰ>jW <6an[6'̒xݖj2lϴ-"(Z.7E$iOqPyW)>Fuؓ)uZ5l'tMb2Ptm&_Æv3!\Er3M; GzqtL<בK$v71Y39M=W,׼1e3RN/XLeMut N;x\>%)@i}Mʶe:kiХ\iywb v״|)-AuQ́ӎu@W*N;Rtt@-4]200?=\ȏ|[籋B)LAr5NGbP6 h-'O>PASLi[N;QuuR"t(ٵDgH3 m@9%VolACСNrY v N~v gN?~*ù(s塟͜r]50A@sw:U/@m@Gph L D% mE%KhCrAХ ""t=dẄIENDB`resources-1.9.1/data/resources/screenshots/7.png000066400000000000000000002413541510634446000217070ustar00rootroot00000000000000PNG  IHDRb6%gAMA asRGB, cHRMz&u0`:pQ< pHYs   IDATxwxTeLK2IH"(RDA(*VDQ˺, +kYV]]]A (Pu(*Cg&3#dI2 )w_\3swNsE’AP0)CH@P5'd΄`2"ʔ22 t, 2"| |P@5sjVg NYCYۯvW"P$fW +U! lf%-[+S ]8άe*sQB%|tIίuÆQǏmj72F'0JQdjE0F 2 vjbPPQ͆ ܇!B@fYy0lv3g5BF&z8j-Z_; 'œLSP/$SZ7զ&^yPb^W3+xLΨA$> )KpS|_9֩L',evIM(ӍV",f9-k'J8jaAe00%M3NɎTRgM+K Sk˜p yR &(f,G@e0+y;jɄ*['_5G cjbj/L c5QyW\j a ctS!LJ(˄8 jաN["PjԨ0:a8͢ sҎNʔKg_)*9pUaLuUkZJSR#WӾ@bVB,uiLiMjESPBK1Ӌւ1JXR:ַYP +5? Ę> ]||1u" E'֠ ],W*[$Y(CU gk.ԩ0V_dE0%5E2Jyv%`^ &>f^QRy G.JmVtE_W5`1Ta-L S\0Ղ ].xn55Y`5\*T851kY"Ø*SALEwfHF55*.x(?|ۗA6%Y_zzZjEAUqogFJ^w˕޽<3*?D@R`B=0"r* mQJ SRjXT|-K6ib`XL(?d)Ȕׁoq͜+=  ,aB av?IJJ4u P%'''T8)K&t<Ƅ}8ek Ӌk]VLA0c=I rDE9oz>^\+H޳JSV©Lq_Lq6EI%%%/z} a[Rnn$O?Ӎ70~}~_5Ky>{۶mdƨoذ0Oӧjܹs/O2ro#77W'ޥ_CwVrr-V~/_t-]?@k׮P[{rn5b X/XS%K/ջN:vO?ѐ!1NwyO:w7xLHII$Yg]~:p_=O_~DNu-\ChժJNNք 3CxZ:u sݫ>Ubչ3} m޼Eњ2e$‹Z;Ϩ{n/ޖ-[u6u?-X8 y^\ny<yypŐjnWDCVա)}$}0E lx5^L8/m4Қ%QoЦIp@C/)LM6_ ѥ#U{x>NZdiv ˎ;q YP5LFFRRR%ǭ<[ |>yO6N;*I5rPvm<2ĨOsO?u;2>]l69iӞƍB>wo 9r{ŗСzgmΗ=СCt:T'YTT9$i歅OC/UNN~?$ *%%U.+u\.RRRPjSM,TeTu7M2*h˜BMm jٲo޵wZ[v{4le瞻%I6]|ΝC}vijѢ-BO>z;a=ڵ[9r|>^{uIE}=ܯYkT(8t^zy<yD ta"5iX-[жm$Ruر ѣ^{bէOᐡS׊yԪUBuE={=7ȽYd L&\GM21-XB8ۣݻ?}9r$iݺ%I}E(MLzZ7ޘj˖5M CO< W(y7o:Ɗg^=)''G>x.d6lU'?SPtSUC͛7ao֬iGEEIƅEFF0 9NvZg:tX!; 0h0={v_ۨC:||W\\ujji)',W`ĈZkb1 KS'%wi,=0)MJ)iVϙ#UF$PK,iZW^yzedHcܠs=z|8.m߾C;wgT׮]5weǯ _x>6 nݺ5RP.+_5o\G_*9{}UTeg1n~KYnJ1RW_}O?|եKl5o\6mѣG%?*33¶%~2Bv_#B԰[Z< [U몫F(Pvt5W; D1xr^/TH;F/o͝FZqҥw^o]_~٠={jh֬Y3eX4oG_iwܒf͚)..NiiiS߾I}}%&&=^cԨeZ5B=3睠MGB9ƊRKRRըQ#\.Mw^X,/nw-)3J[{%ըP2 ˕Q(*n4MB-ZfӡCuV=Sz}4  \=zTg{Gݬ+WiӦ͊vjdX4tj*++K&=hX}j޼vܩghӦ͚2en_/i):JMM[ԤIM0ݺ .5k~Ҿ}VGc,k 7_e]s?ԡCtMԭYڱc(**J_m|d9B8Owubbb5B/uC;'jt4oLbw[5c'Mw}O~Yi7['ޮ_~٠͛/yHa`Qݮɓ-6>|zm|>]v٥!]]%Y֟F1a0=fL 1'kĔYQa L2e:t ۭɓ?k޼>)(\Ep[|^ |믿V]vk7ޘ7[4ax(E>^}u\JA#["""4x }>a2o;5Y#4)I (66V3gNכo\~bcc4hЅ?~ڷo_%cBy<2OǎM,|^{mۯm۶9B9wNF(˨QWh۶Zzۯ) d%%%p_Ւ%Kt:գGw;FֹجYSKWш4KUA\rp~zW=$Pߟ֯m^$CB-cT6 G,Ae)E|؊>7lb6M>UuA'_Qtt>d$imzYڼy8tvۭj:td͘~iԤI ~Fڿ[i֬y][o/ҥ^_s4klCӦ=_+GѣZr{n8t-[>h'3J}mS#hƌ7foƌQz-IӻᄃoVIIIyFHMMU۶m(޽Ԯ];O0 =dܹK[ҌP\\?a&)/WaC WcG6֮]-[UVZvrE^kYڴi#ݮ>[~V;vTNe;W#i}=%K^z:3}=$_?j;Gߟ]t >״iqb^o^z h\{OOΝԴiSԶ+F~բsȠOEJHHכ?ؕW߱СC4a풤zK} j۴cNI# t8~ZMÜF^8>Zn{}M2}H͚5?"ƤIt;F97V޽G6m;tjٲ{ZZzM{Nf={hcׯ>\.}ՒUVt  5Ҵi衇՞={$SgRӦMOj׌ (2Fmj"ǣ{OwK/$m$i%ZxI y-]~Y͞:ws=G{fI4puk˖eݻww3͜9]>?o%I5j ֖-[t:nzY, tbcc+cN-_B:u7g*As7h5Zn&LS{n9se{icN;Ni*//&ƌW^}=ZZGQFFڷo]m۶j˖ j׮~egg;$>|D ~O?\gTI&jݺ5'*gK5iΝС_M{F'O)u`~2\u4*s{%bylڐd=}fS՟~Wp84{,5nH6mo֖-[zչs'rXuY͚֬Iiiijذooҳy͚5[[l$urnuF$}<͟@.KSNvՁC\Xd,Xs %%%iƌ7vZeeeE5r >LR~39s>_#Gtg[չ߸ IDATY:qNTGg _ -[bccջw/Ikxc8 wz[#F o.ө>}-vo1S]x:3sԿMԺuq&eeeA:5Mͮ]&M˲pzVjE ^:p(ac]th`CU4"T1PoߡߨQ.$9rDWFtuw~~m:rl64hP6xcF*h?wQy¼e˖+1 8:tX~\-p7ԤIy+l&ȐmFDD(66L 6 _M# Y/T֭[믿j ҥo.-á 7lXr @͚5+4=55U;vرc!)~֮]b֭[_~ 'ON^8PCv[d;tYV r5k*˥ٳ9ֆ *//O{8cNӲetQi~j*x=/NvjU^g{nq&mܸI;vԨQP6N\.w NgUe5f%?Q:_>,IJHH)S͕pشjӦrkߟvڝPSU:7oѦMuuoaZ[{Sngiܸս{7-_?/7%0t7ir駟S 0-RYYYoݻ5`@~zW]xDN@uZDIR],5<1jKT6mZ+!|>:VZ?߁kĄjΜ&''G%t\EG__pڹsN%5jMkB}t]%I7Rz)""Bg߼Ujݺ'׫m۶lWe˖|Vr:O>q:6G%ƩPiFkVZQr8j۶rRRRp8_km޼+GU GLqV2Yw8Pvv$;$"Wf;a~ff>3zj֬rsseQY…%PffPLL0V81b$͛7SbboԠA.m߾]mڴкu+ZZ.PHp@֭嗏PttդIcIVnnN˵h5nX_ ^|>}\MGۭ !22Rv]!w!Y͑*3se,5 (ժMjÆ_ Ӻuk_Zn]!>>^:tЧ~C)''W{Ւ%Kui%I]UV+;;[^W+V|:ExdG *ժN:jŊL͛7_$v%&&)//Vg;錖R0(!"!3ZWlll805*+i@ѦMk>|_Cڶm-[U /k髯(;;[0:v(Iҥs4wF"j.iX4r-[\?Rѣ%I\0P˗ЛoΒbgӭY⋯t7ne|VnVUNg( հ=ׁ,ӊ> [<[*?l*4M}JMMU۶m( 9n$y<Ǟ}^}ֱ[F>8"XA @!"1U1 g @RjTPK5bA @Ń>z^om;VJJxqu12[ncMU k{_>O5iXzK˼XRS<~K*''G|>L Я㟺喱֭ݫgk֐!+55U> 诡C/Ǔ9s?wܭK/D_,llvM6nܬ~Fw}t+K//~ݿꦃ34pђW]7Z~j۶  հ=ׁ,ӊ> /xm-V|>_? i뮻Vcǎ)N}RM6ѝwN,v^xQVU{O׌ojƍr8<ˬZZ?GW||ѣ߿|s~}:,M0^ 4$mڴYo9Kvgĉ+..NxR-XPV||.hƌQKWzj\۷O 6аa+G07^74F]O3ԩSG s}Oڶm{yfV>um((T*bj@{UTT޽G]6mZoW'ֺu5e͛k ';;[&ܥmV-[кuuѿ/݋/A @mF=6Iv]/Qzz23tF馛nTzzjvlhїk޼]hƌeXt(11ѿEPBBZnW_}YVU?x)1b}ӌoj׮:t:wn԰aa={/c=?C۷$IΝ$I_$*I2d֬ɿMH߯aF @FXtSa4M%&&SyG$Jڷ?Es漣?BQ[l?9s7g(**RƍWFF~I&$pDLiJʯ5s +oڊQҥ$饗^ 2MS˗/$uMbw:3//>SFv{nz\Z߿~&L/VZI~GF:wt액=w^?O6mK@F}w>},|>$SiΜ++WZ:JHH$[}vvB⊑Z'\ZOfӎ; -3|0͛7_6mߤOڵ딕3_j5j@-wgj֬4Bկ/ժ-[h̘4stEGGK<_O>9U:tk/gz啗Ա㩺0aiɒe;tM7נAꡇ-k]ԟt$0򗉍ьK*33C?RM40jF5l(u4K ^[}NLLPGAEJ692j4*|j۶ [ gիW͂|X4RHs8$Iy6%6^+}C0 2T ?MfUzgjhŊ%I#GP*̈d>͛7_} âSNi+#S@hThM.6M^*BPEbA W((A W-h< Am=byI>P+QHt^]jJbۏ·nUjSԏ{| 9/ŝ*Lԫ?i>mPЖ^umF/1'0BT2 !~Ij6,mGMukaQDnI>GL%fԳƄ7|W{eP4S]`W3Xի? }G/ ^|Pb\W AL%qy>sS5XtSlp7zJ,6 ZW/.qEVK3CuKSKؖ{<%3ZZ44b#L7r@.9a@O}thhǿɝgaO8(4}2M@ xXdZdZedpJ1_ժ^m>dE=f5/yLumbQV֓W (5pJ=Z*IAqǧE9 ooQiR/-go͓ BO w]ɪ+ ezTFnNg}tkճh:T^\ѝ uoe9}F7u <, |5O餷H+M=)`n,"##ed\T5ϗ+-Q( F5l(u4K ^[}NLLP_Z7M}yK:j4H43ԫ5 EnS?):Bg]qQ帥)9;𗞴حf2$um}KI/|t'SRC[vxP8LC?{+ƜmHu癅'7,XKWP)K1C_lefO]-h0L~󽁳m6?s!zrݒhl6xʔ!%ѱrw'ٔ+ xW43ȴ& .g )xoņk_j|L 386rSZ8es8Sڗ LeL.ullѮ$o&f׃#,~.D`irEE wn{(ݧ;S4< ecc-i^Ziq ybzy|> 9ZvOgSovFSp~zH9QB9k1C4 W(/K1PailL7>1d8r\T?Ҥ 5}W퐚3N܏d<;5b*I`'>OيVdd$WB 77WYr:X,:bC0!6 ̘*uhT=?ewzF%{h' 9 uFHh(Bj)#台D1u"#01MSO~Mh'P <ϱ}}P7T + *7661rzFEtPR@YԄ~qja^,v;.v,^/b( ԥZ1@)Nxt$ 8Ny<z+P(C#N+c.ZP~MH!e zpP 8v{ ]AǽuALEEa4$\ E@X,n0u1~ j7M-E]CfJ@^vCA;VC@|>z|rр:߿nTͪۻFa@c5 -EZNA Zdzr^Y%ez(1 1'W6"mV502дXCa!Vݮss(1tv+ffs?#S ## MsڬJ%;Uݦh]5P\El|Jeh̺$)%bi+|i1r[N]VbPCPxNmvyJNٓ'L`$).VEX,J&!h@ \nE,Ycg~NPD˥HUNMG; $iy]3=] "NN(#XC9nF@@ nEYmriRJPH ӝ6R ,$i+nS"!9j@Gf7|iذqnVcҤ/(&&.K\sN=|IP^Tǣ(UVP egAĉ5b6R ,$jhM4E A 4kl͛Q!$%%%g{.K_,o],(T[1 P*'Kcn1Nە!pvcW#iR({Ԉ@|$饗O:7nԽ>Kk111/u#OhAkJr)&bݮd[M(ZnwzFFa31M jriʐm)Rb~1&LA;w-駟~lݤb5 IDATriڼyKݻu6 zqij޼4fX 6RwuV^㟿xMxHW]uF3ujذ rJqݺ3fHf@"}5te:|^yU=)$ r6nIZ%\ b67H'#SAblVj)SvKmmî$ ~ZB? {9jԨQ_{|s S?_&!RSS5w{z≩Zc=pGݻzk׮OtӍԸq# 2X,_B͚5TP]RPi)`ꀝjQTvSۭ=]Ibja.+-)ߘoYa.+Ҽy5yݻ5k+\Æ]/в:NCݻwSǎuS;(""BW\q=TIҜ9s5r >L͚5S޽t=wk Gw^W,:u֭[kev ̗ /r ׈ٔˆ uތL5(v~JPRrsb6%P0{1D԰aC}ͷk?{wW]5s33IfI۴)PZ([AR׫}|U* ehw{i6zf&$L2[Ix=4sd>9>i97D"no͚gh8I]&,ȱ-8SF),a]UU娿}ժ 8z(?+!1`w;߂7gdD@,e\3'M=WĀEz:̈izӅf,Y72{Jeee\_| W]\yjcm?S/I=L )dxeǞÇkoSOE]]-("rjU '13^ߏJE+IDDSB M$C"Zr%~v9[8W_/wݻ]3~Q[b׮f\pC۵`Μ1׭駟WkDD%f"IpIیd1i*prєrT<:-#dPФ"'oƇ?|S}#7///矇!}٨i? 6k׾;&6mڜ{˿|?^DwwygnjǭZ=W9r+V\ȃJ;eD@)|~+&M)g8}b$ 9M̈)"I~O?LN}3.\W_} ԧ>Ղa8N̞= ^}y{Yg߾ O>[gҁk7xCV_xx衟`Ŋ i&"r)~# m .HFz}h*/s]󳱈00Kׇ~"3WiZ` f3ڵ/ݍ70" b2pM7⦛nLի/yᰏz˗c_3͐$%Qb:!$eL✚11NeND4\M!VEF*X"I@T(hlš5CUU%N?t6g$4rlR@815hdq /&M)O,:bj$iDQ3˞JkvtN|+b׮]7w%""KpG 1S#fDēID 6B8 S?*55fMWU(d8H%*DЌeĈ&$ 3fX*g$ 9^fM _4]ҾfDY'J1DDDqE"Pm 3I?@0^G2B 8&S"B0K;k蒈0T!"":;&f73!faIJYDnO"N<,Sfb^*a @2b4A(>_NÒrDTjױHdFgQd9uZ@ 0bgw$=PEQDTr:t3#Ƙi,sh4b2cep1#fFiP9߉tC fsƘ,~bl""7xKDǘoX xV)"U0sf"*9~1PȈ%.@ qNJfftlGǺ(>vfi~>gĀ&daD(Ԍn!""&L"O@OgG浮.H0(GD+L?G"(22PŁ`L1DDDø(qJL?y̘4x,x84JH?*UCUq843 zQXw$0341CDD4+>͝ &bli PK]>>q%:P.˨et33z"XWENʩD1CDD4;b9 $i/!H"74I4a2fl?M먈:~K230M$H0ZNSib #p4a@.JowXTiZA۰J" paCPѴk *$~|n# kup$bhtx}0YdG8ȳ> $q k ~6MW0B93b܆8俺(?@ &N_MDDnT K {aN& |1 (Ӷ~',K(D$$=̦3+*cdG<($1#.Z| Х/('m^Ϗ<"1NZ^6@Eld6CDͰk;&f74c0sJ1DD4m48@0 霍aF QmCyOy8 !Lp0$ Rt3lxˈB6 fb1ݢ@ MHX ]aIRbu1#fZDeXEyta $p0uC(6lL9Î-W84$$qC*I Ѵ(;bPfG]Ÿc`vE (šINU *C?I":3+4 bvNṁ&T!"iAFphfNrlRv$e f: P3PC(w;].4X,P։ׂAT6+b@2QEΜD%"" -*x 9;Uƞ'9T?gLrNeN9: #L\Qj8Q T ݡ2b첌V#BiL8H%""*yxGAhT-yr2в3bVD%_Qю~'l@me- G"akp"p<>c>/jjPafPa J>dFo&VQ;'mU?\x F0 Ld ~'jU `DDIfVQA 4L+*B33bqλY]%TW QDͱ8$X x@4gc$\\Y%SXSncah*Z9< "Mݫ4<ÐR$4 bpQը|Od_#{Фip0 EPICǂ 26> ␏Ó(mװrEF xQ袐*M QIKRh1Ph35@"ps6i@Ea@DNJY^fP`/v^ `O#͘܆-!Ēs3baO Dp a Oϗ* 0;4>̠*UAb]:2c2bFuZRQŊif` JZˍZmdZpS/$ NfALK^T)&3\ QvUAw8X"c1$-9TԴnÀbέ ke8e#]}AUAFu(3g2i9݆]*9J1DDTvܨ?.fPxO\-@"%0:,E, c^_0T-b(w>1eψQRn1(r*1 QrF3tXvX\H"J\̊V:?8E"XXQz(=bX1;z  p\k.pG& v8]qޘ^[[t.L&]N(/}-ÀO F=6tÅJ&(+2br= .ÖNL&h i UB"Cߣ\eQ=3co6Gq"p8};Y6wYWqW6~݃~R)ȳHF'W#^3"1].7jW2ZqGs/ iuP#&LbӉTj 0;C ΈU,-&̈HR('Xh)p4(ˢU,+͹>&3dhl[D LSsf?qs LJÔE&K CodO?c5,?4*Ґ UjcIvH`;l?ls8sM0Q!Kz(ۜ.4NCR:1h;{uV ٶ*,LwfwJMƖ>6ea"P N:1H n,i P` l-i$@iCi.vȧ[/m DO&Ycݩ4ls~T F2%'mzuA6jK[;>DH&&KOZq>4A1~'jUmo4P,]:#jk,cϜ2 hb~$cJ& "RB!RQ "Y Dp6Qk. pYӋF `NvbtQB?g v\hc2Pih h4d*Pex$g8bЅܮD""*9.7;,`* .6 X|ʦ nBEc,ᓨcfLM$JH(D2,슂C^bh|,1J;*Tq|RnÈ&1DDTrv\ճQi8T`aKa@)$e ݽh, e,(ir apN˲>̠JU-Z+@UY y<fQyֈ}abt0CDD%gۋYZv U( E Jf˾Ӌ9wǧ &Xŝ> 8b$,kNh+U]hzo$1TB!"r$ -*UAKa5% ,L8s<4MN:~TΕ.Gc6&Na=i8\W4YՇT& */}H"SIa JJӍ:,  B[Dc'm[]#/(ڻ߉Nqt(KMTQ@ gcӐ\CHA[qkjV$mΜ c"9pH4!"Bf|$#!N#tgD7xzzFe Zd/ϻho(q;,OP}AVIO]iΜ˃Ut4DE1UEWH( !,3* QiuZn[7Ltpc :/M|lCcYY]ݘmyspߦA!veb1(e^z~'܇U( ZC# 50c[첂iX B/`dE(@  _4O4 \$EOƞ-d2goN6cym f:Vmw7oc0&`9d[Cg;'0T 92 PvNJ"‰xVK;b@ae89sbd4ݘea26 ܡ8o{2B +hhEc6 =k\bq|ov\\?ʱSc23 QDiBGDȯ>̠*MXeNT!"rV=ZpГߓca@ż .Jcưsm1kGwj\' dpJA\)fnMcv;`䵮MM$9ԍ2 {U!OIHZ1  @ NzU***%B(hGAbH̢1:,8uGDӐmN0ezǬJ#lrEF4iѨ :J%""e*ߍ% ʈ3TQ@w8']H) IDATTX.IFNOYa6]PnCߏ#cbq|\\?khHR:t+qmM )e4c';[v8]hZ^߮8:1AW0{rIF4 hj,7̌* (.BPj 4ʣ2ӝ5Q7=hdL&,yyf[,Ejzܻi{>aɕ.ph 8 #Je,ҝJEe^J+#GpB9fNrG V[$1T2!"QR)^=rtRsˍZ=~PO\EM&fLx2N'ǩ3bBsfu5ˬ_D vEAߏeelh2P*sCUN@;->LdF"1f5@LIuVD3}(ċ`);o9́*NfD(d1c1Xrasg h8jH>\8.m-(+Û=8 a IiAA,]Ǭ,3$Q<{/v)XnPL^P*pI ĬD?k4ekjpNu5yfjh0KfqU:0SLTfJUE/Pn7C8:))7mf+et8?+bV6Yӈb )1ER &%ʆI0ì1\ʪ4t kmt^/dB/S&5@6[ΑPX 5y /[ȐB_W=?`4i'P MT ݼ >N,^/ٸ+L&q8nG }ρh׀=n7~ceJU)bwpvu;HR8 bӉA0kkpjUԺ\LY5O&1P.^sL=Xцibq xfL=5b fz1E31hf(,C&Rp "ŗe0Ch$߽[Ӈkm?Pws_?>4%ՊY!J{v(F|\@[24AM x`9XPf+qnMͤ*xLNWG~(q=N`2Ċ Tj*z mG,dž@c{sMZ*yp|~ܽq ΟURJSg.l"8bT mڊ:]c+LkbՊ 4"hDpÎNh-t KH&̆/xj VCB(>U(2&` .ÀZ.8aY}{ax,hDe okwo Uizyg8[jhc7xWWX Lꐤ_W[bk_?ȣ nڊ$Kvh$CJsc]o 矛u=񎳞4eՆ֕2ǖC MX}lmwJaܴ0Ak7كp> *݃W M i}==xKv_W;!`x<#(sx$·6 gסihlFO8\AO(wF#,(3Ecx9ck*άD8!qs#̻KT oq3xP j%q 2!4nl'N>﫭Ḱx :i&q+1CDDIb{~n[Z­7 |K]`S "݀ZDiX~fz@C.&X 4xS j5!OuQQ`'.JO{,3Nㅶxqid5? o%\3k; ӗuf#ھ ouX0Q̸|n=ھ lE-~8Ľ9D ܵYU5AA5V_@̨ MF3^jĺ\7,MƖrA#?׉&UWĊ2}/wtSc W~P\)h2PUtC8?uku 7GχG=lOvF,ㆦ(8  DD43*trG>ҍs곾.h @tY-6 hE}"<с({zy\"`Gvz].7۴+fgaGSYxA{?P'J$7ס;4]XPfCRk-@w{ӟHwԨZ95ոgfDQs[_y-y7N(;8}}b[3qܵal9՟*rE nw u=a]S dBVN/󯾁׏M,6\1Ab &p\pD,tZ v ݏϛ[{#:xCY lo%h T a~Y:&rEiӅ|g V6cNE[K_+ԩ!̸~6m6溡iYщC>?)|d•s C;ad,beќ ^Ov4cÁ4dt+qmCu, (R-(Sd=E^-yV q8 ;euh$o~|p M󱾻Xӛ Ï r IF{T h J̐i>TV{g:6ᆦCYdR_%bhZKSA2pFU%~g_^, |K';'c:x3gX%/wl!J 5 . ~3u,:kjx`vDusȹ5XTQ>ُs볚E4zn=߳?F` 4϶s]q$%:2vY'b9t,H`ۃڳ@/;F2;ֽ3*3* IE9s쬧 2-(++x(pEJ+8BQ2J+y|0X(< dkjbGVg5 I2KM Qd*FnGϏ].wNۛ2RJӡ79,˲s ]sPTeT s`[ w BEyr<Co(=p^SUJW[F h4wيrR.+X1yg+`ˀȦs}ω E?OA4PiC mko⺗_[㍣=X^WW̨ YWˌ,~^m϶>t1Ȕ6oS*xyOV\':Ti8'9p2?ˈ*Nn0}0 3w, fM30m.ˤw_ߛ~hD"(O~T*T*d2h4+6dهN5Le,`}w/j Y[wॎ._W'6 rXͪ'v`6*xWi$',3=痕ᅶ(~;#^2LXP^H"GϏ̛ qV*ju oୣ=E*֒,)劄9]QE\0{Fopڼ {pZU%Ϫ] πeT*߻=b{'r U,Vo$wzz\k;~g??b@1 8ή)m6Puq"“̚*:: <3#jfm`WdCց;PiZF{ x}{g!R0Yf9d}AmvY'ۉe|~( ;A,,/, ;nZ}~,(yENJٳ 1@i K ݻp^$In>p%4Mzرf_|֬y%KDDDDSwEtҜqxg=8.?܄{>eq7G,rex䓏߽ _7B!@"޽(Njc-.|%ϣ/" jJ|_…Mx[oEN-C?8Ђ BQ8Ђ ̿B5lڴkW3ZZZpç> O>sģ>Xd1:L|_³MC[,ٸ;q77嗯#!HoPo۷:egaz}طo.\Y^;Ӱ`qqX,ؿ.gSSTU,\{08Z}Ng %""")@$Xr5֮}y`ɒ%ә׶׬y7pPfPMM >񏡽m%IBCC="2*vl޼Ρ@]{80礲2۸ g6pah PTw` dr %b赊rT""""r L+WgY3atvvkF*Bwwτ͂BDӗ uWn̚UՂ38]tzF6zI'7 HOd4 >55CTci, xIsB~_"cQFӖbÆ${Ñ#G]xgL&GE*[񷿽 X~#z#ֹO eTmUU Ӿ_(ܩD_gGis IDAT/<|̟??ԴMM FnŊ baL]"߆d…^0T7d2sj""""RA_ W\q9grvٌ9s`Μ9عs,Y#g/c  aF $a h0CDDi=ڍe˖Wz|r=W\qc$֮mutt[ ._#}߯~#oŊKq뭷3_VϿ{,[gk;w²e<,BᬷU⥗V> }^z9Vt]6JᩧϿ;w^7vQnqqy+ o.mTb""J,駟O{{װlYشi3 䒋>_—qnAoo/D"|_Kg?}l}~'p-_ş AZ.?!{SV-ªUAUڇp7mBE?ގq>ǷC}}ma|s_Buu5~~+_*x#cΝо[46~8j~0Sl8 bsb I"OAUU՘3!2?$̟߈@ GP gZuם p}n+eivVˈ޻q%ܼK:-[SVKKO}mؼy ^z(++<馏b8Ӈݴi3,z? BzAk.oZDqqq O > y7_d"""*9TL8Qa2Ja; |gd&h=83GDK!=:>XfŊ 6@ 4ru6s7ƍp͟y!<\/kn9L?W\Awǟ|7X_Kpo~[+.W|<}|׏9o7\x%q=" <'Y2-[>4 [o𕌟W_ aڵkFa`ժpMFm4ՊN: 6mM7n܄. ˉ88ڸqoDeeDDDD@t 3CԱ ~|s_Eć?/x .2lݻ8t*+wć>t~ǐH$;<￰hщ8F~{9ۃ}Xr_q}zz܎DO~wmɛC?Ŗ-[>g?̚5 я~߸sh; g_Qtu? xGqWK/o+PyfsL?f,k@8p`K~)VX?YHb˖5j$~p5 /3CƘ1uEmxE8㭷AءcѢ?|Gx+A؏?^K#8UUUz$V˵D"яC6oތZ壝!"1c:v4wqD8\ Y |>/*+@2̌L'$m۞5ӼXaX \uYg!kgkWᦛnE׷mҰ/R =gm_}5&Ngu:nf̚5 K6bhO?,cG}ܩL07nn[!J֢rN:D\s͟_ؼys3h5kR ˅m۶c89Y_sK/'_8/ e玵Q0CDDY9_/֭[{<y殙f̘EnƲeaݺKsl|g%K~/ W]gx (+ev$bb˖زe+[[ MS1nY~YxŗcG >A8cŊزe+;N:_ ,Xu/_kT isĶm_嗗a4cРA5D" kv=v.0. |ŗXC̛k= _ӧOæM?]/ +W~/㏟Y_y}0v cJ$ņ >/$VXQ#DDDDTHDDDYAn;0r̨qYg@_@&L7/ȑfc E<2v)83Z>_a訪…^cIKIϊ339~Kpwc֭0`;X~O v_[n]vLOIư 4s-gq C̙3pw@4x^x [#a`g㢋.l\'k? ^z ;n.֯_Un wy.+H)1go.hn:̇;_g3xM)M5x ?~֚_S_-e<:< mN5\R$[<(u?ٹ83xhUU~>@@2@ϲh{h8,Y5[\3&QI1Mk|Y-x⢋㫯믿ŋC5 RDDDDŌ1ČcFLNbqmwwCmCp 3~"""3bX#(q!M""""""""*b """""""a @!"""""""*b """""""a @46QDDDDDE"^|F84@!"""""""*b """""""a @!"""""""*b """""""a @!"""""""*b """""""a @46'LKL '-z]DD}(0TN]2""jSO!ϫ1MQT V*+Ks:(e QX"Ɇ P`CqVᗯ`?@eGcTBFLԆM3Q`FL>I k!= m!>M)HƂX1Po  9qK!x}Ͻ%Er4fŔ8NQM)`Z:R"`pXі =u1C Po ɋ.0믡<3H)C ,{x@䓀i{篳O@ 0|x(LQ ? y>X(*oJltiQ7mx )~el""@ QW0/RB]$䔽0&rQw|,oKBl=vg X9`Y++ \^0m v@<<~B {_{vN|xA5a`J`9ODKM.C79sQpj*zʩD0Maf3}gtB@9n,ԛnKvUP|;ٓCNxF@n<3<cj ~tɐ0ēKv`.C} \w=_uCcuP&5<+5}^V*plr}]niդvM^$/BNиY1DԚ\2#M T:1Z{wf1vccˁu{s +B9ԇ9(~eo>u%CΜ-#kw6mm;|^r|/fx%b Ep8 rԖɧ߬k[ȒDCߕ8!o =$!<硪 5+>g/DTځ2/$ DDl8uE"b VvM2cR ƄBPnG҅w]nwY9CU,2[0&xz)G\*wI{FuX$?Am!> xj de%p\ xM(k?G~2%|YQ]A+-Ikyv\qvɐ/-xr OuJNRJDbq85 RQȝQgՄ#@1C p24ƓJAt&LOa׆`L < ɀkU@{ oA]2Xp=Zdw$0r\MCW&J@FCcĈuu$pQ9 Cl倛2yO`3{wצ3uDҰ;]w@*s6 rY""ʁeåiP(Dw oY]R5C%\iGmK Lo!g"[=Ƶ@=P~7jaHHGCc+VTDzavӹˉ!s<Ԯ}lJDT*72箠i :1DDE!`p܆k3 fig[oSBvH{Lt؇V JtD!?cFClVN) *:Z/G. IDATMx6L1> ] TwGO"!'bɷ6=Zel"e@J@L6tWT!s=;RutfZ }6$*MjM uGseUg&߶v}uX2X2 PM7:[ϑ)R vzK{)Pw2t! "*h,3 - : QF Qj#&M63bzߴkRpִ0T%u'O"P6ve8u~f8^nCc"briZuJ_ DD7+>QO 5\@ brHNȬRUbDT o7:DDYK$*,֛KC,`[@Sc  2#ƭQ<CG1CDDDԊڰ O1NNJDԣQ00M65bZQkZpeɈqjyODc5cѩk$*r qVWg "T1R˩jp(9bZlt:q%"A~ӆۑ-cQGmT!"""jE^ӣpn=K^` 1DDDDYD1@vm訏Ɛ EDobn]C 31CDDDEвQpdNME}4Ɔ""!T!"""ʢִq>5 +QQ+hLō""",uƤƛ}ə9 -L"L¡-s:DŊ""",g@dAH"B |"c0CE""",zFCCDg^X"@ Q}ˆSZ}ܩF QϦ>LLE""",jou~f\:2 b1CDDDʍ~[z]0kl4841DDDDYԚm͚$Q n@6@9/bY6m: 94jL@a&aCQb  H;]CmT!"""jގ¥Ph9NMC$GRJ6Q,݌eCQb it}%\z7DDlxژc1c&ȭk?ǂc |C&Q#1%0a<HMn$ÁZBFDT@Ȏy: @ɨ1#&nv0 ĺu`l8"""ڞ4YP( Ui+* *3x1#&6lxgim7o"QGźu뻼۫qi?mi+` 0 cA+0M'yLjUn^O/źut:1{~831p<λucƌƙg}ݧu{ t8p fcTTT_|+1iDDDeA+ W3&5pš`oÒx2FEkȄi9_hsd7ر{X^VV +0~8TWx-܆ի?x%'zi̟)x^8{Kq)'E0O<_sOX̟1X|Em]9/~W_''aā aÆcѢ3Zm18ӱn7js`a9r$f]w &O _ם4hO<""捾 !DD0@LwZ},Wh=0p`9,+*+<[o ӦݸLD"e3fLǴi2klb1Dm4 zRBsš5ky /_<<ȣ8۶m;v  =W oo{Y=w=gqne(QPg" X6O8u >Sb &yfI 9Fuu5.˖+J֠ 2v،aT˖ ۶1y/1uԬ2e2p8FxɧqF̙s@ _ݸlÆƭބyx~>3l٫˒$xMyU>ğg̝{4n̛w>/~=0O^">߸yODTP:ʌE*fGe"3fXx뭷q5BU|AZƍqMsF~e-D(+ux}6lıǞ ]X47Feee!:y5 \K xG oį~5a1g΁G'N98cCp7ߊO)O`">,dE6խ6#"*u:j#Dʼnp5>p5,Yd2H$xL:Æ k8p;@Y/̈́ u6TT jgZCDD_5t0 $R)6Q!Ѧ ~Ƣl0*J?^~엦JUUnhqb裏/oa> \uՕؾ}{rχf D..7.Œ3mv,\x#&MK/ϓ&oN@먳(wxDDy: Z̈@L4d4?~ÓAUpwv>̖-[ /.83psqx~FKbǡ*&Lkӧgٴi~go8p :h>6׍7 =h5k_\z| 4KmtG|㡇w܅Cf^">.mk@ QŒIĒI8:0tԩ&7TGEED;?7]4Y_ 76YkM2/ zGAJ:#DG5B<r$ bԨ}jiT dDޥU׳]K#h{}?4f[+O^o^`K۴i3|>4MPtI0 }*d%Teq4Y&,ksܹgfبQ#nzufl8"""7-8Վ"95A{ q}9~@i=CY,֛c_1cFw()11El8""bѷ,8b\ &"ٴ:TITc&wɆ ""* O'j8u'"ʻiéuދ0Č"""&jL n}" \X4HE"""7VfMr GDg n3r>Sb P'1]Co\4;(p&H*> 54-x:U RG0¡IDDVd FP3!͵T"HƐi3/(@œuq@*xFW*~3c9c HՀ4<9X8tUB(2t4`EpTtɥT@0xHzmBxFCBrC($D2 aŐr `0ߴPrv5NMH"JASlLD/!TƢQ*B[e;A0h"s%R6Ha3Ӓ!"*ԌI vyOD;G dGĬICGж C#\M;HN,%Pj(ҁD,F QG-^z^uΎ¡P;y* EEIT\ɩZE<a\FCA6ڨRMKgGO~f:opu!5MfKs~i `2PNŅR'LX u:@hP`F@C Fs0#dnM8Ηs:̈!"iӕ@Cr*2 Ĕb'?nh^ jnh047(DDpopĸCDWT}@8bJC]duTB&!U* BT "PS C?S߉&`p]>LE$V{a Rόm C*9  emt>ݥ'"ʣHՎ 1(fAjnxĤ1^HGM<w( Sl""7ma (g1.CGm_Rqa D*.[`NO˜2ACM[ R1 A'"*v!$>QԄ#p](k PE-Hŀ=2KbkĴvu\h 9Iu]AU((OECG0SjDН Jg2b9!y@Zi#,#UD,!"*bvUtp DDy0VmY Sqa :q RshRugh:Hy eF Qq[8.֡%X(V1A1T\)5q1#5b!H%}Pœ9Ň*f$4"ɱDDov$'0d;QŒIĒI84ӯu:뉊&(-"TPcH9CNLcdCDT atÀߺl0 rog̊@Lu&j@j.;X[AH-3'ekh 5";1"iC$YJ߲.mlZ9]~@-TD)NoRwB>DzC %¡I-T]ˤ]/zw\ODF߆ iCMC{p}TQ*" ĔZ'?nBvb64PłwDwf(OD%/=#G3b\?or}V0C JHzcu2HG?(aMjFfMRjD(HD!V mX/QF5FX#1&B /ئE.i"3'5Q,>X.5g:=jX#1$nB͚$S R25fF jmhT"{jiB윾'QŒI\Xu;N>d['3:!L"L¡"#DD94L_>G٠T)N~P\4W_m! ZfF:g VT^QZ _z x.#o<铡+k)c>0. Ũӄɺ< q%"ʙem&x}"K J0!b愈fZ  ~P"̈A* fd-e~ڴœ~HspC1#7Qyhx x E~Vl܌<FI0){6 T O*q6,Q7S)ĒI84r:$9{& ؓ1 IDAT 5m#U'DdJX^zSVP۫ɶ`C|H;M !0y萼Dv$YB@ƊQִPoZH&HUkEjFaÁs7n<(4Q]ߴ=nIwǦm۳rpn ,YH}{v;_:z=&xhEk8]*(w0MQabbZQ@=. Pb׍2o[׵B]L .V y o^яG Q( CΘRq1V 21˜w>k`ڴ_A{v@$$-ny<8hQ(rLP`k]/5Y#P=++0j@vQ))_w(^@fwcf0#Pw:q9pD68*׭6.]?N i'P"!hTxqw=DK.ە/oOson8RZ>@Nk"#Lζa㨳c`?'k:zb?ܺ .-w]VaWv(kɸxH @L8F 2[̈ohYCRs髅'5g:`GΜqĒ)[6^vXפ!qI~[s9ZԐY1ʊ~UGOO^Æteoy.n.ο1 _wRlRno _Η|^׺.d8Lo&Sz];|53G F;<. +tD )H:-Q@b2ꁴ^(LaoyY>1FH/-ʼnU3bz1]U}Džу=T/áu;`Ec,cl1j`y=ݮ8fxSyc&1ƎzCyW ` cڬ"6w o|QA釩 0UAH %ԽiN(vT"""""l!H,O5 T#&@2(O_*-gn#iW6!6jDĈh]^+VNT"""""60SJx3& ? AuZCRJsx^ >l#kM%# FIՀHD* ] h6 cF Q)6Aq3=i^wBBmb D n=O_C.#$'hIe(`utqEe FJ1MX@髣v,vAQu9?C"o µ.D')vՏܿbDRq$()y #"""""*t"#3zE܄* ڞ/%NT/ 1d 4NDtrdVRO$l_+ wϑ"Za!o "V*Q)%q вԈw &tOϓJ}SX߾)WydHeO}- gG#~  5b1'=b &v|e؋y/*2(f+zdPZ2ߺ"> @Q2p"bx,YJC^cb4V7}ۼ@Q rA5wHF"6ܭ8nj`PbH6)Nwm72|PջNC@ԢHo $ K`wIz}kmDt Y_?:j#{: -^%DbɚA!72'G&U\XH\\1ZNCi7[J O=ب﴿J,;"褓[cB^d$+mYd 3{MI$Nu%=}*PbE|!] N;:jLKBB DA`(b`*ׂ D)  ҤxwCh2ɔ1L$ &ZY9O 9YDв1Eyd Wp쩿ϝEN -ϮI??>G^}!"""""51U(`d { pV׾C^߱Url8{5tM X=_ΈHSm_AUrڸX# (xߨH&-S>"((#]V?4nMA{|M w7{sjgHΐ8$Ȕ u u;P\WpY5V>kfU'oF}ubM v}d ⶅ(r1Q2Miv7j*ԟ(/ qB?`2I&`d F8c`\6JT0 Dz wn{K {b9gxcIf{;3HSx>ΰF?U--xJ,ǬSO_aF4Lpїr~._IWڵ۳ͮ]Yl9y֥Oބbywҥk֬([n ÇYpG^X"""ZK8Ⱥu뉏gɒXV~=l"""8|ضm˖Daa[tԑՀ""""@L9{o`+(_(A?=3Q @fXRW^o){F ^8Z$؎A^MTx>`IQ~'qqTK0tfw5HJǖq&P.p/(̤aoݬ<L MeGdsaZYǝu Ga8j5gl"!1 ,sNԮb!1 Y̟ʕ;k* 1 aî|g$&6b0{:uHRR9s&9ضm;W\q~~~|w\={ph/K."::~[ڵij8Q &q֡ y8FQpLĶg1:ՌOWѭ8;:t?iD7+e85۰t=mÚFAEQ fn[PəaII?,!++Dt鄿?[leĔdu؁UV'vڄ^II%׏a^CBB%P7i҄M6%0͛7C*54[LVK (Jpz}|U~>uTsfjיD6iӦ5*jW\q99lذ7yw:db9E^^^)nQf@NN.ޙ\aaj49)#""撚J笳ꫯQ\\Lppɜ}v JDffWYVVVʱi3IU ""Y,-Zºuۋcɒu5k[HK￧2sg֥5kg{ח؄7qa֬YKa] '""""gڪ)ߟ/ҥXdf8? CXXztAf3b#))鄯N:ӛ9sbiݺ511)""""g>8qe2eJח.]6[~tVTS4hPF4˅pC\\S|1{^z/5u!!!X,f? èQ`Yp[vY?YO2˕]UY]DD_';;> vMVV&QQQ9k넆мy3f͚C~~>aa x~~~9)#""JHNnuM9M9M9M9M9M9M4}1QTTtBDN3لbfaT!ٗ_~hذ7x=I^?ĉcQc<h׮ԯ_a/Err;5jXg><8眊ڽ{/}iz̙p\Ǿ‹[g\^W_–-[];?odn 2e*'77VZؤ| ii:wky<֭7|E:uOK\W =#"۷s'/Ox9- ??b*Ctp:ۋZ-bt/yc\G}L>gsuWsٸqO= ?cr喛fƌQ|LfgB&Lx/͛ӯ9Y??\zg۶y7Gdϒ}l裏o_cH>cF/ u\:tq㞡iӦr_bҤرIѣ[nҘ0a"M`̘ǽ[f-_ #Fܬ6z񡨨\UAVV6!!ʎ9 zF.FoLOUjg9眾c× G> 0k{Q՗sOKK{g>۟'|n3g~ηΣcn|w}v۝={ҡCWYRRk `5DEEx|O0 0 =x &AQ_pKqq1s#F, V +O>!C.{^\q5,_ DDDDS-??_ jg a׮^7o ̘=zwQ^ff&O?=͛Ҵidddwןsᇟd^w29s'̙P^,o1v>}棏祗^V{-Fݺuyw8q[n?z#g3cTRS1eT|s*C\H߾}%,zncԮUvIqqq핕ĉ/c6,8p{ =p:^t:yK/ͩ={2i+ <+sh;wSPK.g)gAdd_}Y۶mgE>/}n_PP̙3vtViqHIȁ<++WѾ}2} Ĝ:v r8Nbcr_m IDAToMΝiٲ>F [XXȬY>VO4_h6󐜐И}{sUӽ{W:v@>+}fϞ=^]}|5.+:޽N۶m;vܹ_{zU%]6nʕ8)|v? ga<8͛O쓞={3 NΝիDDDDSIcN3+eXx;͡vlؐBHH׀iii|e̜O%66ۑo3Kq88p1E4n܈ /<5/xK/MdРX /W\'""3?`U\SNg)4OTSR%3+{3kSaWsիXo.m۶8cKddyy%\.~WLBoA6z^{t¬YOkcXظqWuO8͚5SS'00ݻbXp\lڴhg}{>QJU^gܸ XV֍b0BBCC=cZ;B jVY駟⋓ʶn݆l&: ?ǤI/n^}1٬{Ɩڶm;^Ҏtڅ;=>z|.]/R ĈO:$3i+,Zw7a^cm:ts曇cOZ~s.>K[z MX^6p>ןtWy\|'q;v2aDvömy'xp\smw0e8p[`"Xf-m // &*=o׮]Y޽￟τ =Ƭ[իװu6}}>s."OiS͛7O>c7ٹs˗c=!,,x1eاyXhL=eV^xadQX ;wʤ9n֭[﹯hذ DDDJk4l ^HFF͚5W&Q4mH.1ooL8F .8ݵk;0z4ODD^8믿ǫN#??s=믿owLjbי4nfl6+;v`ڴױX,K/˯g{n{(1b(7oaȻxٳkڷoc2e*'Nݺ1sϝYkԌoꫯq`iܸ1cG?LVV6q8IIe """UgclLYK-][ڏ#GU+BYff_N[~\.N'U:|m\rO`Ll m1mڛ2m}ha۟/3㔈?!5u!!!X,fo]lֶp\e)eSrU{V$gÆJ3pO?={}wpQ.]̙j3o&66VA(# eĈ(#DMʈ9=z^{+~ȑD3dȅpu5DDDrʈ)Q3b4FHVEO Ĝ",[5kֲsNJ, QF$'gs޽1c*16BBBx^FK^=Au/\p>^9{yキٱc=<͚58?3se E\~e닋NEDDDDDR \.j6f&77ÇZW>#.h0C x%%%)..j#GrQrrr  ;;TZtޝƍy֍*+Zjѭ[7j׎t3?/gqqבϢExy14jtq=wpHͤ@LaėXv-[6gϞhќ222شi3˖-cͼ[{ VZrغuZ`Æ DGJFv@JF;3vZEDDDDDzQFLzzx晱̉R۷`,]Gy}Τ$r8pڴiMnn.SAff&asrW{]{5 4v̙(п?]tU}sWpbK~xZhι@fM,֯aۙ={6<'@t瓖 ҦMkڵ19^~muɇbfR\lS޼y7y>ne7nUVǼV~9EƎǎ;e iDnضm~۶mgqI'1 f[w^@@@uƐd"**u<ܹ_x=34n\2nLL ?㺾`rrr]j>"ZhUޢE ,XUY S}HH򜧰Ϗt(**Al߾Bh?qΝ;+bccjukGStҠA}|qBCC=qqh>1cNwfZjIJJ {!)g]۶%ݓf_f 4/[, iqF. >ҥ˸!cTUb)8xu;n=DDDDDDR ?~gyL~+ɼ*;WRR+V΅^)o۶-C/Go߾<#_6mZ{9SҸK[رg-[Tb8t0[o޼:uj%U~]QbrUIHhʕrrrHKKdGfDDDDD ĜS#G=S^OJjÛoM@?M<[Cݮ A%!1^z1c>_D6m(((`ŬZAL6LzXf }7zʮߟ /ȫNfĈ[cͼ ~3}1mtHnn.ӧ :'ʖ-[_?3Rwc7)((wߣiӦlR 9mv3G~~*R 4;R㉌q^mILlBaaqr*\y1w̚4oޔc [?SN###8^Ӏ fxG3[ӧOoy[oX,t҅an sNƌ׾y1;̜ڐAktv}\ȈgE,_s{Js||AAj|9SPtb2SڼH!33 q!,m6{ҸkKs.EfHvmYtlU^M&MիK?kvfٲy#$$/;p ֭'..bȐ S66}.h0Y,XCF^=n3BKPP0m۶"""""^,Lˍ]ݵjBb*s\̚5ƌyg޼9rD OӦM>&غu+naîgTvuܲe+jEiflW_M7H^^?3Y̟~;nI2 fپ}l4oW_ͦYyg݋s!// cZ[!YV7xQ FN|Bbj<c2HNn@tt4[dӦ>oӦ5&SNgyWIOOWl䬳b{nɖ-[hҤ u떌UԮ][ xj֬۶vMգ~xvރd}vOf3!!!:)Ir].͈S%<<ܫ,""}>?t0?|(,,>v65\asiܸ1AAA@I0h֬ sL%""X!ܯ:nӏp!5jj%''0ut϶NB,3eFDDDDU){(wp(S;];SUIpp/VZҺu+͛\٬s:_mZ%9 }\_YY79~fAݺ(&uY`!9ԮL&ߟ=] :uaat؁78qe2eJח.]6[~t 9zRohf)pr-80C3z( nef cZ7&v\DN.\:NY4hPF}w9#$$łlǏQfo7*.Le(2ene+޳&)Qtb534xk tqyjs5IN ˅ltB  ]. ? O9% .dPPvDMPe3w*#"""""2b=L(#UnetY4 bHoʕxٲe+\|E > wBܹOU(>uڵk[<;;}…Uzק|Oаanz;v={:""}p=w1rʭ&M.ffkRu~xчٳg/<n>$9?WyttO:sMC=@ddVSO=˖-[;=>u&-- &2nƌy\*""""8bw: LTC\ Dnoy\nʬY+ 8p8y]v3w7ygϩtq&ШQC^}%f3ڵYu?}M֞kՊ~xFѣ'4GDDDDtQ FNB`h*dA[ 5eypW,((0*l⸎⋓˩];m駟yi L=bР زeW ?t V/[DDDDtQ FN0 #F(͂Rפr~fxk8˯C4oތQE^-[#[ngܸ,\m޼FV-}uٳI^aA ĈA9% .&n m&l`2l2;`ŋCt:0?W\qYv_:>zzp88en99POroߎoQ )""""guSPn5``WFLPt`ad@^mt҉>xcf޽wJ}{=>:wD۶I<_xOX r1JvvnSxw{瞻y͒.M7p3jL)#Dd5Di@ GcU4i@~0iҋϤl<}f3m& @FF&ӦɨQwM&R\\ƍl6+!!ʈ3ƈSra3Щ4 T2xEGGs)((m$yi4jԈm0aDx' '/{|LnTw޴j€=7޳@fxǩQEDDDg3\TOץr˖ӏ-;c#Gԛ?Z){K^Dv{0KKL:z?`1 ~=MP׭u"m'U+BYff& ԯQ_rp:8rrr<9#$$łlg԰&pN݀ܲ2e^zʔ}_Oz#F\Ӆ.*SQ͂ 4FH HLFqL&Me\\tMu*CLDDDDD<b;%j5NLuVta+3Dn2bDDDDDDS FjykYLeT6/e55IDDDDDb8iK5uV> d6@r2Bv [ۼ\l&_ SP̚`1 eTsN'2 |uG@rN'?1v=Wkv+g6(PMDDDDDb8XMރ]z(|eAn-KDDDDDċ1R .,e,Q2T_峠fUH ȩy(lFITs峠""""""(#U.Rf*c kR5W> ߬)EDDDDDʳ ]nL_m5(p聼:+UfG3T """""gbL?o2 WcTk'~Wd@?.22B """r& J5I\É :VA1՚ƂhV _]DDDDDD(#UPk*ca`W Z+ɂ:M$"""""R1R.@dhj$ ʻ̊AfM@T9{"ȫw{gAAIbUH H+re6JfՑ|L2DDDDDD(#Uda=eV˭ʩgAAI&T^p""""""e)#U@va+a1tr+S]g\eBxQ FTUaɠإn*QӅmxeALf 4XbJ8\m3(x!Ւf2(PFbʭF@0(Rפj0> d7N$"""""@T?BdJmsVYPn eBx= Yy8q&,f2i jkDIϻBd֭gѢ> z)qq*7==LCӍCd``Rww4 A?*_&) IIm?!t{ٹsqb*s9ܾ4jԐ<~>Ν;{۱c'u1r1 Aǵ}Ť-{hAo3ީ谻}wS2b~WWK,XCDgИm۶wu],];w-Z4Wy#GJӦDDs瑓f׮,[^ٺMyǵߌ7iHLj0M;B^8P`lؕsFِlNv(]ӍUb3iljr1kl3rm Пys0?M6ec֭8NnF {Sٵk_#&&+~_BCCW/,_@2rcܯ=ٳvrh׮-/WjՊ}(#""""eTy`]El#g@L ]72ym{*yԍ$+[rW̘C"6eb5H&b-H-&Zj֠߷Xr92f2(<m-p8X"GU{U%_ZýYg`h| "B;nJBV|G1V/L&M-ٴi3=zUa6mZӦMkN'99IFfqWfZ+ZnIrr; `˖-lق:vU **hY'5B^A$bn ٜnk`"{`64 ">0p]?xAtd@Fp^ٺaAl]i$;Fy *49i|!lv7?ɤUXpȱ0.33pͶ|6QFe+kJi6 S'v@VՍj6{~!9V+N09;&XC 07%<<ܫ,""}>?t0?|(,,}ӵkvBff&/ݻˆ ظqg{AAA~~~~M\"'"""" T;ݥ%k3sYaA\Z?/(J3 }趄xZUcd( \^?3s89U/>f6ErUKT5wܙ'ګ*WJ55JqKXZxf5mÂicf._n6 rZLVVWYFF&gg[ZjI֭7o1qNNYl9ݻw#88d>X3;vT#K*f5JGsJBڶkT6 +6DNզON1ڵ9ёjw9غ8N֬YGvI:t.lh?,+vOfv~vMTT<^ļy3`@bccWx5k֔3?'1 uT~yC^ri#8,3(""""b22d0 ."88~W6l[6mÆ9e{Eq;z[' ݂ P<C'zy6Dl(ݧOpByUP:9ߟ',SNuAo@/.uQ_}|p5jN6OO?!ͦ~Fwq^Y,CG5}>6m"Ir:KOYv ~$3߯ђ%xuk͚Z%&&JQ{RS7GԪUKj2~]N{^{E1Yfj̘qP `hl>Ю][}7ZbnNTm4jH/O5oxU=g^|| ^j a$))>쓀!T"I%WǎoxBIr: YI䒋gmܸg;y1<:lr8@?OR'OjɒO_ju!mܸYc^ /I&k˖ :3|Y`tx_E_}]pA5nܸ{w{^ 4B$@=z텒{[]v,:@ڵ̙Y~F'ߡ^{EV=STT^{MMt,x]-Z(V~ٲOdR͛by뮻=LU\\ܩqci֬ڽ{wwV~%I'On7o·J!T؍7_-[)/ƏNdX/]=1 }7bۻᄏ}^]4~"M:gٺu5k֟sN9RƍWc\3Īo1-[ t:fZ=c 8 ,@%%%)))I;wRzÏ믑bQƍtm|n9@-Z4׾}ھjUJJw۷g]?{GQ.עE5fz5jDۦMoR#P.Ǐה)ScN]2MSRQ+-[tz=zTxWYGgxVӦIyyyڵ}^-[ g+}I5gfϞaÆW\1J~حݻW#G$O7'Rj؞Qƴ<<{{7m>r$=t@퓑uݿ\.N -@$ڷedZ=cQᰧH* lJrM^zry3.񒻪IaBan)aXx!Zݜ0 9.* 8.k6-1P !ժ|* jQ5) NG7n$uUO? $bٔ* dgf*ELCiðbj _T @(((PAANI1!si*|Ȑiěp8*^~[l 7^{JKKS֭ttw뭷O>?zϼnWoԕWӜ9O)))I_?^ ƍ۶mOX,jҤF+ÉTaWbp(==CM6b"@zzǩ`: &Νŋ?(LVV/@ah*^n׼ys}'&&z?hg5ym:_ٳjYgJM3oTg Qu ó>x\Nm*>>^_|QPgfט1W_zE-Z4̿=z.bNJza}t֢IvPVV(j#)#s~PĄ+%Is<.]:,i&yZ|E45l'`ۚ0F9BԺuk_z=@SvIELNuO󣢢Թsg__ٳWٳzuK*gbA̛ooK/k֬?+7DPrfZ}0???yϟ-Zhƌe;`y^/)&&FK~͛K?RƍdO={~cY=6L]wɷwdzرSС9 -[aLvv<aPPP);;XVYE7W@Dפe!g'No>jܸk͞Vg0.T/0W[Rv:BOgZvnIڵSBBz꩷.Z/55UIIIjݺϺ'ޢnݺJs/_۷k=ذTAAb?gc=*I)رW㏗ȑjܸgc!v8r8짞FܹK%Iw5U7o_ˆPlt0B\R $\Jg&Mp#xc]n)11AGV $4tRǏgP]ѲZmh C2$8'UЌ1\#F Сrrr; =A 7Wvv^9N5kL'ߦ3g)!!!`o@ׯW^=%Izӏ)5uC0Rx/nъщy≿ FL۷_s>^Mmp8ymF\԰aCnZJMMոqdmѢyaMtJSuSe4h@S5ԤIW轒㳋͏)uN:iӦ/ZN6D0?.KE6MNTR=tu3^qt^aa[U^UlQ IDAT1!IO=taÆzܹӧeLӠAuE<{>d?w|ŢzS^=jƇ9;$ԠA}I҉JO?;vjѢw=޹s΢gnVE_8m۞Ç+..1}vZ~ :X+WTrrhNpD'1%kXNqyZ$P.Y,\×_N1{bB,]Zl{A6]ڝ5kjw|ÇT-Ժuk?~\v]|L^_GѼy/(}g:tZl)IJJJ_:m۳t):35s,t%$$hٲw_|x7?!z7cN͘'NnҸ[ǜ{1Ƙ&x=V_0]15UW])+#Ge#I^{,C>222Զm[=lO`H^Eӽ{7lTԭNwϖbQcxFkj&YڸqfӴi^+$M|;Ҽysռo裳4w<=t묳ԓOF6m]_:0;|@pwM@ŮC^+հ=iyyrko|Hzj(l}?9sT.]ٸqN[{-L!M{P۷ׄ 7P,##CɭGPE_-0%s8) %9<*7=mzMCoo=6]etU3-bB`РZyebbbԡC{rԫW{lӦ=Ç+**J#G^Ƈ 1PGlBgF~}LuG~gddw Իڷog7OE S߾}pPc@1{`j,\.͟jirU_>R?<] & :&..NÇ_*Iڶm$iջz9T~UXXykԿ@3V*)IJKKVtM5`wifݼy. 4L\2Bg^+޽/{ッnIҮ]|V]y՚1cOggej =*=eee{oڴٳM7MW_}I!:ɓ$3o6me5cÚ7o23W^ܹ4s#Ŷ9c,%%5PƍifM2UTzվ};iUVkҤ۔^4ix}gY.-1-ZX3f<={g…r2e{uQ Ԏ;tӴuO :r駟ޗ$q-\4h;vj򕒤~BݺuՆ ?j駟i„񊏏{㍿رW)++[]t-YnqE>RM2Y/>Ԃ 5ytEO/{}^4_z ͚h{ըQuVڻ]qUj,uECVǎ8A1PGX,oN11Сz5kSn/g4M9$[X.>>d}jJC2O}Dk׮O?EעEW\I_SP7z՗h;0:w$I:|RS7H*#G}-[_Iґ#Gk$sNsѹ瞣l}W:p@,e5kz{[җ_~lm۶M #ݮ1}" 8@7r ,hm۳4x@-_RSޣ.]:{4tyJKK__=,K/$Mp[Bm޼EqqbE +u?㕐lMzwOժnQO=5G=4CzPFFl٪&Mhěz[Z|o'IZB@fΜ nPA~7A3f85kT>~oرSW͛_c\ 0a{F,^iߴȑcT޻YqF08qU݌ %' --M#G$}"5i҄J@{BIϦ$ߴ5-y-<3#8qBW_=6dq1-]LǎM7ݨؘ mg׮MprfvCX2`hYf8+fXoDs?yG6ndYYڽ{6m_~7okW=;wRӦMb@VmURw`6>k@I4h۷Sy?QM6lQ'Oe:tbbbs.m޼E]fE UftI͝;OSLlW^嗏К5ki&IҁuuWt}j:(z>O;w$hϵsNYV{9l^6mڤM6i3 }jsϑ$mݺUv֥^?_-ӥ+!!AF?_|5o 8@%ɓzԵkgmڴEÇ_-[pTT"T”nڰGOrif{6lQvXvcR||/__/$ٳGW]5F]4LrqС%IM6Q$Ik֬Urrk=JǎehuYg***JV}.IɓzU^=O'Ol,򋮼r┑O?L#G^f͚㏗뮑$Pll&NFN%EtZjÙ U(99Y99:zV4 x4iX0999VFFgyF<ݘڵkcڗaÆW*((PaaV23tjmׯl64nUjѢbSڷo8IO?Ν;Yfsef$E)) a4[-`7Ðu ~խ[W2yyyZb<l6fGEEyV\.ge֟?0 կ_sp:wTb 4uxg옲vi˖r\ZfNmŐetjMʖ$YVo^V}Beee*-}9BIRÆIڱcN<Ǐ:֭?_%IO [.2;׊UĘ!FiŕOc w^ݕY[T4nJ~~^|q>c%''믿ܹ/r*!!!`9ݮ!C?Ҽy~L &y4@VM/zkvVZIzHѯ ޑ$uAӼytԮ]A6l/_{AW SPܣ!Le#P.h`HJJzJEwJ .~LƨiAL v? e ZbbLI%|7wg/Vf/Lj1xl-a.I5:;;{b1 d@:̜ydve=.t.`v}=9ZY [F]F3 oٲS-a KN{R0@"Ju1U*[iz}=pi~p22cV64~Mھ}.=]vp|=k|edds/ر(N*P#ҏMvذa#O SuIݓR;mהdx?TiP m?͒w^~ VKK4bL$jRg !rr/^ubbbdZK\>;/-VJJwW7|֮]={,11޽w3bvנrI((p޸mێ+n "˺yO(Cl;QrF ˌױ~XʸYOM[3ʖmطg@RܯW_Y)X1.%Uе)¥"xss1>HwNxMm=(|CjBm d /-Q-T1hFoǻˑI`Q.JጻlNwI"}_12x @$3|t`\%kUSVTPF 2Ym=nHF),805Q[E6nI-c3 MP{S*8->l&U!qO bPj 㽬0,mYsY0"=jLiZP_0R{ D$)k^e. x ̸1F15ʱA~Kj%=v,*=`˖0 ˔lEɽV0/k|`6"=*F*yiK Um+6+r2T"V*nC] % f\@\A|Cڄ+ ec(Kt/Pաe5 *!\U@bW-z.IUQWeՀ(c-_VR/ulCEݘeMTrh^yB3^[ZWZZVڶu?Juo*)Q=ư8*_0F*ylݞQ"xDU0Ri+m/e6PBai K aĔNi݀ǥ@uOB l0YS{\!UQ02MY'fZx/+iY2,/kYUU\@.J-TRVʗ OU2 U)o' UV>V.f5W Tte @mSU݆l*#,a!\/;Ŭ}mPQUѢ ~T*F-C*ʬrf'"munp!n59,0"h{F5GubFرT ɬ! 8άa 2ae֒*#Uάr=@0_ͬ2u%(0W@e|xYW2T?p]$d?8Au@8Tu@hx!tJ/ d,— ,PK%"Px#h|pʚDIENDB`resources-1.9.1/data/resources/screenshots/8.png000066400000000000000000001673051510634446000217130ustar00rootroot00000000000000PNG  IHDRb6%gAMA asRGB, cHRMz&u0`:pQ< pHYs   IDATxw|en6] TP@Qr(EEyyYyb9)C@ B' m;#d݄M6y^,3H@dP1~lP"P^+™ ,PFL(*BH  WgCU2 X d ڮp.H_@P^UWXA J2QO;LTFm J\86:~ FI`oL d:$@MSOQ"p0F@MPmU;51(mCFaP =CV]:FI.Jַ)¹0jPa=iuS25!8r=.@$إ c}a^\t*?+&বVLu e]Vhx-5]eCתc21,&q9+ ::ק!niB djMS݂O(` `Rr$TL0AnkUſ2B/=CImRڴ225:.!QemRr`@mmGݲT^hJȷØTfS^+#?5l`n 5g;ڏ &>^26O1"JL+-L 6fE˜:TFl<9=N@UӁ)/D G LTeP!LiǙ*Ϙ`:-_I(Ly}zYVفK c*d֢`ZA_M;/.e@[jES`B%[e,kLjVTŠ@ blU.V9jS'1uv ,eRh'Pj+8dRgOdCnE2ԺV2 @m(,1K gŶ_d(b1M~4zK`㬦'8>aJV0KwG)ڟ@Tv9ÁZxU<ɨ[J ^L/fr]t:[;faAT{'NdtR@dX2 mYe[lxdn_e.QƄ#gHhXaZÔu{Pi-VL {96=y˖-D,x]KS^$5F$p)$WZ?0!SK.0ggA P=X--٫EZgd\TFNP֓2r҃T5YʴB[{psrrA Ppvi⼤_ك UJ۪O,NALEZ%dSw^.z$&&@-BT?rjذGmU"zBRYCeT]S1*aF}/3ߢPv$Sq-m rPuvuu\TjK'c( OIrj cz^ DNNIi{~b_@u2`T :w' 11| *Q cb7;vLenaoŋ}Y*z|W}H;vl'|&-bC g%nK2~ۓϿ~˲ ˲Dە-sT_ӧp'1boM6ڵ6oNSnnvLMk۶ Utc$I<7SP Y%05렭[7/>SWuzD]aʛ"yD)r͚|Lt A6oNSttf?Gł_~jРF͛Ӵi& <7oZF\.=otbƍiϞ9r8Ar8VTKNSYXͶ,[Gn\x<+3I~}f|ɧ#zuYBv[nM2_^S: xko7 6DNCG/IF6}1{vA@\.mLӔR||(bz=2M|~kD̠TVcTޖ踊@Ì$ѭ[7 >Uz4 eg焴m2 Tg{LޞT]dT`\-P1aeY^̙UPP&M>thmI'OԊ+%I|򩤊ݞ([ll90?Oh˘uvݰEr*LY͑j +|-mޜ&I˯̙uI_ںx֭[{n;Z@88իի }.WyKM bP|*OkOQHuk*\ϞQxP5lWT>/[7|饅OQ9rA I||^P||N<funKQLe1FUv`U: 2&bݧw^ uM=O9ugyZyyyJHHPV-%I+W~C?QC99-_Rw5IÇ? 1a_oLLCmS^>oLY iaa ycPo+ 6!_AmݺU.M6U}\n1a0 de H۶m$IeСZh|)I?<-/,H…讻&U|mذs]˿_N'N$%%%G /@ (sݡv[J=iծ\G-嵬A%wkɒԧ%je_sjө#I&_|ӧOsqjLoZ|7=3j߾$СCޟsZ7u!cU\.kG Iݻ=z(=rmڤH>tFF5y_Iu*IŞ駋ԯ__u=]j/Z0~a69꡾~i.^Iu$-ZDرj4}*}\ ݾb#ꄷeKUzᆟjݚ?JNNV}%^+-)IKkԹs#izp]5ƙ]{gT:h BϬsӦMzMx<>P{СCԭ[WG׍7ޠco83ڈ-@bYv-Wjڴj۶O=Ӛ2>_HǿƬDӫ&I柪~0fӦM \bVX 8@wu?SJJk=5f zUٙul$ 2!C[Qo]tir8[rA_ 4b0IRbb3_FzTZImKWъ+{n[nI}\Yo$lyRRR@D\K䓏B)SӔ)iJIIѓO>~N뮡AXQS It[yGߢ&Mh z'KVݻ);;[eY?Nr\ڵk.Dپyu=zg]Xkƌ}F3t ]x9svvEiЫ%F=uꔖ/_5k-whS+W~׻Eڼyrrr9Ꜽ|':_g;vƏԺQ6WVF%>3KLwy9Kp} "<(rfՐ!W++dHjj' 6Tgcǎ+.W&}OD8}]zꩩz2 Cr::u {͜9[ )iժ>CIR&Mt7hΜw}Gz4am:uowDĄuyyy:y2vRR֮]SG7W-^,ᢖ07ͿL*106Th5GypZ.bJ%'' EGGꫯRǎd۶6mڤE^z޻%@/Uu_)**JCVN+ՅLգZvԦM{2e>C @0Vb$+9krٛ|/Pg%%%{I[ձcb?Jh,RF֑K))%>a#=≠q|lRvғO>+Wi3 jR͛76յk9= zJIIQt)Ms4msڱcfxC'4}+˯$3<_S_ܻX?zŗt2mQ۶mU\fM%@zu鰭ԩzdA0kubԖB֯ߠ5kfF l٢K.X5UW RTTL]jݺ0i&E;wΝjӦ0iݺu cڶ{Yu֩AgH.z-ܤk)++Kv:}\YxaAP.'xt)}*vk}Oծ][IRjjiP*;Øͭ>je@' $߭8tD7nnݺ*#㐶l٪D'?iZ[8p@999ֱw^]wh\.5kL{Q\\bպu+-^7^?ܽ^l[2MSeii[}}4hP_GHnYF͚5W+>>^'+7yll\(M| CpSPb_SNںu:uꤹs?P#egȲlիP,֩SZ) @U3 uY[l)v $%'7Ԗ-[7$IQQQ qz<222tŽq׊d׮ݺ ӧ'r7ٳ֬Y!ChZ~$iԨA+77WWӧ>l٪QFr:"Pcv+>>>|򔝝]#UfP-1kAXP lV_r:j-}ub,˒Vvi;vL'ON!L 5 3gkԨ2>}Z}#IZn4amr:JKK+vt tv!tٹ3].K+]tVΩ$ۭ;wꫯ ;]c]s t_lyyyZtcXiii/4bplR ~ ?Ր!W{eYںumIKۢÇjѢ%\<j ׫I9F%1`}F9Lq%_E3M b}VI>PKefPT93rw^ ]sHM2kW ny/jS]*jS3oKۚLN=8[6l0!!Brtw):UIS@nI P!8k" BjcC+WK>y򔲲NV?(11QӦ=]i۶wۚ8q233:O~r,˫Y%&ӃR~N_}T115{Qm+5v}uVh\?Z-]Lz_j͚ZlF&MGSTT믿ֲe+8q IDATk-ǣ_V5iDLؑMꦛnԗ_~%K>SjjGMp>ڲe6m믿^VւKjfͷ|ᓓzjN1rݕG+iƌW˝wYRSSuС2ѡC{Y<Gosk-]T/oHݫ jҤ jժNܹiڵS7|K'ޡ;[Aӧh$ĉt?۝UhhŊz_iӦ:q"K~H+W~XݻO ~nZǏܹ_gZv9!j @dTrǙ~J}.vv|ҁ볲*P(qm6lK-0Y`Piĉ,_zJJJڵzJHx%Y%ma}oƕ.㮓-bLӐiV^8/[/oI+ԻwbW\qUNTOu21 #5%0zPyqh={^-1B!1B!N L䌕L$͖,ɕ,/NELXK!IfaW !1 ,w&wz|gjEN@b"  Bb"  Bb"  Bb"  Bb"  Bb"  Bb"  Bb"  Bb"  Bb"  BbkРvت;k.ŦM2Y;vlջΦ!!\{4wڼyV^_~Q:Moڴx1^R6G}c[ѣxB_F=nvت+iԨ{QZ\ׯokzN I_'xLWt啃Խ{w t QqwJOOСCCy۷|qIҾ}եKg]pŶٳرS{U߾}ꫯh Zt'A @ԥKag;@GRRRKPvvOEIIz뭷vcj̘tUGtmJ6lبq~,˲kVӦM|;vRRRk.t-x4 =أ/~NZ  I/߫;j͚MZ[{:r$iŊ3Z=jժt,Ir\N:J͛/+I;w̷=Η$iF+V,-m۶DV#Z,;;[m0 5iD75kTt)IGiܸt{nM8Ac\\};JLLg}>\fꫯ4$_l ÐTjǟ,6pPY/bn[6l$wQ6)2 CCѸqc%IW$ 2X]7Z~NrLR߾}t%K>ĉwꩧʲŶ{nIҠAW5i&ImZ-]LǏוW^=zpP"jj׮/De4 s۷kƌ7|w=rMjŊJII$WjҤ[l[3gRizYx<9<ƏU={…կ__%$$o{Z!hq%_7K JIi3dSprE}yyyr8hW -ZX 6TrrCEEEi={x!>}ZcNܙիZ8Ok|_Znv)׫کGJOO…o>ھ}_wѣرZj={jƌ7tUW^yUZ`SJM'71118$K]g`8Q %1 bJ. %agXu|S̰23󄢢hW4i+++7T˟kذk($Hv<ދBaoX~_.ڄ-ء/G}DyyyZx^Z4k uA lyWi[oW˲,m߾Co_͞: Vf͡ P z# AA@Y/. bhA#( ]dA{ZlЖCc-/@'#h !"J0Wr4Xޝ d4*|U$hVvQǷhUF\c B@B4h+yv}Z:se&P8du!G۫)^E?pv-fYɶ-I}&(IfÎRQIu|pR0l" .]2$)#ӲNzA" v-6>$# gL.F2 C*ll?\`Ph~Ϟ`>"aj.Gvsg͓B. A d8hOfεЬ{O>$GrѸϏQg|'G%/ W*v#e5g Cf <-P9{#G1#)gk@9v%W.OvQ9 ɒ}d:}aÐٴp=E9U +G2S]󼬼Zu.}r_3(#s4 3Ov1Yd{r>]C!ۛ/We{+]$9=1Ė_pY+cGʳkSP3ض$ٲ p*C!à,ALe}*֡u#]d&TTUYG2v,+'Yɥ} >VXYڽXFr^7y})`=m :`!iv1ۖOݵHC;{.-&lYQ'DW6]r 6yu|ofђ+AڎI*Uh9RaX2g}bKSUx%Ӳ)*X4e0(9?*ʶ%۶zUPP|yLX(Q 3ƕ|M/\4(1,>`볲N0ͶW>&ۓ#G1r4H݋U frX,1L,Õ;d#F%ÔNeHCFd"6 5-.ѰSeه `r'zy68plSJݶ; c-kZr0d&w j{k|]OWA,Uq5٠Td[nuhmĹ/#:^-ϖweZ'39UQ'/epaEHl%3o!aGy)OCvI_$g ˌI)2eZټv-.ܖ$^k)K~ SΎeDތUya.ffPT9sƒP\\]@%w+''G^WI %%%%iU=%y$yےö߰>7]~JZ!AkӅ;V+gU f)/d~,Y%*FLrС}@ɽfP^2tN-{Ec8K?ֲ(;XP+jdLS=_pɌo.#y.aHh%G1KaJvB3yYg=H9 '} +@o"ه7]HhQlO푝]v(*9YD8VBB-_"ĶӧO+??0 &UlJt%2C8RjpQIV C3]UۍΩ2 8B:'qMd$0@O J`c1 abccGaTGLk;O !+;#ێdOﯹ}JֹV-wۖ}jOI[ʜuZep% ! @ՉeY̶m9%$$PU,!!A'Vq1dy) $T{X Cm"bY)vYʠrUPLL4EPMDp?J]1B XW*bӿIrjr"pVzNȻ}䌕LP*V|S [xr .+m[mTC.K99m: &,>M93^Ppk!L]ĭIP~z!Zc~~OLD }0$Crg"|–,IKr{%/ A lN2 r^)C¸5 P(B.Go$b: oE@qNPOrfBDfB-IfBe: o&T!!!!!!!!'E>.KSLȑ#Ըq9r>h{iӦOuUCuԩhڲec' *D02en֠CIjܸn} o7::Z#G8mذJHHP "&'hݺA-ӫWO͘FSUhNرiYgM7nL2 b¨%LQ3y򝒤^^pѼ7v[1cwƍwA]voRΩah[_ jǎzꫯ%IGM7T/ٳ?֭֮߯][W\ɓT۶mt1͚5G3f!۶%IfΜ+ݻi?fuرmS7'O :@ERh)!Jv QӠ\P,G d1'dg7nL fܸ:|p 殻&iܸ]zuoVIڴIQÆ 5dpC??MW^9H=ҽޭ R _zG>WMOWBB}y߶ӦMt)͝;Oo9CM4Ç%IÆ atUK I\2d'zQ2%Ð}-#@ʵdMY1bP1;GiӞֿ3\Զm|111?si5ߞ;:_c۶yYy<ZZii[amٲU-ܬ ЬYs;J߯zGGYfkeٴivڥC7ޔTد7 TvIPGvG̕s=RAaB#%VZ#GhĈ3 6D999łv*66VO=,:cbmG}.((Pvv۝fIR.[oۧk)&&Fm۶iCsCoeԵkWUiQ1atQ5nHzԺu }J^g=r5n͙ƎPeo.HSs%͛@;E[֐!Wk͚ou.(@CF}4O>^3fs;\s=zwv/_~>]o :`Zhhbp1j% g3?WU4sѰİW:Yi~:!FGhB=CZ8''UT,KmqFZښ CRV~=r ÐiIIIZvUOII$İ7,/M8;åDqGL% X Mjj']wh>|X561R7֛oPzz~ߕ'jT#GQ:z"  Bb"  B72-r)@-bHy/)Y0rT `ؒS9 ON֤0};uAL93P*p5 w@!1B!1B!1B!1B!1B!1B!1B!1B!1B!1B!1B!1B!1B!1B!1B!1B!1B!N |-]gԉ1h$;,#WiRˡvyLO\ExSaO{e))sY0hZ,[@BFW(U7k(]GeˮiP[5R'#wqK+C+I&2dqJ:!!!!!!!! #g㤨gfwW89NP "JW" QDPhDџ=5Xao4PAWw8n׼[|>ΛO0(" h[`Bӂ9ɑr}"h9*lcbOd:-aeˑKyاĴ0GJ pTk@D A @jm_(4A Rhb, bĠb)MF-\.".ƈAdȕvR5(4A "cq-c.4"X+̓3wG^H[1& ݑp IDAT3xLi &D A @D A @D A @D A @D A @D A @D A @(OA @vUW*..Vdێ6nܨ3?QQQQ8@+WRIRΝUVqC\}b*IR޽t뭷ޡu1-(99Y$‹͓׈uq3nڰaC WQ b;>HqRajʕT**tWgdsN{z 6MLL.lƌ9U]c;z竵ұ~k.-^xΖ$]z%:u=^z>:̳l` | ~ie{҈#|},m۶M\pRSS4~%Z`vةO$)++K/գG{1JHH͛5kg*,,T޽tK23'_~[99;$IS>jՒ:H?$Ik׮Շ4ljAѣԯ_?j̙Xy<'xJ@@'p<kҥ۷M{C4t 4Pahժ9m -᫯7yN:K/׿nz|2Qu횩zF?F={UW]#kҤ( RK/DS>:WT":hAZvmߞ#]mݺUC駏/*I֭߷yfIիջwpsArZٽ{w[.Tڸq6n~oV?pqz=kQr]WOGs^xE9#O>*--UAALh~uu衇Y8Im͊SJJo?mڴI[ZZy3*5 z\rG%%eYYY޽[88G&+ĴeG|llHգǁZ7P60s,ٶ[)#z_~E`PիgW\\%K:w^y{R/uEVs1bbbb5ݺuСCϔt}^ wJNN ߲e,YnyH5׎%&&J }BB~|>f͚E4u(11Q> "̍ёGP(dYVuZZbbb$I+W>}k׮ݻΕiF㏫t!{nÍ|^: u횩8C'+}:Ϋ*۶vZy,Rbb?,~Ŋ5|p%$$5X.&}-bڱ|IRJJrxYjj>kq4|.|}Y@ ksg. qIxJJJaC֬Y/:ZksHx/R'p?K~:KׯסդIgW^^>xN88%%%@\׍x,7oVbblR,s~:KC'x/l|:fD'pJo,IZb4vںu>`_g <̬Oוϭ}5GHRjƈMc4} =b:$I#GI.ȑT1}mÏ<[eM'79;Oڴ|v캮kkRT,5[;LԹsڵv: <(<psv:[V#I˗P׮0j}>N88}wT(|TΝf6s\FaÆʲ,#gnK]CV2۷oo/F^zAO?=U+WTZZ9:t.tb| }GzGt]rJOO׳>G#'|P(fkٲo4jԱ1-Hs~IF(!+S<O<@DcѢEٳt}UNg.]+/p}ucƜ_|^e{\F4}jO8xMfϞ{W٣{O[rr2護 /3VFF+@;C믿օ^Tg„TVVk׆wQ^t7t=?e\y=szi9~ᒤΝ;~[{\j&MBwu͛ɓ{O>O=9de0̙~h}>WaV(8I~($TMQY%%%5Ֆ]tX?$ 4PC ֘1gP?ߢ_U%KV۾{n=s95k֪{nou-7kڴ7zOSBBGy,o>tp9s;o׍7QW\q^/G}9k,=Sz衇UPPE N"$%hg$7b‹ BQFfCIӉ'\+u֫ԧ!Zvƌ9Uz<~<^:3Nׂ 0xI}\iIzոqWۦo>zj֬ӏu]w(%%%~u%4uS?v͔$W'7^ܹ멧РAh|%%%uic+/s7Cs~g.] sUTT#s#1-("tPgq,oO/ݻ֭[.w>}qmJMMsS<}CӧЎ9$I]d(???IR߾}xu˖:9W_Y>EϿɓ$Iɚ21mܸQOW\ݻ~_m\pztҩڶm9qmzWuyק[o\wﮃ>Hw9|^ߘ}z+Ws#t % gC4~%zWT^^^_LZZwy|>K'_G}XO+~T)>>AՖ=IkMI'C믗Psv~;Є 7y_?NozmI͛ե~'G<qtq_ҟtccNho߯)@}N=7߬q\u :ɚ>m#s"NUΝ /'ڵtͷ [*W&$IJIInl޼;w*..>\{ӧԷoWfj^{ڲE{yyyՂ5yye?.RvI$LS^:^JJJ۱c-[VOnn6mڤnݺEgFFg]{mE#ÏYg[jK"nm[iK?hukL]vلjcԧgϞ65 :T˗/׳>~edj,3!!!bp6"D_N5m}bWeuIݺuSvƈ?צ駟֨GZ|lַ~={DnŊ<ڔӧGiذ?i:_T 3jH7ߢߞZ\J$k׮U~-;#~V7vBhGbu2 C'^iЮ]jw9 4P<֭[yչNN /J6nܨ:Hao>ڸ1rS\\Z#F}:9=4`1b:6|׭[,y233uiܸ_E]SO=E]fjc4v?~շ~ Ў0F NGRVV^y:חꪫOc[a/_zY*$]so̙{ol٪nc4moSO=^Ojݺu;B]z%*))7|/O?i~l=r͊__?R\\refvzX5^z)))h?UU\_U㹯ȑ5eJz,/Ι]וymʔkfc|պ@ 4HS<>]juYw}a2}JJJ,Y4@-ɩѓxUy*zUYձH:o&ڕ6œz)z՗5lPtuӗ_kv>R5f=.vI }23覛nTVVWڵK_|1Q3.5wyy:(|vI-I@5utI]VF%1QB%1QB%1QB%>:;s) !St  A!%1QB%1QB%1QB%1QB%1QB%1QB%>7) 7#NnJXK2 t>>)/7/7'vdmܥP@Yb*)g!WFȑ-(+$/'߆B F(tpd$9qbLWShƈA I]}}@ 79F uf: w\$dQ8q= ƚ~n) Ioa&waFqՠP 2KdiiaEfZ ^&4ijh#A5L<1~CD+7nصՅ0 {KE ! @w1heC0Jёd\&MK#LdTy af6y>a/b(U`}*[ø$:Չm$7 Ee$yO]Wk=W*aC͞'Im2 ;4k_ Z@pa*SLk X[˯kƚ~u]j Q\ӯ\7Hm/ ̀TPQ2t9;@@R0vz $ӧ 4- 5L͏BwcLS_{$i-y,f:!94Ʃbr!T1l9:k<}:n0-M|2ta_V>p Cҡ2-OV6hyںUZ9ᠣSgw,\ac+m+}YV(sqS,ڹ6hv]J rcahjZSi~u Uz˜ k45ԴUt J:ӧ3L"jʹ<E/Kqr?ahkKNygAޞnToHv+)W'$O?S'o(sZMWqlM^ʰ1P:ՏM<Ikh/LSK婬*m:.++eWg J@C7;Je7FbII Ð&h bccu)U4% 7MtFy7<4vI.Oc&2G8ByMY>vI!ƈiIg>]gZ﹊1*'iMԨnLk `GtPr(mI" iA[i}4 CĴ1-gϞ!Cmϧŋw^}]v[k>'|:zĈ;T^i^~[sdRokݺ駟c/AViif\ K/ 7>: j裏kΜ=I93g~znVoYvX?=ЃnҲep1Vjlb 0c{z&. :-/((`OӍ:S+33nO:tnF/SOMgZokucS4~8ƫ;mٲ% 6k$OC=sϽ@k׮xNwR~OݻwرW_eMwm۶飏fj˖\6Ilٲu>]3j?N:g: gmto.]~XoSaQw&Lk|i-YT~:KW\q6lmRP(|VQ\sNeggk͚=s]}Ktջݎ;uh\x6 ͛Eu-dffj۶CNN&M6o\k8ZpQxyr]35o|-Xr۶CVLLbcc=^۶ tՠAս{wIҙgi^դIkOuw*++K˖-V.]^CTmݪ'x,cG_…_jƌ5~8& @12TRRN}Js~7ߜSN99u]yW綎hʕ BezbccKjCW_ -^.Jչ>&&F]='jy_^yyy۷OxY^=/DޟsVecy0=?Yg0aj/U0FL+jELK1VVBB>3mݺM7Z_8>hfճgrzG_k}RRRxϟ#mۺ{iӦfkaa¯CorGZӧnEwٶ#+O>$]yz驚6?͛7{?Oz'- 12bjo'zJLLĉtꔮG}Xg_~*%%ڲ^{ڬO&FK.$mܸ1n3lP 6Tc^᳔@ .T4 EEL]jƌ9#<썺{"oŊ5d`M\xpRRRSURR^W9Xok)K/irӻwohʕ& ?) jњhӦ͍޲,=yӧЈuQGmڴIk׮S)?@֭)>>iij髯+;{c1/GOTaa/:n֭mSjjJqu9h nR_^7GB~ >\]6A7|ktaQYY] S~^x%ԩi|5X{jy|>{kF}Yǔ,~C_mw3<]3OV[{6Z'{&L/qw^T{ߟ!bz=[oA۷o_խޮ۷7f~k4cƻՖҔ) h^؟*jT|]ܪWq˪ڒ.JahȐdv|ZxƯEL [fzŋ4zի0Xo zO<^. }-bZu9SZD A @D A @0XoK)*`朮UWe57'YOΤHSATm *P-XԀ+hծ8-K$ H+VߡPL]stcSԂ}n<Ur3`TxD3AL tp"rr1AP1m~6hbРxR :&-X$U 4|o UZĸiko@{@ŚLj oS>ĠAqSkk(Im~] Ab}5&ƿMՏexRv  1FL30\eVضA 7=I[eϓBXn3SdJb#A-WeNˤ5O 6S?宩D?u1Wܭ)L܆1ĔĠ^>Wu)wLfiCtLƈv \"ƿO3HhbPx[2 O1+rn-OkwL%B <+>B$3Lj6]kkr`^h|slcwYQ)wMu \Ġ^+1!P|$(u񩬟2lW *&}`ALk*1nvW?AT@Gz%:gM y:I >G(`2P"-b#A7VcC "&oz~]C A srx7qc*=nWtM\\ЦĠ^VINPEܧt]ՏNJ)Gh.s7蚊`]a|B]nZT(Rʊ 2 4A kF#5DRTcS; bOm*1 -b2B|8bP1Sj f뢒pU* f SD'I P~I!PpeusM9*sL:džOL9JF㷕D$h+֪{$ϓB^81vhX`9 C2~veN&|hD7+n"9|N b\SŶ'JBKP [cDt w$TŎvԬcFkRzd Y]#rTBG bvO_]2eHQ=CIbRvCfMBDgL |g$2ה#CY?ed9%`+t YuϘT)kRQq~mSXw,.q"AD>WA7%r w1wom)=nSELkz+ԀTm)3&ȇ ; y[Ąm; >e"cqYJ!4] MM ⍾ϩw֤g(tM<¤رƈR?*ZŴfwN1JS!KbCq(!)k]"@$ >YNǙ5)rUZezC~lSIX'bB*p" 6,, jH˷@oLj :?8l$jALqTjiwSJfcض$I!2hW2 +TUG 8UI0%t;N$1I&`^3G)Q?NۓU C2cZX>,ņB63Yd ط ǫH߯)uT]]Csݱm) D\t3}u娬J7O{ƉVoQ?宩V*%`ĩhSԅ{/AGD0CפV7=]gn:tcg :tMr uIGAaWRzº :[eH >WevE9ٖ b)bZPflұ diSi@ݝO\Ccĸb2FLJ\MϜTW=SI֩T Cb b)bZGbIR9plOќ KCҋzgM y!H9Z:vcZפJRaЧL&@ĴmJםG"]w&-ݙkhT|Xv7rkk*lbRʽҐN1]?NYL%Rx3c$,e0k4AL \ЇttPr2@ovIctA[ZBN]\S?sR`Tj51J-bRv2*<F"ia%1zsfoKQE*( (͊)#1ƉkRmSTY?n l`$=V]ݓ)bZAvI6Zt -M6iaLֵ8UQN;*qv~]S 4kR/ C=  &jPjQL+]Gm7hBmןZyJxQ(AP\蚒wTZ3q,sT?jWw5Eh(+-8z'ֹbyz}9MOGg!k)޳nSZOskK5M'mS)[mqRHSfJN}t 8dպ bb kQsz}9M%1*uLI!KOں99):. mf,WF }ELvz]MF~=SfoVSk1h1{ \Xm~tk/JZ#I3!T%hֶTطu(\݆/g(׾[LO~ӫ3( J=ʠbks]Cg0ߖUToSd^h=(E}KbtJV,7<.Tcꧢ:ɮc1ڔXEwk1JhEAOT1IkE\EITh^,iĨG6UWtQl[J.q!v5G(_COr[mRϭ5kRAR@!Ц‎H+ւIJ;vݹ{lױ)wޥ¯{%i`ZLU PIC7ŵ]ȮIkbuxj]~^OϘsuYoSϮRgpQ5XS ziVpf2ث"\-ؑVeUkUqq^?h>Ӯ]p"*1=ptsl-ڑEFc]CnKՁ ILUo. (gt P/VFz&ꃷhbmz}CF ӹp;a*jJ<I?osu}u*E03wǰ#WeT࢘@U+b<!ZĄ4n++ALz q[i[)d{,Tvzxv*ڽ|*-yv\GHscC- B WǔI=".(>&XQFse"+rAdn ؑEÝ<{ ==?n<` p"^ܥ!p5!Qab>x^iGcxmLKL˳xHa AgtxJVV vo X9V:0d =0V:.kYN\fV`ξ` IDATh|AǷ*B۫C_g|av;nt҅#HK;ٿp!nz6oNe͚5X, x_UVa˖-c:@DDDDDAp85+䗹U\'aWd[]lv0m +px1'.wDPqiJ=ɎmUN%'p L`AZ$K-v8͢r^i0.VgTidnPS3Sp,kЫ~jN8`Я{+#oƍ:98"Ʊ4Mk6Egn^Yjժz[6VZj9r,5kF&8skb:uj3e ՠAqq0a"W]u%>|3wr{o<`=:XDDDDĈHHyyy|:^l^vv6QQQAeѬ][ҰaC*TÇپ}; 4 &R سg)))'Ԛ$''7Њ%3Dw夤,B0nFZh4lؐ &Odd$ ph."##8|8Gz7n5kұcG1 xvLuV*Э[WéP!Sre6o @˖-kZ<oIc|N'۷ w׮݄ѢEsUn]ۼ^/okKl84iBDDDDL-bDDOKOOg+HZZӦ}u={0M۷o -- Cj:֬YC auםlv/)nj*\҅{0ؽ{7SLѣ[ڵkӿnnի|lْJ߾yYtY Lx+]{n֭[x9srexzl޼YÈȟbǙ.\f)TVQ0yȴK."##S{_ c94MT]z%呔rv0Xߎ*QQQ,nxo&6 MSyS QVt$fym&c~0 iԨQи3"""""&c&IIt|1]wy`۶m) bDDD پ}{`lI""""""""SDA) FDDDDDDDQ#"""""""r(9EĈHL'RjՠrO _~ILLtjӦ5}e)<ЃX,I:t0cƼ_|ƌo8q|ɓ'ү߽'}}Cׯo_=^,{rȊ,^ȬY?WFu|uΝǀgySLf)W^yE&LGթSŋy!A11$'/e˖:)EDD䬤 FDD[nԪU+_|=BJ1m 4bԨwٴi{?o6r3C<^lŴl([.UVQFDEE]őE~~>ffݺug>fDԩ}߿?n;{xG[og}Io~|t^~t-~oT@|||Py۶ma͚5:1EDD䬤 FDDJp ѹs,^^{-[`BzYnV*Ue˰X,h"}ΝdffҶm #$ 5j4˗8s\\}zѣAwNŊ wlBbb/ wyѡ[?חѣ0eWneʔ3~en ZFG||[.])"""g%1""R޽b̛ky:gǎ[>PEbb;w zlٲ4iӦuPyNN.VjϢE,^$j |^'ӧO 8J@≡8v^}%.ǂ[XVl5r ;w7`ǎie ;=wyłO ''72ԩ_3dl۶5kҾ};rdڷoχ[=[L۷/8HjV""" FDD-͚5ꫯK;PNNʣ" E ϑ{o yjj<-ZQF^lپ}m|۷;vYիf-uwO> .h@_'=nw|mxlݺX%b8Dƪ{x<>i<4k֔:pc2xPRR>ywEݺumw5Ju}]""*Fb}Ŗ_f-yyylْm_vԭǷ%>-~:^'4FSV-Z>}&)i!II >kf̘[M'%%GÆ H& 8gy ͞={x<\ydddaƐO۶m֛LBB±gܐT. zl)Tm۶G͚5ؿQFuV\.5jڵO8pIyj{%o>ڵkK/$vtWQl@7='''c&7x:?Y |,];ʕ\uՕűxƇ)f՛޽C<۶mW4k֔W_}ԭ,u~G %hQ7ܓ>}zS~=*|r(?:B|1mڴnj@%K]i@:k4i#ڵkѢE@TV99L9Çs狩Q]w-7N:ТEs>t,W]u%UҮ];ZlIjj*=zݯ ^q\.={}Ν[l?DzÒ%K1{|^~_4nܘs2eT:yg^l?eu~zw_?JOJ\vY7-K duJj@ *&H1n͛ ?V/ ?>^{FbbÇ#եjժԫWNvVO?,<cϞ?2s%~-[vuu:rW СRW;vGc.8+j=G#'caƌ=zL`c)>O !&&70h`o^bv*:̲ex<[Ӱ>8Ӆ,ʊ> eEKm$"rN#oNzwУTTuϑu$~ k9pdڶmo6}SO=i,_rssUA"""7\Dv+9f͚ͬYU"""R&nw>nD]NpnVFx3#9y! 9s#Fȉz'+ϋO>ٳ !!,֮#GWqر#of͚C2p /s=ýN?S"at:?.""""iBNN&N:rA }=ȗ_Naddd͛)w߃ crrrU$$ڷO`$%%Ӯ]Bdr]xa@kÇ~GF^w˯rͷ3eT|t!u}fAtvk֬ /zΚ5k Dݹ[ x{xooҾbbb;#v]wGy>zfͦ}Nb?b۶ՇQ^]{?A>_? odgRDDDDNrss]5@`RJh e7oNѣ;>8iii} gbbA:u&9y è\^/0>̉hР/ *&QddUXXs7<< ,`ʔσ>EH3{@={D\\}6m @JrkVX?̤]&MŽã>>|[o&9y1wqw_ O>M.V3n|;{kZ3̞#m]g)χb!;;GDD)"o XbQ s^Ss9/d]|\;aвe ~?-Z4gsO> EQF*f$$$ػw۷o>}zヂkc{lHCedd\.RRRSRs-= )6䟟ԪU   cĈ72. 6ТEsC;w1i2f͚ۖÇu붠VB}VbL撟Oxx9Ɏ#;;_ C!NAɪX7ѿ[2>`t`lt2iG%Ѿ}%}R[nRS[f-m>)6Fѝc?-u*4}'%vl-K_J'asDJ? ?4$;ۆncَܯ9vxؽ{k׮KA]:u/5ZKN׮]40iկ_/p*S0 d|dg٪ reb HR@A)0| W_ݽ\ןO?Ivv6*PZjaXu9U֬YwǒpnF. \Ə?!5u+_܉;Rn''''Wټ96mZ3| L _|%wy?,&|NTT$= ;w 1˺ѪElڴ Y:ng'^CbJ.]BNOc?]cGa` Ssn)7o&--5k@UVV1]NQFeK*}Ê+˖-<3A{,yiVŽ;yo8p O?'Ov3{/[u|d5kzm:SC/%ʴ`SyEALyX0]yʼ `Նq4GaW5vBs )r\N'ϗc猈D-bʓUy$\a_PQ0 3""""""e U{\. GPqporl8]`JpW㼈RZl݁vDDDDDD@AH)nnǰU""""""e F4'ĔİwDDDDDD,t$R nNǁ`"FDDDDD,, `w.Jsh.V04q/5U"cM-bJ#y1TO""""""ǥ F yG:0,^JAH L #?fU#W]DDDDDD@AH LՑH()u,dM=B SaHY()poPÁ1""""""ǥ F ƈ) nc8TG""""""ǣ F$'7ū 8XwMSMB@9T"MTSbbbX$1,''իW;#ILL:kmԨTVGSEDDD䬠1"! l L`*:m߾M6&%0nXڷow6o^W^|o3gv= yĄ`:uM:=c\stt ֭jCrzZΟ4 }ڹ""""rP#pbO>Lݚ9d?y5FYȑ#|T.B^}ؼy=Æ=˺uh۶ 6{sgv̙3GIWhҹL%V-端uVA{E-r22z{4h?gl޼>}z3}׬Yƍ/Z/?o-߳獁7x~;իW0wl֭[>/g/n:(DDDDQ#2dpax!ݩJ)Uguǎ7ܓK/M6ψoトfѢD*UaȐy7۷֭[1nXU6ctҙ5kֲy*sbcc3t`jԨΦM_ [|K. M{bĈ7i dr}3f(ƍK.U4mڄ1cާE:(DDDD`"!NdyGqN?zby ӧ7ɋrUqA6mBЯ߃ߖ/=gԨdff^O?@ll,v FfРGp8|T^}u|r(z g?| dUСOm۶beZy'6̙3ʸqcС=]tÄc&O<4{嫯I:0DDDDѕH1BC=בh5dtN z~po="lѢ$<ݻ.]ƾ}V*Z] ={6$&&ѣ4lp뭷p뭷g\\?03”U͚5]xb4i2[ϼy~:/_Ɍ߳jj """"rJ( pdyS(P ῝^/k׮#;;5k2v'ڵ;h;ay]m+tL7:g89[3>C֑O]6+ǫ)#{[]Z3șiݺ|Lwc?bŊju}7 6Rz}[ԩS(:jԨR^Z#GХKg|>ӧW:Bff&~1|2.h{bذ9rIIвe ˈ##<<뮻q~SB-bDBq0 Ŵ:T/.f:®:: $FϡC$$sP:;'xزO>  *r-bz…hҤ1%dR+V^/C<ڵ눎y C.'xؼy :n:̘wٛ#G{n/JӦM+رc/0>-""""Z48t2K EmE^rI^ :z@im;K#c7܁wF;xq0Oǒs?[za캋)Qzu,@]ٻw*EDDDD$**ŭ |EBz^A*3C.I 1"0 t1< 9pIpcՑHĈ`  G!C[RĈpbxxi"LHf/rfۻw/ 6QEZĈ`:BS= Xm#U""""""Q#R쬰BMYh*Oa.9U" # budj5$"""""r< bD0NLw~1AudwBgS#"""""R1"EWp$y*)TGAǃPFAHAAN 7TR))"&8d0^Pk?8VCxpnDDDDDDJ F < b 18ULZ JAHQ'xtM0uG邢-b<^P$R))tCBLvSpj51""""""ǡ F( `Gf.tB h)]<^ ÉQl^mR()t] 6 N;81|}RV!C:;xB1``e_&H0 00 Յ F(Û_jRY1 {^^;LjLftu|>ՂncZ1 `9&vb, FÁPŴ:J;߾x|+9c|>V++t:T!""""0a,v '''׋ŢAu@ax$|gt:V#"""r 8cB~SU (v|15kab^ ΗcٷcV_Z~œp1ògơi݆a6۱4,7$?WPU$m'c{NU?t oVkc  {=%5#p&i*99rrr1Mugс/Y^̘ʘi=;.O*{˓c-V|ѕn6QxČkmY"[+ժƟcĺ{;⡔%+oͺdlI9d= #ш'y٫I蚤NL.*+(_`ZdV%t[/rJO?~~̦iUW38pr^"%eq+xC5_i4~Ph>eEKmWDK!?1xc<#ySoݺu+*66 .htҷr`Mr7u7l hE{SFu|"""r\tsR>nxyg$:t/Lkݺ5aaSĜJEQDDDtfƈrݬ^n(kذ:ubŊ>|_~þ};o{HJJ\{ԬY'G.G{n̙Kff& 6e˖T^>iӦ /I oNh{JzҶ۸hQ"UTk&<M6ѰaF~ږ޻*6cҤ/;UF j#""%X,Jgox<|$\.n IƬY{dRڶmKdd$c݁7lHn]ILLnSV-~A)5عsq;33/m׊+9zM6HDDDD(M0Cұl4mڄ[oqzԩ#M4!77 , A˖-h֬YjR[ݻ #**Uk.B;;;?(iӦ4k+/h`p8tH1""r\UVӶmTpаaC&LH~~>4hWeggy~-6aL<=ժUcƍ'-wzuvƈcaPn]"""]4 I킖wTRx` 4i҄5jPNmn6,Yڰa#7Nl޼儷x]v"""""e1""R>}`>222Y}lIo{,]&M^pB jժ/a۶m4k֔`OIOOgq啗SbE222ahDDgOxJ{mWaEQDDDD,Ӱ>8Ӆ,ʊ> 9T.""""4/tDβsVwR:y:v?1]ϋ/>OVVSO=oҥKeܹOKbϞL4SiӚ꣊sBv*ADs駟4i2[ly  _=)S 5u+Xyg>%=s&b:DtJ48:riիWgeA,]FTرc-Z4A4ܹJsbh^RફSl6:v@1}瓙E^׬YST-e›ocnݚQWyA]DD$$j*#Gb0id,XXfԯ2qmƚ5ki߾}yXg+V; ""I&0l%IDDDD bDD${gnK/7ҨQ#{lg>` Vݻw#x,uCaΜlܸ#ߡa̞ o*_DDDDY bDDCg~OcL4l<DDT$---޽J\Ӻu+zCw^} Ӿ};k'9IcĜfd֬[9vA幹9l6\.7='''c&7x:?0oQ+V_zGR~}VXaݺusZĜ-Z49-"rfy۶mN< ~m`ٲe ٤reqUWҷ}%{RRsN., 7槟~sߤr*VXlY3b_ϨV*&+V>vLyyqRjoI7o~X`}(U~1SNʣ2e?>Cgr]}HK;P޸qcdcL6)S@9͆ ;?ܟCˡC=ƌowgCa y|T+Hʞe$lb [Zj}~[}Y}R\ZbQ@)IF?BdL6I>k^sw=w/Sz i!I[/W-_T6}MeĴfμ:9z4wUWWg)w$ka͝;OuE_\C_~URS5z:e]4ZGREE23>W<bjذ'L}OGEEjѢtPxU/'|Ɨ8 O֜9/iΜczkzkOܸ:O]' ubO$=ڵk:^xMڢ &66V'N@x[t2IRnnt=w b5su Puu$颋FiϞo4lX"U\\=Jp8Z^GqU6zh}"iԨQn壔^gx͛>?z4fLbpB Iѣ1-\@˗:xIҸqjѢo\ 'Vc'44T?-Z?^{Fp}֌WW;]/SO= Z#䤵||F(<chR>6 ƍ_@&\v2˗롇TnAeeUbź֛%Մҕxyaݧj=zNQlk4r?]33[oļ; Ӌ/>/ժ#GhyoVIII};nW@@.hRS$Iiz'ԳgÒ^j>}Z iG̓O`P~}c?9Գ^RP.Ç_8paW͑0Tz7ꔇOޮE⋕z2M2Yo6_p@tA۶m״iS]vyYO6,A:vY רQGK%I'NPnA=JGҿU}CzտwX饗^kOWg?eF۳9rT'&+''WQQڰKlf!icm=4Ӯ]+\eq:rZz>|kxw6mZiۧԶm5kLySjjL|f~69"IRHHzxp-Grթ_{ YuۯU>v%ڹsgǵbJM:E99Z~N>,1m&:tH?<[v{ݯD~誳}͞ʕ'hʔIzGoZZ}m޼5T*''W'Nhs93|PLL/u:trss)ݮ}o֭[^z﫳}yy*++5}4XRyy$I'NeWffۯmo3O|S%%%1J|=zԿtw3/7b: ?iQLL?Y֭wyt:#)::Z+W`M0l߾Cv0gWjedl /̑TQQ~_'?.egwՈiӦ;$͝yA?[_={iz≧ a$cڵk4M,Y<_k.[=m?'NvNw111/Tdd{Iڵk#._U\|J7x NxNYY{i ?QPP"tt4MK=.0>ɶRzђ^~˦۲޻^ne2冘uiW̙kΜ6Ywժ4X'зy 5jHpVbkS)M6U^:uJV} _InZkh$j&u箮5&14 ŜsNO)v1j ȴq 1NUNa҂d5 M0m9Cmՠ1t+$ysHs@ø j͛Jz@# h'1 Mf,IGi&=zE;~iի'Uu]ڸ+wHg\\J[vb zwtd5t͚5K-VAAY/ѣG[8uM7hTXRJJJ 7҂p{۹g\`;v 1>}Z۷jt$I ҤI W~~֬YSNI q.UXX>>\Zz> M>MPii2224l0-\tUUU}pϿБ#G߸q*#cnMuZZ]wi񊈈PQQV^G*((H{6mZGT@@vإ-[H5i$ iJ|֯ I ԩS'ݡ[*==C\9dq ukɒt?G}㒤 .@ Cd|8ϲ4~8I5Pr.]#Gh̘$]{ ӧiU\\q.U||vSgSLԫP]ur8p>`> =JSNт;kӦF6Mcǎڵ딗Ç˧swyW֛uT234tPYV[2 C7|hʔɒ_t㍳T\\o=:7(00Pǎ;$IS||+9xef  0Y/g bQBP޽CeT+22Ri0={0 mujj!ZnJJJs:u?޳w^qZ})88XvEGG͒*mݚaÆIvة>\NSPttVa×*++ӿ:d;feU||^5}t,44TUr: ȑ#4|pzժ:uJ|ƌIWLW^^֯ߠW`9Wʊ|^eekpj u dƏUTTXoGI}KJJ*Iɓbb1,ө ۘ|(**J:ts#,!!A$)==C֭Z7;;G9l4i&M?q`>}ZqVǕ{PÇsjuלd*>>^zVUG*-a3udܹ[v$]yjͱZ- u8AAALUVV5zi޽{k^%t1rjoh5GiN"88X C5v%%IY曔WV4n8-ZX={Ќ3x>}ZUU Oݮhd^F!!!1B_nQu]lJJJTTTԯ__FMϘ {IMTrXRKqFzŐa:s5x`8qBCY2ebBBBt 3zZWXUڮ^zfnK4iDEFFhժ| V87FХy睒J֢Eu IRaaVX/WDD~9N?~B{՝w@aرcZjM\JӧOT۷А!C}EEEJNqnw(;;[K,PnA}}]r:JMMSBPNS999瞻dٔMYjtW(99YqmfZM:E<#9NmݚZ/ ]sպ[;JÇי]3Xv/yj׾]z,<N8e[qqybbbZt!0P^Yaawt:ebbzu㎋_EgK/m5z޽ Ð}-%%94%9=MewmL/e 1[0'ORyye4jS2ͦ^zW^uu amۮɓ')11Q!۷ބ]رhĈ jjUWWEFbHC݇%}&}&ݐ&h1 vBsh˖~֩7skÆz>}Z}?kUezٲXu4y$mܸ^ug"##L/4GtG"jW{VUUnuʋ]7xzI= JMMURR{Y]>/i޽_ r[jjĈJKKw'%%b(11g$%%jٲOpk1Ǐ{ݚ7}"Iҁ x bjEDj}z /<\uʴ{%%%*&vڭ1c bzyf.C^G5>00P}QjjZ4~m3nܥZv]e))UQQ1c߼y]njIҷ~e˖թbeeuEFF O;ӧ"""kv*1J*:UAna^ٿ?W~@W|9rk1cY))={HukLtm{wi͚oUb\Xt(WWVV,~Q_A=lx/^L#GjtweP:U\ WcN91Ba())Q))u`>Ě2/H˗ s.n1-ZE޽[r*Iҫp+ZϿ:uT}+88^yTTWWW+##CIII*..VDDk͛7k̘$mݚzf~-uϯĉ C#4nOMB\sfͺI'NWII9ZoC0`@ݿ,{>)p<1c$iT3̘1IJJJT~~~G1~_kS6tPvk ;vLiRS4ydל/tc^oZ))[4rMpRRR\7oQuU3A \=1J 4Pzn|W4?ԩS4h@+7ޒ$kܗ4su?Quu{w:t.t~ɓ^c߾}*--s)effjʔ14#տ$S_\=o]HқoΗi'W=Grss%I4hzT󤥇~T?zWT^^?ռy4xij˖-ڳ:RR6kذaڲe+ 3Xv/yj׾]z,<N8e[qqI$cbbZt!0P^Yaawt:eGHa^4]DEE)=}hIvI/?MINemYn_r[/2KrC:o&vBNb A @;!h'1 vBNbډ&ĉ4Gb ;眞4*(8N#tS Mh']11pN:{CN#vҙ%s7db8-iI٘'h ;%1~ݛƚSJGS2bjWRbW6: 1ΚtN5v%ٳJK˴gmٲUNSAAAzKs{ :sU]mWvv6nJg85RK|̗s['n@5۵ 9jҤIZf:HMpZ/9::Z7tnMՊ+Dp,-Xl}l\k7OwHTQQKnUppLÇk X,JI٢tI5HƏi5:zth׮] '@ӧOTZZ 6L ~ I4h&MJVXXfZ:u1w22iTW٪Uuuת~:uD7|^{u_y*,,Ԗ-[]GW/Hah}ڰKvq.հaݻwkÆ/2Ϙ@RϞ=%Vee[OKbQTT7Gk„fiرZv{E\iʔr:z׵dG5jnttrb{Eҵ~q_{|S|(;;G'OTyy:+Viyڷo>|7RXX&LL7Xһᄃ7|Kի_(2K0f\ce4%$$Deeͩ&á#GرEGGnk`UW4}v)ժChݺur8*))Ν;]uj=:r$iT+22.kx*>>^ԯ__X Cw>>|XM˖- ƍ_\v]6}ڟP``TUU?B}dzu 1^9NYV@'pԥRQQ&9NUWWvY)!!A*..Ѧt,á brxxFÇʬVBCC O=noÖjeeլY3n:++ks =u;OTY5m۶kƌ+,ms~_6:['0FK.嫮&:ɓ2 C}C]AA[Xf׻ᄃ*EFF*.n׺Z_VV [=Ç)%eskF۷PNN UUUXŹ)++SttT"##1Vzz1g(==C!4bm۶/@}˷B]Ul6RӔ$taxy;۶K]}U~~+0iaHa(((Hc^`=ݮhdYVkĈ ]33s=WԿ?|MX)⋔0EEE˧***JyyyzYYYJNdsy0 %&&jƌ>c=7ndƌIɓ$I#GUW͐jUu]v 2 C"u5.Ӝ*ه{BbzvRuu\uuh6%áK/={\w[67.9)!ahW\ӧiUVVwhȐ!BXRӧ_k r:JQQ>p'hܸ֒%K ڻw.l|^65}4EDD@}yؽ{BCCtʡ@ IDATf Б#GzI7d_~zZ9ڵk_&VE#!*ih4YR^fRnE5A̫v9`̘K?0 #MfSm4Z"vk `-t:ebb:{tiѢmŢzPm ˷; RPPKd?vyez)˵:7: ߀E;W'Xzm67iv]ŧX#T! :ɓ'Kj*((HFp=%jȑ?LAl67&tvؽ~312 i߾Zv]nrlzOIh/ݹGbQxxɌ-0ժ+ƽG[g yɣL1Nydj\ū88v]EE TPP)IAAA2xvT*ALC!LmbfQd̙Ç}nZ I{UU1!(f* ߼=\<{x{)k$]O-Թ'O;RZZ$$$AppNkIII/LܱPm4wUS]ͩyQ]mҞ 6*xov.?WýaL꺿aԤ84 KB;nMt6BCCeY?H}Qu'uWv/~[&it GUycyk_͛7]k3dZ lVf[<۽y={C5{Fh/6>ڽz̲kFNYvݨRCx|u=z֬;ԧOoeggk޼W%Izn9s&I9zyԻwoeghr*[ꏯX,g@x銿~O]PGT;ά3,{v[s_zH~04TjvGs_ e''9<\mҞ3A>,,4tv]vuSUWOT>ۧdO֞={nAm+ׁ$I7xzI= JMMURR{Y]F" Ðjjfj;i fAIIIqx,׆/ .o=c|Z}h l[# ^zjz>M)cK2FᠠAAAVKaX  wifu6 ###z7|>cl$}R9B70S/tHR主UZZRdd^/Xs9G?<[iii|Y@U]]-0d]G4Ud9sgEEEJV֞!H=`כzxO[*mﶌkxP$:}Ȓ$2ãnCcv>khX'9C y+}ߍ}ÒT{bXoÒ Y;ƦzXܖ =-@ !tF !RP.{03x|dt#6hF+}ȑ"C<Ùںv}7$ⱽ{/9{{goLC!98֘?6h5mgQ[Yfkx)ohRmYcÐ@=ry٦9y*]l=&56TQy<{.{ bj6d 3i,}]Sa\0pz9MۅGTouח2z|s5'ISsʷaHMm2^_0=Q䷡^2xǢi^޳nScNCFCCj5 Lih>b1X4Y =slΝPБZ\Kc2 v6 m+ h0ƐoC|^di#4d{㹿QУm$['M?[纆vRS6T3s^ Goj)=eoe a;Ncg: ncCm]cܟOf JS oj(Б=v p5V%a0?Eg}PcaHsrsl럕m0۶m;7@gԐoڦCC-"4Tlr1y, }Mcn[Ӝ3m/]s6ZGmx[w6Lc|9OZf 4$ `NtdaLc}Thm @[51<-r!yƶilPS44G @[j,0}Kb穉WhNےЦ2o=^5Tf/Z[EGF+o,ijRsz745䧱MlAr,VP{4wؓja;M 1j\86YuRc-']Mk 2`q'h|}‘^V:M1[y JFavÇzF3@gycJl#_XaLSuutfl5'!FmknK+8ZvRsӒnwmhK- Mo$m}Kbb6BdZFis@aRl m==\h9l5?/th}Уi5f;G댡B{=:m2[:k`tnҶH86o{]t::s]!0hInR`Ft8]uhWfvUCvՙ]\W f3緙+29Vn9_P.'] :N2?8Am@{0iEЁ654_|D@.-@@~?O  vIENDB`resources-1.9.1/data/resources/style.css000066400000000000000000000007321510634446000203360ustar00rootroot00000000000000progressbar.slim > trough, progressbar.slim > trough > progress { min-height: 4px; } .resources-columnview { background-color: @window_bg_color; } .bubble { background-color: alpha(currentColor, 0.08); min-width: 32px; min-height: 32px; border-radius: 50%; } .big-bubble { background-color: alpha(currentColor, 0.08); min-width: 128px; min-height: 128px; border-radius: 50%; } .small-graph { border-radius: 4px; } .graph { border-radius: 8px; } resources-1.9.1/data/resources/ui/000077500000000000000000000000001510634446000170775ustar00rootroot00000000000000resources-1.9.1/data/resources/ui/dialogs/000077500000000000000000000000001510634446000205215ustar00rootroot00000000000000resources-1.9.1/data/resources/ui/dialogs/app_dialog.ui000066400000000000000000000255551510634446000231730ustar00rootroot00000000000000 resources-1.9.1/data/resources/ui/dialogs/process_dialog.ui000066400000000000000000000303241510634446000240570ustar00rootroot00000000000000 resources-1.9.1/data/resources/ui/dialogs/process_options_dialog.ui000066400000000000000000000146561510634446000256440ustar00rootroot00000000000000 resources-1.9.1/data/resources/ui/dialogs/settings_dialog.ui000066400000000000000000000356541510634446000242540ustar00rootroot00000000000000 resources-1.9.1/data/resources/ui/pages/000077500000000000000000000000001510634446000201765ustar00rootroot00000000000000resources-1.9.1/data/resources/ui/pages/applications.ui000066400000000000000000000104401510634446000232220ustar00rootroot00000000000000

Kill App applications.kill-app Halt App applications.halt-app Continue App applications.continue-app
End App applications.context-end-app Kill App applications.context-kill-app Halt App applications.context-halt-app Continue App applications.context-continue-app
Information applications.context-information
resources-1.9.1/data/resources/ui/pages/battery.ui000066400000000000000000000112401510634446000222050ustar00rootroot00000000000000 resources-1.9.1/data/resources/ui/pages/cpu.ui000066400000000000000000000162251510634446000213320ustar00rootroot00000000000000 resources-1.9.1/data/resources/ui/pages/drive.ui000066400000000000000000000123571510634446000216560ustar00rootroot00000000000000 resources-1.9.1/data/resources/ui/pages/gpu.ui000066400000000000000000000134021510634446000213300ustar00rootroot00000000000000 resources-1.9.1/data/resources/ui/pages/memory.ui000066400000000000000000000110411510634446000220420ustar00rootroot00000000000000 resources-1.9.1/data/resources/ui/pages/network.ui000066400000000000000000000127671510634446000222430ustar00rootroot00000000000000 resources-1.9.1/data/resources/ui/pages/npu.ui000066400000000000000000000127451510634446000213500ustar00rootroot00000000000000 resources-1.9.1/data/resources/ui/pages/processes.ui000066400000000000000000000152601510634446000225470ustar00rootroot00000000000000
Kill Process processes.kill-process Halt Process processes.halt-process Continue Process processes.continue-process
Kill Processes processes.kill-process Halt Processes processes.halt-process Continue Processes processes.continue-process
End Process processes.context-end-process Kill Process processes.context-kill-process Halt Process processes.context-halt-process Continue Process processes.context-continue-process
Options processes.context-options
Information processes.context-information
End Processes processes.end-process Kill Processes processes.kill-process Halt Processes processes.halt-process Continue Processes processes.continue-process
resources-1.9.1/data/resources/ui/shortcuts.ui000066400000000000000000000063021510634446000214750ustar00rootroot00000000000000 General Preferences app.settings Show Shortcuts app.shortcuts Quit app.quit Apps/Processes Toggle Search Field app.toggle-search End App/Process app.end-app-process Kill App/Process app.kill-app-process Halt App/Process app.halt-app-process Continue App/Process app.continue-app-process Show Information for App/Process app.information-app-process Show Process Options app.process-options resources-1.9.1/data/resources/ui/widgets/000077500000000000000000000000001510634446000205455ustar00rootroot00000000000000resources-1.9.1/data/resources/ui/widgets/application_name_cell.ui000066400000000000000000000014601510634446000254070ustar00rootroot00000000000000 resources-1.9.1/data/resources/ui/widgets/double_graph_box.ui000066400000000000000000000102401510634446000244040ustar00rootroot00000000000000 resources-1.9.1/data/resources/ui/widgets/graph_box.ui000066400000000000000000000040621510634446000230570ustar00rootroot00000000000000 resources-1.9.1/data/resources/ui/widgets/process_name_cell.ui000066400000000000000000000014541510634446000245650ustar00rootroot00000000000000 resources-1.9.1/data/resources/ui/widgets/stack_sidebar.ui000066400000000000000000000012451510634446000237040ustar00rootroot00000000000000 resources-1.9.1/data/resources/ui/widgets/stack_sidebar_item.ui000066400000000000000000000045321510634446000247240ustar00rootroot00000000000000 resources-1.9.1/data/resources/ui/window.ui000066400000000000000000000245121510634446000207510ustar00rootroot00000000000000
Preferences app.settings Keyboard Shortcuts app.shortcuts About Resources app.about
resources-1.9.1/hooks/000077500000000000000000000000001510634446000146625ustar00rootroot00000000000000resources-1.9.1/hooks/pre-commit.hook000077500000000000000000000031601510634446000176230ustar00rootroot00000000000000#!/bin/sh # Source: https://gitlab.gnome.org/GNOME/fractal/blob/master/hooks/pre-commit.hook install_rustfmt() { if ! which rustup &> /dev/null; then curl https://sh.rustup.rs -sSf | sh -s -- -y export PATH=$PATH:$HOME/.cargo/bin if ! which rustup &> /dev/null; then echo "Failed to install rustup. Performing the commit without style checking." exit 0 fi fi if ! rustup component list|grep rustfmt &> /dev/null; then echo "Installing rustfmt…" rustup component add rustfmt fi } if ! which cargo >/dev/null 2>&1 || ! cargo fmt --help >/dev/null 2>&1; then echo "Unable to check the project’s code style, because rustfmt could not be run." if [ ! -t 1 ]; then # No input is possible echo "Performing commit." exit 0 fi echo "" echo "y: Install rustfmt via rustup" echo "n: Don't install rustfmt and perform the commit" echo "Q: Don't install rustfmt and abort the commit" echo "" while true do echo -n "Install rustfmt via rustup? [y/n/Q]: "; read yn < /dev/tty case $yn in [Yy]* ) install_rustfmt; break;; [Nn]* ) echo "Performing commit."; exit 0;; [Qq]* | "" ) echo "Aborting commit."; exit -1 >/dev/null 2>&1;; * ) echo "Invalid input";; esac done fi echo "--Checking style--" cargo fmt --all -- --check if test $? != 0; then echo "--Checking style fail--" echo "Please fix the above issues, either manually or by running: cargo fmt --all" exit -1 else echo "--Checking style pass--" fi resources-1.9.1/lib/000077500000000000000000000000001510634446000143055ustar00rootroot00000000000000resources-1.9.1/lib/process_data/000077500000000000000000000000001510634446000167545ustar00rootroot00000000000000resources-1.9.1/lib/process_data/Cargo.lock000066400000000000000000000363031510634446000206660ustar00rootroot00000000000000# This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 4 [[package]] name = "aho-corasick" version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" dependencies = [ "memchr", ] [[package]] name = "anyhow" version = "1.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" [[package]] name = "bitflags" version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" [[package]] name = "cc" version = "1.2.46" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b97463e1064cb1b1c1384ad0a0b9c8abd0988e2a91f52606c80ef14aadb63e36" dependencies = [ "find-msvc-tools", "shlex", ] [[package]] name = "cfg-if" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "convert_case" version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" dependencies = [ "unicode-segmentation", ] [[package]] name = "darling" version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" dependencies = [ "darling_core", "darling_macro", ] [[package]] name = "darling_core" version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", "strsim", "syn", ] [[package]] name = "darling_macro" version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ "darling_core", "quote", "syn", ] [[package]] name = "diff" version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" [[package]] name = "errno" version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1" dependencies = [ "errno-dragonfly", "libc", "winapi 0.3.9", ] [[package]] name = "errno-dragonfly" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" dependencies = [ "cc", "libc", ] [[package]] name = "find-msvc-tools" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3a3076410a55c90011c298b04d0cfa770b00fa04e1e3c97d3f6c9de105a03844" [[package]] name = "fnv" version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "glob" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" [[package]] name = "hermit-abi" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" [[package]] name = "ident_case" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "kernel32-sys" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" dependencies = [ "winapi 0.2.8", "winapi-build", ] [[package]] name = "kinded" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ce4bdbb2f423660b19f0e9f7115182214732d8dd5f840cd0a3aee3e22562f34c" dependencies = [ "kinded_macros", ] [[package]] name = "kinded_macros" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a13b4ddc5dcb32f45dac3d6f606da2a52fdb9964a18427e63cd5ef6c0d13288d" dependencies = [ "convert_case", "proc-macro2", "quote", "syn", ] [[package]] name = "lazy-regex" version = "3.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "191898e17ddee19e60bccb3945aa02339e81edd4a8c50e21fd4d48cdecda7b29" dependencies = [ "lazy-regex-proc_macros", "once_cell", "regex", ] [[package]] name = "lazy-regex-proc_macros" version = "3.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c35dc8b0da83d1a9507e12122c80dea71a9c7c613014347392483a83ea593e04" dependencies = [ "proc-macro2", "quote", "regex", "syn", ] [[package]] name = "libc" version = "0.2.177" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" [[package]] name = "libloading" version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" dependencies = [ "cfg-if", "windows-link", ] [[package]] name = "log" version = "0.4.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" [[package]] name = "memchr" version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" [[package]] name = "num_cpus" version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" dependencies = [ "hermit-abi", "libc", ] [[package]] name = "nutype" version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "70587a780088c67dad31bf722b875c5616096b4d8c0ded8b7de03294ffb9bbb5" dependencies = [ "nutype_macros", ] [[package]] name = "nutype_macros" version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "148934b975faeddd8f0679d7cf11280b50c4c5495d6fe72bdaf07c932874b404" dependencies = [ "cfg-if", "kinded", "proc-macro2", "quote", "rustc_version", "syn", "urlencoding", ] [[package]] name = "nvml-wrapper" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d5c6c0ef9702176a570f06ad94f3198bc29c524c8b498f1b9346e1b1bdcbb3a" dependencies = [ "bitflags", "libloading", "nvml-wrapper-sys", "static_assertions", "thiserror 1.0.69", "wrapcenum-derive", ] [[package]] name = "nvml-wrapper-sys" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd23dbe2eb8d8335d2bce0299e0a07d6a63c089243d626ca75b770a962ff49e6" dependencies = [ "libloading", ] [[package]] name = "once_cell" version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "pretty_assertions" version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3ae130e2f271fbc2ac3a40fb1d07180839cdbbe443c7a27e1e3c13c5cac0116d" dependencies = [ "diff", "yansi", ] [[package]] name = "proc-macro2" version = "1.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" dependencies = [ "unicode-ident", ] [[package]] name = "process-data" version = "1.9.1" dependencies = [ "anyhow", "glob", "lazy-regex", "libc", "num_cpus", "nutype", "nvml-wrapper", "pretty_assertions", "serde", "syscalls", "sysconf", "thiserror 2.0.17", "unescape", "uzers", ] [[package]] name = "quote" version = "1.0.42" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" dependencies = [ "proc-macro2", ] [[package]] name = "regex" version = "1.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" dependencies = [ "aho-corasick", "memchr", "regex-automata", "regex-syntax", ] [[package]] name = "regex-automata" version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" dependencies = [ "aho-corasick", "memchr", "regex-syntax", ] [[package]] name = "regex-syntax" version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" [[package]] name = "rustc_version" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" dependencies = [ "semver", ] [[package]] name = "semver" version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" [[package]] name = "serde" version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" dependencies = [ "serde_core", "serde_derive", ] [[package]] name = "serde_core" version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "serde_repr" version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "shlex" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "static_assertions" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "strsim" version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "syn" version = "2.0.110" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a99801b5bd34ede4cf3fc688c5919368fea4e4814a4664359503e6015b280aea" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] [[package]] name = "syscalls" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90db46b5b4962319605d435986c775ea45a0ad2561c09e1d5372b89afeb49cf4" dependencies = [ "serde", "serde_repr", ] [[package]] name = "sysconf" version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "59e93f5d45535f49b6a05ef7ac2f0f795d28de494cf53a512751602c9849bea3" dependencies = [ "errno", "kernel32-sys", "libc", "winapi 0.2.8", ] [[package]] name = "thiserror" version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ "thiserror-impl 1.0.69", ] [[package]] name = "thiserror" version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" dependencies = [ "thiserror-impl 2.0.17", ] [[package]] name = "thiserror-impl" version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "thiserror-impl" version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "unescape" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ccb97dac3243214f8d8507998906ca3e2e0b900bf9bf4870477f125b82e68f6e" [[package]] name = "unicode-ident" version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" [[package]] name = "unicode-segmentation" version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" [[package]] name = "urlencoding" version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" [[package]] name = "uzers" version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4df81ff504e7d82ad53e95ed1ad5b72103c11253f39238bcc0235b90768a97dd" dependencies = [ "libc", "log", ] [[package]] name = "winapi" version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" [[package]] name = "winapi" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" dependencies = [ "winapi-i686-pc-windows-gnu", "winapi-x86_64-pc-windows-gnu", ] [[package]] name = "winapi-build" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" [[package]] name = "winapi-i686-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows-link" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" [[package]] name = "wrapcenum-derive" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a76ff259533532054cfbaefb115c613203c73707017459206380f03b3b3f266e" dependencies = [ "darling", "proc-macro2", "quote", "syn", ] [[package]] name = "yansi" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" resources-1.9.1/lib/process_data/Cargo.toml000066400000000000000000000013541510634446000207070ustar00rootroot00000000000000[package] name = "process-data" version = "1.9.1" authors = ["nokyan "] edition = "2024" rust-version = "1.85.0" homepage = "https://apps.gnome.org/app/net.nokyan.Resources/" license = "GPL-3.0-or-later" [profile.dev] opt-level = 1 [profile.release] codegen-units = 1 lto = true strip = true opt-level = 3 [dependencies] anyhow = "1.0.100" glob = "0.3.3" lazy-regex = "3.4.2" libc = "0.2.177" num_cpus = "1.17.0" nutype = { version = "0.6.2", features = ["serde"] } nvml-wrapper = "0.11.0" serde = { version = "1.0.228", features = ["serde_derive"] } syscalls = { version = "0.7.0", features = ["all"] } sysconf = "0.3.4" thiserror = "2.0.17" unescape = "0.1.0" uzers = "0.12.1" [dev-dependencies] pretty_assertions = "1.4.1" resources-1.9.1/lib/process_data/src/000077500000000000000000000000001510634446000175435ustar00rootroot00000000000000resources-1.9.1/lib/process_data/src/gpu_usage.rs000066400000000000000000000256471510634446000221060ustar00rootroot00000000000000use std::fmt::Display; use nutype::nutype; use serde::{Deserialize, Serialize}; use crate::pci_slot::PciSlot; #[nutype( validate(less_or_equal = 100), validate(greater_or_equal = 0), derive( Debug, Default, Clone, Hash, PartialEq, Eq, Serialize, Deserialize, Copy, FromStr, Deref, TryFrom, Display, PartialOrd, Ord, ), default = 0 )] pub struct IntegerPercentage(u8); impl IntegerPercentage { fn fraction(self) -> f32 { self.into_inner() as f32 / 100.0 } } #[derive(Debug, Clone, Hash, PartialEq, Eq, Serialize, Deserialize, Copy, PartialOrd, Ord)] pub enum GpuIdentifier { PciSlot(PciSlot), Enumerator(usize), } impl Default for GpuIdentifier { fn default() -> Self { GpuIdentifier::Enumerator(0) } } impl Display for GpuIdentifier { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { GpuIdentifier::PciSlot(pci_slot) => write!(f, "{pci_slot}"), GpuIdentifier::Enumerator(e) => write!(f, "{e}"), } } } #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq, Serialize, Deserialize, PartialOrd, Ord)] pub enum GpuUsageStats { AmdgpuStats { gfx_ns: u64, enc_ns: u64, dec_ns: u64, mem_bytes: u64, }, I915Stats { gfx_ns: u64, video_ns: u64, }, NvidiaStats { gfx_percentage: IntegerPercentage, enc_percentage: IntegerPercentage, dec_percentage: IntegerPercentage, mem_bytes: u64, }, V3dStats { gfx_ns: u64, mem_bytes: u64, }, XeStats { gfx_cycles: u64, gfx_total_cycles: u64, compute_cycles: u64, compute_total_cycles: u64, video_cycles: u64, video_total_cycles: u64, mem_bytes: u64, }, } impl GpuUsageStats { fn delta_ns(a: u64, b: u64, time_delta: u64) -> Option { if time_delta == 0 { None } else { Some(a.saturating_sub(b) as f32 / (time_delta * 1_000_000) as f32) } } fn delta_ratio( a_cycles: u64, b_cycles: u64, a_total_cycles: u64, b_total_cycles: u64, ) -> Option { let cycles = a_cycles.saturating_sub(b_cycles) as f64; let total_cycles = a_total_cycles.saturating_sub(b_total_cycles) as f64; if total_cycles == 0.0 { None } else { Some((cycles / total_cycles) as f32) } } fn max_option(a: Option, b: Option) -> Option { a.zip(b).map(|(x, y)| x.max(y)).or(a.or(b)) } #[must_use] pub fn gfx_fraction(&self, old: &Self, time_delta: u64) -> Option { match (self, old) { (Self::AmdgpuStats { gfx_ns: a_ns, .. }, Self::AmdgpuStats { gfx_ns: b_ns, .. }) | (Self::I915Stats { gfx_ns: a_ns, .. }, Self::I915Stats { gfx_ns: b_ns, .. }) | (Self::V3dStats { gfx_ns: a_ns, .. }, Self::V3dStats { gfx_ns: b_ns, .. }) => { Self::delta_ns(*a_ns, *b_ns, time_delta) } (Self::NvidiaStats { gfx_percentage, .. }, Self::NvidiaStats { .. }) => { Some(gfx_percentage.fraction()) } ( Self::XeStats { gfx_cycles: a_gfx_cycles, gfx_total_cycles: a_gfx_total_cycles, compute_cycles: a_compute_cycles, compute_total_cycles: a_compute_total_cycles, .. }, Self::XeStats { gfx_cycles: b_gfx_cycles, gfx_total_cycles: b_gfx_total_cycles, compute_cycles: b_compute_cycles, compute_total_cycles: b_compute_total_cycles, .. }, ) => Self::max_option( // Right now, Resources doesn't differentiate between compute and gfx load, and since xe gives us cycles // instead of ns for whatever reason, we need to do this hack :/ Self::delta_ratio( *a_gfx_cycles, *b_gfx_cycles, *a_gfx_total_cycles, *b_gfx_total_cycles, ), Self::delta_ratio( *a_compute_cycles, *b_compute_cycles, *a_compute_total_cycles, *b_compute_total_cycles, ), ), _ => None, } } #[must_use] pub fn enc_fraction(&self, old: &Self, time_delta: u64) -> Option { match (self, old) { (Self::AmdgpuStats { enc_ns: a_ns, .. }, Self::AmdgpuStats { enc_ns: b_ns, .. }) | (Self::I915Stats { video_ns: a_ns, .. }, Self::I915Stats { video_ns: b_ns, .. }) => { Self::delta_ns(*a_ns, *b_ns, time_delta) } (Self::NvidiaStats { enc_percentage, .. }, Self::NvidiaStats { .. }) => { Some(enc_percentage.fraction()) } ( Self::XeStats { video_cycles: a_cycles, video_total_cycles: a_total_cycles, .. }, Self::XeStats { video_cycles: b_cycles, video_total_cycles: b_total_cycles, .. }, ) => Self::delta_ratio(*a_cycles, *b_cycles, *a_total_cycles, *b_total_cycles), _ => None, } } /// For cards with a unified media engine (i.e. no separated encode/decode stats), this will either be 0 (in case of /// some AMD GPUs) or the same as enc_fraction() #[must_use] pub fn dec_fraction(&self, old: &Self, time_delta: u64) -> Option { match (self, old) { (Self::AmdgpuStats { dec_ns: a_ns, .. }, Self::AmdgpuStats { dec_ns: b_ns, .. }) => { Self::delta_ns(*a_ns, *b_ns, time_delta) } (Self::NvidiaStats { dec_percentage, .. }, Self::NvidiaStats { .. }) => { Some(dec_percentage.fraction()) } ( Self::XeStats { video_cycles: a_cycles, video_total_cycles: a_total_cycles, .. }, Self::XeStats { video_cycles: b_cycles, video_total_cycles: b_total_cycles, .. }, ) => Self::delta_ratio(*a_cycles, *b_cycles, *a_total_cycles, *b_total_cycles), _ => None, } } #[must_use] pub fn mem(&self) -> Option { match self { Self::AmdgpuStats { mem_bytes, .. } | Self::NvidiaStats { mem_bytes, .. } | Self::V3dStats { mem_bytes, .. } | Self::XeStats { mem_bytes, .. } => Some(*mem_bytes), Self::I915Stats { .. } => None, } } #[must_use] pub fn greater(&self, other: &Self) -> Self { match (self, other) { ( Self::AmdgpuStats { gfx_ns: a_gfx_ns, enc_ns: a_enc_ns, dec_ns: a_dec_ns, mem_bytes: a_mem_bytes, }, Self::AmdgpuStats { gfx_ns: b_gfx_ns, enc_ns: b_enc_ns, dec_ns: b_dec_ns, mem_bytes: b_mem_bytes, }, ) => Self::AmdgpuStats { gfx_ns: *a_gfx_ns.max(b_gfx_ns), enc_ns: *a_enc_ns.max(b_enc_ns), dec_ns: *a_dec_ns.max(b_dec_ns), mem_bytes: *a_mem_bytes.max(b_mem_bytes), }, ( Self::I915Stats { gfx_ns: a_gfx_ns, video_ns: a_video_ns, }, Self::I915Stats { gfx_ns: b_gfx_ns, video_ns: b_video_ns, }, ) => Self::I915Stats { gfx_ns: *a_gfx_ns.max(b_gfx_ns), video_ns: *a_video_ns.max(b_video_ns), }, ( Self::NvidiaStats { gfx_percentage: a_gfx_percentage, enc_percentage: a_enc_percentage, dec_percentage: a_dec_percentage, mem_bytes: a_mem_bytes, }, Self::NvidiaStats { gfx_percentage: b_gfx_percentage, enc_percentage: b_enc_percentage, dec_percentage: b_dec_percentage, mem_bytes: b_mem_bytes, }, ) => Self::NvidiaStats { gfx_percentage: *a_gfx_percentage.max(b_gfx_percentage), enc_percentage: *a_enc_percentage.max(b_enc_percentage), dec_percentage: *a_dec_percentage.max(b_dec_percentage), mem_bytes: *a_mem_bytes.max(b_mem_bytes), }, ( Self::V3dStats { gfx_ns: a_gfx_ns, mem_bytes: a_mem_bytes, }, Self::V3dStats { gfx_ns: b_gfx_ns, mem_bytes: b_mem_bytes, }, ) => Self::V3dStats { gfx_ns: *a_gfx_ns.max(b_gfx_ns), mem_bytes: *a_mem_bytes.max(b_mem_bytes), }, ( Self::XeStats { gfx_cycles: a_gfx_cycles, gfx_total_cycles: a_gfx_total_cycles, compute_cycles: a_compute_cycles, compute_total_cycles: a_compute_total_cycles, video_cycles: a_video_cycles, video_total_cycles: a_video_total_cycles, mem_bytes: a_mem_bytes, }, Self::XeStats { gfx_cycles: b_gfx_cycles, gfx_total_cycles: b_gfx_total_cycles, compute_cycles: b_compute_cycles, compute_total_cycles: b_compute_total_cycles, video_cycles: b_video_cycles, video_total_cycles: b_video_total_cycles, mem_bytes: b_mem_bytes, }, ) => Self::XeStats { gfx_cycles: *a_gfx_cycles.max(b_gfx_cycles), gfx_total_cycles: *a_gfx_total_cycles.max(b_gfx_total_cycles), compute_cycles: *a_compute_cycles.max(b_compute_cycles), compute_total_cycles: *a_compute_total_cycles.max(b_compute_total_cycles), video_cycles: *a_video_cycles.max(b_video_cycles), video_total_cycles: *a_video_total_cycles.max(b_video_total_cycles), mem_bytes: *a_mem_bytes.max(b_mem_bytes), }, _ => *self, } } } resources-1.9.1/lib/process_data/src/lib.rs000066400000000000000000000642411510634446000206660ustar00rootroot00000000000000pub mod gpu_usage; pub mod pci_slot; use anyhow::{Context, Result, bail}; use glob::glob; use lazy_regex::{Lazy, Regex, lazy_regex}; use nutype::nutype; use nvml_wrapper::enums::device::UsedGpuMemory; use nvml_wrapper::error::NvmlError; use nvml_wrapper::struct_wrappers::device::{ProcessInfo, ProcessUtilizationSample}; use nvml_wrapper::{Device, Nvml}; use pci_slot::PciSlot; use serde::{Deserialize, Serialize}; use std::collections::{BTreeMap, HashMap, HashSet}; use std::io::Read; use std::iter::Sum; use std::os::linux::fs::MetadataExt; use std::path::{Path, PathBuf}; use std::str::FromStr; use std::sync::{LazyLock, RwLock}; use std::time::SystemTime; use crate::gpu_usage::{GpuIdentifier, GpuUsageStats, IntegerPercentage}; const STAT_OFFSET: usize = 2; // we split the stat contents where the executable name ends, which is the second element const STAT_PARENT_PID: usize = 3 - STAT_OFFSET; const STAT_USER_CPU_TIME: usize = 13 - STAT_OFFSET; const STAT_SYSTEM_CPU_TIME: usize = 14 - STAT_OFFSET; const STAT_NICE: usize = 18 - STAT_OFFSET; const STAT_STARTTIME: usize = 21 - STAT_OFFSET; const DRM_DRIVER: &str = "drm-driver"; const DRM_PDEV: &str = "drm-pdev"; static USERS_CACHE: LazyLock> = LazyLock::new(|| unsafe { uzers::all_users() .map(|user| (user.uid(), user.name().to_string_lossy().to_string())) .collect() }); static PAGESIZE: LazyLock = LazyLock::new(sysconf::pagesize); static NUM_CPUS: LazyLock = LazyLock::new(num_cpus::get); static RE_UID: Lazy = lazy_regex!(r"Uid:\s*(\d+)"); static RE_AFFINITY: Lazy = lazy_regex!(r"Cpus_allowed:\s*([0-9A-Fa-f]+)"); static RE_SWAP_USAGE: Lazy = lazy_regex!(r"VmSwap:\s*([0-9]+)\s*kB"); static RE_IO_READ: Lazy = lazy_regex!(r"read_bytes:\s*(\d+)"); static RE_IO_WRITE: Lazy = lazy_regex!(r"write_bytes:\s*(\d+)"); static RE_DRM_KIB: Lazy = lazy_regex!(r"(\d+)\s*KiB"); static RE_DRM_TIME: Lazy = lazy_regex!(r"(\d+)\s*ns"); static RE_DRM_UNITS: Lazy = lazy_regex!(r"(\d+)"); static GFX_NS_DRM_FIELDS: Lazy>> = Lazy::new(|| { HashMap::from_iter([ ("amdgpu", vec!["drm-engine-compute", "drm-engine-gfx"]), ("i915", vec!["drm-engine-render"]), ("v3d", vec!["drm-engine-render"]), ]) }); static GFX_CYCLES_DRM_FIELDS: Lazy>> = Lazy::new(|| HashMap::from_iter([("xe", vec!["drm-cycles-rcs"])])); static GFX_TOTAL_CYCLES_DRM_FIELDS: Lazy>> = Lazy::new(|| HashMap::from_iter([("xe", vec!["drm-total-cycles-rcs"])])); static COMPUTE_CYCLES_DRM_FIELDS: Lazy>> = Lazy::new(|| HashMap::from_iter([("xe", vec!["drm-cycles-ccs"])])); static COMPUTE_TOTAL_CYCLES_DRM_FIELDS: Lazy>> = Lazy::new(|| HashMap::from_iter([("xe", vec!["drm-total-cycles-ccs"])])); static ENC_NS_DRM_FIELDS: Lazy>> = Lazy::new(|| { HashMap::from_iter([ ("amdgpu", vec!["drm-engine-enc"]), ("i915", vec!["drm-engine-video"]), ]) }); static ENC_CYCLES_DRM_FIELDS: Lazy>> = Lazy::new(|| HashMap::from_iter([("xe", vec!["drm-cycles-vcs"])])); static ENC_TOTAL_CYCLES_DRM_FIELDS: Lazy>> = Lazy::new(|| HashMap::from_iter([("xe", vec!["drm-total-cycles-vcs"])])); static DEC_NS_DRM_FIELDS: Lazy>> = Lazy::new(|| HashMap::from_iter([("amdgpu", vec!["drm-engine-dec"])])); static MEM_DRM_FIELDS: Lazy>> = Lazy::new(|| { HashMap::from_iter([ ("amdgpu", vec!["drm-memory-gtt", "drm-memory-vram"]), ("i915", vec!["drm-total-local0", "drm-total-system0"]), ("v3d", vec!["drm-total-memory"]), ("xe", vec!["drm-total-gtt", "drm-total-vram0"]), ]) }); static NVML: Lazy> = Lazy::new(Nvml::init); static NVML_DEVICES: Lazy> = Lazy::new(|| { if let Ok(nvml) = NVML.as_ref() { let device_count = nvml.device_count().unwrap_or(0); let mut return_vec = Vec::with_capacity(device_count as usize); for i in 0..device_count { if let Ok(gpu) = nvml.device_by_index(i) { if let Ok(pci_slot) = gpu.pci_info().map(|pci_info| pci_info.bus_id) { let pci_slot = PciSlot::from_str(&pci_slot).unwrap(); return_vec.push((pci_slot, gpu)); } } } return_vec } else { Vec::new() } }); static NVIDIA_PROCESSES_STATS: Lazy>>> = Lazy::new(|| RwLock::new(HashMap::new())); static NVIDIA_PROCESS_INFOS: Lazy>>> = Lazy::new(|| RwLock::new(HashMap::new())); #[nutype( validate(less_or_equal = 19), validate(greater_or_equal = -20), derive( Debug, Default, Clone, Hash, PartialEq, Eq, Serialize, Deserialize, Copy, FromStr, Deref, TryFrom, Display, PartialOrd, Ord, ), default = 0 )] pub struct Niceness(i8); #[derive( Debug, Clone, Default, Hash, PartialEq, Eq, Serialize, Deserialize, Copy, PartialOrd, Ord, )] pub enum Containerization { #[default] None, Flatpak, Snap, } /// Data that could be transferred us>ing `resources-processes`, separated from /// `Process` mainly due to `Icon` not being able to derive `Serialize` and /// `Deserialize`. #[derive(Debug, Default, Clone, Hash, PartialEq, Eq, Serialize, Deserialize)] pub struct ProcessData { pub pid: libc::pid_t, pub parent_pid: libc::pid_t, pub user: String, pub comm: String, pub commandline: String, pub user_cpu_time: u64, pub system_cpu_time: u64, pub niceness: Niceness, pub affinity: Vec, pub memory_usage: usize, pub swap_usage: usize, pub starttime: u64, // in clock ticks, see man proc(5)! pub cgroup: Option, pub containerization: Containerization, pub read_bytes: Option, pub write_bytes: Option, pub timestamp: u64, pub gpu_usage_stats: BTreeMap, } impl ProcessData { fn sanitize_cgroup>(cgroup: S) -> Option { let cgroups_v2_line = cgroup.as_ref().split('\n').find(|s| s.starts_with("0::"))?; if cgroups_v2_line.ends_with(".scope") { let cgroups_segments: Vec<&str> = cgroups_v2_line.split('-').collect(); if cgroups_segments.len() > 1 { cgroups_segments .get(cgroups_segments.len() - 2) .map(|s| unescape::unescape(s).unwrap_or_else(|| (*s).to_string())) } else { None } } else if cgroups_v2_line.ends_with(".service") { let cgroups_segments: Vec<&str> = cgroups_v2_line.split('/').collect(); if let Some(last) = cgroups_segments.last() { last[0..last.len() - 8] .split('@') .next() .map(|s| unescape::unescape(s).unwrap_or_else(|| s.to_string())) .map(|s| { if s.contains("dbus-:") { s.split('-').last().unwrap_or(&s).to_string() } else { s } }) } else { None } } else { None } } fn get_uid(proc_path: &Path) -> Result { let status = std::fs::read_to_string(proc_path.join("status"))?; if let Some(captures) = RE_UID.captures(&status) { let first_num_str = captures.get(1).context("no uid found")?; first_num_str .as_str() .parse::() .context("couldn't parse uid in /status") } else { Ok(0) } } pub fn update_nvidia_stats() { { let mut stats = NVIDIA_PROCESSES_STATS.write().unwrap(); stats.clear(); stats.extend(Self::nvidia_process_stats()); } { let mut infos = NVIDIA_PROCESS_INFOS.write().unwrap(); infos.clear(); infos.extend(Self::nvidia_process_infos()); } } pub fn all_process_data() -> Result> { Self::update_nvidia_stats(); let mut process_data = vec![]; for entry in glob("/proc/[0-9]*/").context("unable to glob")?.flatten() { let data = ProcessData::try_from_path(&entry); if let Ok(data) = data { process_data.push(data); } } Ok(process_data) } pub fn try_from_path>(proc_path: P) -> Result { let proc_path = proc_path.as_ref(); let stat = std::fs::read_to_string(proc_path.join("stat"))?; let statm = std::fs::read_to_string(proc_path.join("statm"))?; let status = std::fs::read_to_string(proc_path.join("status"))?; let comm = std::fs::read_to_string(proc_path.join("comm"))?; let commandline = std::fs::read_to_string(proc_path.join("cmdline"))?; let io = std::fs::read_to_string(proc_path.join("io")).ok(); let pid = proc_path .file_name() .context("proc_path terminates in ..")? .to_str() .context("can't turn OsStr to str")? .parse()?; let user = USERS_CACHE .get(&Self::get_uid(proc_path)?) .cloned() .unwrap_or(String::from("root")); let stat = stat .split(')') // since we don't care about the pid or the executable name, split after the executable name to make our life easier .last() .context("stat doesn't have ')'")? .split(' ') .skip(1) // the first element would be a space, let's ignore that .collect::>(); let statm = statm.split(' ').collect::>(); let comm = comm.replace('\n', ""); let parent_pid = stat .get(STAT_PARENT_PID) .context("wrong stat file format") .and_then(|x| x.parse().context("couldn't parse stat file content"))?; let user_cpu_time = stat .get(STAT_USER_CPU_TIME) .context("wrong stat file format") .and_then(|x| x.parse().context("couldn't parse stat file content"))?; let system_cpu_time = stat .get(STAT_SYSTEM_CPU_TIME) .context("wrong stat file format") .and_then(|x| x.parse().context("couldn't parse stat file content"))?; let nice = stat .get(STAT_NICE) .context("wrong stat file format") .and_then(|x| x.parse().context("couldn't parse stat file content"))?; let starttime = stat .get(STAT_STARTTIME) .context("wrong stat file format") .and_then(|x| x.parse().context("couldn't parse stat file content"))?; let mut affinity = Vec::with_capacity(*NUM_CPUS); RE_AFFINITY .captures(&status) .and_then(|captures| captures.get(1)) .map(|capture| capture.as_str()) .unwrap_or_default() .chars() .map(|c| c.to_digit(16).unwrap_or_default()) .rev() .for_each(|int| { // we want the bits and there are 4 bits in a hex digit (0..4).for_each(|i| { // this should prevent wrong size affinity vecs if the thread count is not divisible by 4 if affinity.len() < *NUM_CPUS { affinity.push((int & (1 << i)) != 0); } }); }); let swap_usage = RE_SWAP_USAGE .captures(&status) .and_then(|captures| captures.get(1)) .map(|capture| capture.as_str()) .unwrap_or_default() .parse::() .unwrap_or_default() .saturating_mul(1000); let memory_usage = statm .get(1) .context("wrong statm file format") .and_then(|x| { x.parse::() .context("couldn't parse statm file content") })? .saturating_sub( statm .get(2) .context("wrong statm file format") .and_then(|x| { x.parse::() .context("couldn't parse statm file content") })?, ) .saturating_mul(*PAGESIZE); let cgroup = std::fs::read_to_string(proc_path.join("cgroup")) .ok() .and_then(Self::sanitize_cgroup); let containerization = if commandline.starts_with("/snap/") { Containerization::Snap } else if proc_path.join("root").join(".flatpak-info").exists() { Containerization::Flatpak } else { Containerization::None }; let read_bytes = io.as_ref().and_then(|io| { RE_IO_READ .captures(io) .and_then(|captures| captures.get(1)) .and_then(|capture| capture.as_str().parse::().ok()) }); let write_bytes = io.as_ref().and_then(|io| { RE_IO_WRITE .captures(io) .and_then(|captures| captures.get(1)) .and_then(|capture| capture.as_str().parse::().ok()) }); let fdinfos = Self::collect_fdinfos(pid).unwrap_or_default(); let nvidia_stats = Self::nvidia_gpu_stats_all(pid); let mut gpu_usage_stats = Self::other_gpu_usage_stats(&fdinfos).unwrap_or_default(); gpu_usage_stats.extend(nvidia_stats); let timestamp = unix_as_millis(); Ok(Self { pid, parent_pid, user, comm, commandline, user_cpu_time, system_cpu_time, niceness: nice, affinity, memory_usage, swap_usage, starttime, cgroup, containerization, read_bytes, write_bytes, timestamp, gpu_usage_stats, }) } fn collect_fdinfos(pid: libc::pid_t) -> Result>> { let fdinfo_dir = PathBuf::from(format!("/proc/{pid}/fdinfo")); let mut seen_fds = HashSet::new(); let mut return_vec = Vec::new(); for entry in std::fs::read_dir(fdinfo_dir)? { let entry = entry?; let fdinfo_path = entry.path(); let _file = std::fs::File::open(&fdinfo_path); if _file.is_err() { continue; } let mut file = _file.unwrap(); // if our fd is 0, 1 or 2 it's probably just a std stream so skip it let fd_num = fdinfo_path .file_name() .and_then(|osstr| osstr.to_str()) .unwrap_or("0") .parse::() .unwrap_or(0); if fd_num <= 2 { continue; } let _metadata = file.metadata(); if _metadata.is_err() { continue; } let metadata = _metadata.unwrap(); if !metadata.is_file() { continue; } // Adapted from nvtop's `is_drm_fd()` // https://github.com/Syllo/nvtop/blob/master/src/extract_processinfo_fdinfo.c let fd_path = fdinfo_path.to_str().map(|s| s.replace("fdinfo", "fd")); if let Some(fd_path) = fd_path { if let Ok(fd_metadata) = std::fs::metadata(fd_path) { let major = libc::major(fd_metadata.st_rdev()); if (fd_metadata.st_mode() & libc::S_IFMT) != libc::S_IFCHR || major != 226 { continue; } } } // Adapted from nvtop's `processinfo_sweep_fdinfos()` // https://github.com/Syllo/nvtop/blob/master/src/extract_processinfo_fdinfo.c // if we've already seen the file this fd refers to, skip let not_unique = seen_fds.iter().any(|seen_fd| unsafe { syscalls::syscall!(syscalls::Sysno::kcmp, pid, pid, 0, fd_num, *seen_fd) .unwrap_or(0) == 0 }); if not_unique { continue; } seen_fds.insert(fd_num); let mut buffer = String::new(); file.read_to_string(&mut buffer)?; return_vec.push(Self::parse_fdinfo(buffer)); } Ok(return_vec) } fn parse_fdinfo>(file_contents: S) -> HashMap { HashMap::from_iter( file_contents .into() .lines() .filter_map(|line| line.split_once(':')) .map(|(name, value)| (name.trim().to_string(), value.trim().to_string())), ) } fn other_gpu_usage_stats( fdinfos: &[HashMap], ) -> Result> { let mut return_map = BTreeMap::new(); for fdinfo in fdinfos { if let Ok((identifier, stats)) = Self::extract_gpu_usage_from_fdinfo(fdinfo) { return_map .entry(identifier) .and_modify(|existing_value: &mut GpuUsageStats| { *existing_value = existing_value.greater(&stats) }) .or_insert(stats); } } Ok(return_map) } fn extract_gpu_usage_from_fdinfo( fdinfo: &HashMap, ) -> Result<(GpuIdentifier, GpuUsageStats)> { let driver = fdinfo.get(DRM_DRIVER); if let Some(driver) = driver { let gpu_identifier = fdinfo .get(DRM_PDEV) .and_then(|field| PciSlot::from_str(field).ok()) .map(GpuIdentifier::PciSlot) .unwrap_or_default(); let stats = match driver.as_str() { // TODO: this surely can be made prettier "amdgpu" => GpuUsageStats::AmdgpuStats { gfx_ns: GFX_NS_DRM_FIELDS .get(driver.as_str()) .map(|names| Self::parse_drm_fields(fdinfo, names, &RE_DRM_TIME)) .unwrap_or_default(), enc_ns: ENC_NS_DRM_FIELDS .get(driver.as_str()) .map(|names| Self::parse_drm_fields(fdinfo, names, &RE_DRM_TIME)) .unwrap_or_default(), dec_ns: DEC_NS_DRM_FIELDS .get(driver.as_str()) .map(|names| Self::parse_drm_fields(fdinfo, names, &RE_DRM_TIME)) .unwrap_or_default(), mem_bytes: MEM_DRM_FIELDS .get(driver.as_str()) .map(|names| { Self::parse_drm_fields::(fdinfo, names, &RE_DRM_KIB) .saturating_mul(1024) }) .unwrap_or_default(), }, "i915" => GpuUsageStats::I915Stats { gfx_ns: GFX_NS_DRM_FIELDS .get(driver.as_str()) .map(|names| Self::parse_drm_fields(fdinfo, names, &RE_DRM_TIME)) .unwrap_or_default(), video_ns: ENC_NS_DRM_FIELDS .get(driver.as_str()) .map(|names| Self::parse_drm_fields(fdinfo, names, &RE_DRM_TIME)) .unwrap_or_default(), }, "v3d" => GpuUsageStats::V3dStats { gfx_ns: GFX_NS_DRM_FIELDS .get(driver.as_str()) .map(|names| Self::parse_drm_fields(fdinfo, names, &RE_DRM_TIME)) .unwrap_or_default(), mem_bytes: MEM_DRM_FIELDS .get(driver.as_str()) .map(|names| { Self::parse_drm_fields::(fdinfo, names, &RE_DRM_KIB) .saturating_mul(1024) }) .unwrap_or_default(), }, "xe" => GpuUsageStats::XeStats { gfx_cycles: GFX_CYCLES_DRM_FIELDS .get(driver.as_str()) .map(|names| Self::parse_drm_fields(fdinfo, names, &RE_DRM_UNITS)) .unwrap_or_default(), gfx_total_cycles: GFX_TOTAL_CYCLES_DRM_FIELDS .get(driver.as_str()) .map(|names| Self::parse_drm_fields(fdinfo, names, &RE_DRM_UNITS)) .unwrap_or_default(), compute_cycles: COMPUTE_CYCLES_DRM_FIELDS .get(driver.as_str()) .map(|names| Self::parse_drm_fields(fdinfo, names, &RE_DRM_UNITS)) .unwrap_or_default(), compute_total_cycles: COMPUTE_TOTAL_CYCLES_DRM_FIELDS .get(driver.as_str()) .map(|names| Self::parse_drm_fields(fdinfo, names, &RE_DRM_UNITS)) .unwrap_or_default(), video_cycles: ENC_CYCLES_DRM_FIELDS .get(driver.as_str()) .map(|names| Self::parse_drm_fields(fdinfo, names, &RE_DRM_UNITS)) .unwrap_or_default(), video_total_cycles: ENC_TOTAL_CYCLES_DRM_FIELDS .get(driver.as_str()) .map(|names| Self::parse_drm_fields(fdinfo, names, &RE_DRM_UNITS)) .unwrap_or_default(), mem_bytes: MEM_DRM_FIELDS .get(driver.as_str()) .map(|names| { Self::parse_drm_fields::(fdinfo, names, &RE_DRM_KIB) .saturating_mul(1024) }) .unwrap_or_default(), }, _ => bail!("unable to read stats from driver"), }; return Ok((gpu_identifier, stats)); } bail!("unable to find gpu information in this fdinfo"); } fn parse_drm_fields>( fdinfo: &HashMap, field_names: &[S], regex: &Regex, ) -> T { field_names .iter() .filter_map(|name| { fdinfo.get(name.as_ref()).and_then(|value| { regex .captures(&value) .and_then(|captures| captures.get(1)) .and_then(|capture| capture.as_str().parse::().ok()) }) }) .sum() } fn nvidia_gpu_stats_all(pid: i32) -> BTreeMap { let mut return_map = BTreeMap::new(); for (pci_slot, _) in NVML_DEVICES.iter() { if let Ok(stats) = Self::nvidia_gpu_stats(pid, *pci_slot) { return_map.insert(GpuIdentifier::PciSlot(pci_slot.to_owned()), stats); } } return_map } fn nvidia_gpu_stats(pid: i32, pci_slot: PciSlot) -> Result { let this_process_stats = NVIDIA_PROCESSES_STATS .read() .unwrap() .get(&pci_slot) .context("couldn't find GPU with this PCI slot")? .iter() .filter(|process| process.pid == pid as u32) .map(|stats| (stats.sm_util, stats.enc_util, stats.dec_util)) .reduce(|acc, curr| (acc.0 + curr.0, acc.1 + curr.1, acc.2 + curr.2)); let this_process_mem_stats: u64 = NVIDIA_PROCESS_INFOS .read() .unwrap() .get(&pci_slot) .context("couldn't find GPU with this PCI slot")? .iter() .filter(|process| process.pid == pid as u32) .map(|stats| match stats.used_gpu_memory { UsedGpuMemory::Unavailable => 0, UsedGpuMemory::Used(bytes) => bytes, }) .sum(); let gpu_stats = GpuUsageStats::NvidiaStats { gfx_percentage: IntegerPercentage::try_new( this_process_stats.unwrap_or_default().0 as u8, )?, mem_bytes: this_process_mem_stats, enc_percentage: IntegerPercentage::try_new( this_process_stats.unwrap_or_default().1 as u8, )?, dec_percentage: IntegerPercentage::try_new( this_process_stats.unwrap_or_default().2 as u8, )?, }; Ok(gpu_stats) } fn nvidia_process_infos() -> HashMap> { let mut return_map = HashMap::new(); for (pci_slot, gpu) in NVML_DEVICES.iter() { let mut comp_gfx_stats = gpu.running_graphics_processes().unwrap_or_default(); comp_gfx_stats.extend(gpu.running_compute_processes().unwrap_or_default()); return_map.insert(pci_slot.to_owned(), comp_gfx_stats); } return_map } fn nvidia_process_stats() -> HashMap> { let mut return_map = HashMap::new(); for (pci_slot, gpu) in NVML_DEVICES.iter() { return_map.insert( pci_slot.to_owned(), gpu.process_utilization_stats( unix_as_millis() .saturating_mul(1000) .saturating_sub(5_000_000), ) .unwrap_or_default(), ); } return_map } } pub fn unix_as_millis() -> u64 { SystemTime::now() .duration_since(SystemTime::UNIX_EPOCH) .unwrap() .as_millis() as u64 } pub fn unix_as_secs_f64() -> f64 { SystemTime::now() .duration_since(SystemTime::UNIX_EPOCH) .unwrap() .as_secs_f64() } resources-1.9.1/lib/process_data/src/meson.build000066400000000000000000000005251510634446000217070ustar00rootroot00000000000000cargo_options = [ '--manifest-path', meson.project_source_root() / 'lib' / 'process_data' / 'Cargo.toml', ] cargo_options += [ '--target-dir', meson.project_build_root() / 'lib' / 'process_data' / 'src', ] test( 'Cargo tests (process_data)', cargo, args: ['test', cargo_options], timeout: 3600, env: cargo_env, )resources-1.9.1/lib/process_data/src/pci_slot.rs000066400000000000000000000171411510634446000217310ustar00rootroot00000000000000use std::{ fmt::{self, Display}, num::ParseIntError, str::FromStr, }; use serde::{Deserialize, Serialize}; use thiserror::Error; #[derive(Debug, Error, Clone, PartialEq, Eq)] pub enum PciSlotError { #[error("PCI slot number out of bounds (is {0}, must be < 32)")] NumberOutOfBounds(u8), #[error("PCI slot function out of bounds (is {0}, must be < 8)")] FunctionOutOfBounds(u8), #[error("invalid PCI slot format: expected 'domain:bus:number.function'")] InvalidFormat, #[error(transparent)] ParseDomain(ParseIntError), #[error(transparent)] ParseBus(ParseIntError), #[error(transparent)] ParseNumber(ParseIntError), #[error(transparent)] ParseFunction(ParseIntError), } /// Represents a PCI slot identifier. /// /// A PCI slot is uniquely identified by its domain (16 bits), bus (8 bits), number (5 bits), and function (3 bits) fields. #[derive( Debug, Clone, Copy, Serialize, Deserialize, Default, Hash, PartialEq, Eq, PartialOrd, Ord, )] pub struct PciSlot { data: u32, } impl PciSlot { /// Constructs a new `PciSlot` with the specified domain, bus, number, and function. /// /// # Example /// ``` /// use process_data::pci_slot::PciSlot; /// /// let pci_slot = PciSlot::try_new(0x0, 0x1, 0x1b, 0x3).unwrap(); /// assert_eq!(pci_slot.domain(), 0x0); /// assert_eq!(pci_slot.bus(), 0x1); /// assert_eq!(pci_slot.number(), 0x1b); /// assert_eq!(pci_slot.function(), 0x3); /// ``` /// /// # Errors /// Returns a `PciSlotError` error if any of the input values are out of bounds. pub fn try_new(domain: u16, bus: u8, number: u8, function: u8) -> Result { if number > 0x1f { return Err(PciSlotError::NumberOutOfBounds(number)); } if function > 0x7 { return Err(PciSlotError::FunctionOutOfBounds(function)); } Ok(PciSlot { data: (u32::from(domain) << 16) | (u32::from(bus) << 8) | (u32::from(number) << 3) | (u32::from(function)), }) } /// Returns the domain of the PCI slot. pub fn domain(&self) -> u16 { ((self.data >> 16) & 0xffff) as u16 } /// Returns the bus of the PCI slot. pub fn bus(&self) -> u8 { ((self.data >> 8) & 0xff) as u8 } /// Returns the number of the PCI slot. This is always a 5-bit value. pub fn number(&self) -> u8 { ((self.data >> 3) & 0x1f) as u8 } /// Returns the function of the PCI slot. This is always a 3-bit value. pub fn function(&self) -> u8 { (self.data & 0x7) as u8 } } impl FromStr for PciSlot { type Err = PciSlotError; /// Parses a string into a `PciSlot`. /// /// The input string should be in the format "domain:bus:number.function". /// Each component (domain, bus, number, function) must be a valid hexadecimal value. /// /// # Example /// ``` /// use process_data::pci_slot::PciSlot; /// use std::str::FromStr; /// /// let pci_slot = PciSlot::from_str("0000:01:1b.3").unwrap(); /// assert_eq!(pci_slot.domain(), 0x0); /// assert_eq!(pci_slot.bus(), 0x1); /// assert_eq!(pci_slot.number(), 0x1b); /// assert_eq!(pci_slot.function(), 0x3); /// ``` /// /// # Errors /// Returns a `PciSlotError` if the input string could not be parsed or if there are out of bounds values. fn from_str(s: &str) -> Result { // Split the input string by ':' and '.' to extract the domain, bus, number, and function const PCI_SLOT_SEPARATORS: &[char] = &[':', '.']; let parts: Vec<&str> = s.split(|c| PCI_SLOT_SEPARATORS.contains(&c)).collect(); if parts.len() != 4 { return Err(PciSlotError::InvalidFormat); } // Parse each component as a hexadecimal value let domain = u16::from_str_radix(parts[0], 16).map_err(PciSlotError::ParseDomain)?; let bus = u8::from_str_radix(parts[1], 16).map_err(PciSlotError::ParseBus)?; let number = u8::from_str_radix(parts[2], 16).map_err(PciSlotError::ParseNumber)?; let function = u8::from_str_radix(parts[3], 16).map_err(PciSlotError::ParseFunction)?; PciSlot::try_new(domain, bus, number, function) } } impl Display for PciSlot { /// Formats the `PciSlot` as a string in the format "domain:bus:number.function". /// /// # Example /// ``` /// use process_data::pci_slot::PciSlot; /// /// let pci_slot = PciSlot::try_new(0x0, 0x1, 0x1b, 0x3).unwrap(); /// assert_eq!(pci_slot.to_string(), "0000:01:1b.3"); /// ``` fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!( f, "{:04x}:{:02x}:{:02x}.{:x}", self.domain(), self.bus(), self.number(), self.function(), ) } } #[cfg(test)] mod test { use std::str::FromStr; use super::{PciSlot, PciSlotError}; use pretty_assertions::assert_eq; #[test] fn pci_id_from_string() { let pci_id = PciSlot::try_new(0x5, 0x1, 0x1b, 0x3).unwrap(); let pci_id_str = "0005:01:1b.3"; assert_eq!(pci_id, PciSlot::from_str(pci_id_str).unwrap()); } #[test] fn pci_id_to_string() { let pci_id = PciSlot::try_new(0x5, 0x1, 0x1b, 0x3).unwrap(); let pci_id_str = "0005:01:1b.3"; assert_eq!(pci_id_str, pci_id.to_string()); } #[test] fn invalid_format_too_few_parts() { let pci_id_str = "0000:01:1b"; assert_eq!( PciSlot::from_str(pci_id_str).unwrap_err(), PciSlotError::InvalidFormat ); } #[test] fn invalid_format_too_many_parts() { let pci_id_str = "0000:01:1b.3.4"; assert_eq!( PciSlot::from_str(pci_id_str).unwrap_err(), PciSlotError::InvalidFormat ); } #[test] fn invalid_domain_hex_value() { let pci_id_str = "g000:01:1b.3"; assert!(matches!( PciSlot::from_str(pci_id_str).unwrap_err(), PciSlotError::ParseDomain(_) )); } #[test] fn invalid_bus_hex_value() { let pci_id_str = "0000:z1:1b.3"; assert!(matches!( PciSlot::from_str(pci_id_str).unwrap_err(), PciSlotError::ParseBus(_) )); } #[test] fn invalid_number_hex_value() { let pci_id_str = "0000:01:x2.3"; assert!(matches!( PciSlot::from_str(pci_id_str).unwrap_err(), PciSlotError::ParseNumber(_) )); } #[test] fn invalid_function_hex_value() { let pci_id_str = "0000:01:1b.y"; assert!(matches!( PciSlot::from_str(pci_id_str).unwrap_err(), PciSlotError::ParseFunction(_) )); } #[test] fn minimal_valid_values() { let pci_id = PciSlot::try_new(0x0, 0x0, 0x0, 0x0).unwrap(); let pci_id_str = "0000:00:00.0"; assert_eq!(pci_id, PciSlot::from_str(pci_id_str).unwrap()); } #[test] fn maximal_valid_values() { let pci_id = PciSlot::try_new(0xffff, 0xff, 0x1f, 0x7).unwrap(); let pci_id_str = "ffff:ff:1f.7"; assert_eq!(pci_id, PciSlot::from_str(pci_id_str).unwrap()); } #[test] fn number_too_high() { let result = PciSlot::try_new(0x0, 0x0, 0x20, 0x0); assert!(matches!(result, Err(PciSlotError::NumberOutOfBounds(0x20)))); } #[test] fn function_too_high() { let result = PciSlot::try_new(0x0, 0x0, 0x0, 0x8); assert!(matches!( result, Err(PciSlotError::FunctionOutOfBounds(0x8)) )); } } resources-1.9.1/meson.build000066400000000000000000000042451510634446000157060ustar00rootroot00000000000000project( 'resources', 'rust', version: '1.9.1', meson_version: '>= 0.59', ) i18n = import('i18n') gnome = import('gnome') base_id = 'net.nokyan.Resources' dependency('glib-2.0', version: '>= 2.66') dependency('gio-2.0', version: '>= 2.66') dependency('gtk4', version: '>= 4.12.0') dependency('libadwaita-1', version: '>= 1.8.0') glib_compile_resources = find_program('glib-compile-resources', required: true) glib_compile_schemas = find_program('glib-compile-schemas', required: true) desktop_file_validate = find_program('desktop-file-validate', required: false) appstreamcli = find_program('appstreamcli', required: false) cargo = find_program('cargo', required: true) version = meson.project_version() prefix = get_option('prefix') bindir = prefix / get_option('bindir') localedir = prefix / get_option('localedir') libexecdir = prefix / get_option('libexecdir') / meson.project_name() datadir = prefix / get_option('datadir') pkgdatadir = datadir / meson.project_name() iconsdir = datadir / 'icons' podir = meson.project_source_root() / 'po' gettext_package = meson.project_name() if get_option('profile') == 'development' profile = 'Devel' vcs_tag = run_command('git', 'rev-parse', '--short', 'HEAD').stdout().strip() vcs_branch = run_command('git', 'rev-parse', '--abbrev-ref', 'HEAD').stdout().strip() if vcs_tag == '' or vcs_branch == '' version_suffix = '-devel' else version_suffix = '-@0@/@1@'.format(vcs_branch, vcs_tag) endif application_id = '@0@.@1@'.format(base_id, profile) else profile = '' version_suffix = '' application_id = base_id endif meson.add_dist_script( 'build-aux/dist-vendor.sh', meson.project_build_root() / 'meson-dist' / meson.project_name() + '-' + version, meson.project_source_root(), ) if get_option('profile') == 'development' # Setup pre-commit hook for ensuring coding style is always consistent message('Setting up git pre-commit hook..') run_command('cp', '-f', 'hooks/pre-commit.hook', '.git/hooks/pre-commit') endif subdir('data') subdir('po') subdir('src') subdir('lib/process_data/src') gnome.post_install( gtk_update_icon_cache: true, glib_compile_schemas: true, update_desktop_database: true, )resources-1.9.1/meson_options.txt000066400000000000000000000003101510634446000171660ustar00rootroot00000000000000option( 'profile', type: 'combo', choices: [ 'default', 'development' ], value: 'development', description: 'The build profile for Resources. One of "default" or "development".' ) resources-1.9.1/po/000077500000000000000000000000001510634446000141555ustar00rootroot00000000000000resources-1.9.1/po/LINGUAS000066400000000000000000000002261510634446000152020ustar00rootroot00000000000000# Please keep this list sorted alphabetically # ar bg bn cs de el en_GB es eu fa fi fr he hi hu it ja ka nb nl pl pt_BR ru sl sv tr uk uz zh_CN zh_TW resources-1.9.1/po/POTFILES.in000066400000000000000000000025671510634446000157440ustar00rootroot00000000000000# List of source files containing translatable strings. # Please keep this file sorted alphabetically. data/net.nokyan.Resources.desktop.in.in data/net.nokyan.Resources.metainfo.xml.in.in data/net.nokyan.Resources.policy.in.in data/resources/ui/dialogs/app_dialog.ui data/resources/ui/dialogs/process_dialog.ui data/resources/ui/dialogs/process_options_dialog.ui data/resources/ui/dialogs/settings_dialog.ui data/resources/ui/pages/applications.ui data/resources/ui/pages/battery.ui data/resources/ui/pages/cpu.ui data/resources/ui/pages/drive.ui data/resources/ui/pages/gpu.ui data/resources/ui/pages/memory.ui data/resources/ui/pages/network.ui data/resources/ui/pages/npu.ui data/resources/ui/pages/processes.ui data/resources/ui/shortcuts.ui data/resources/ui/window.ui src/application.rs src/ui/dialogs/app_dialog.rs src/ui/dialogs/process_dialog.rs src/ui/dialogs/process_options_dialog.rs src/ui/pages/applications/application_entry.rs src/ui/pages/applications/mod.rs src/ui/pages/battery.rs src/ui/pages/cpu.rs src/ui/pages/drive.rs src/ui/pages/gpu.rs src/ui/pages/memory.rs src/ui/pages/mod.rs src/ui/pages/network.rs src/ui/pages/processes/mod.rs src/ui/pages/processes/process_entry.rs src/ui/window.rs src/utils/app.rs src/utils/battery.rs src/utils/units.rs src/utils/drive.rs src/utils/gpu/mod.rs src/utils/link/mod.rs src/utils/network.rs src/utils/npu/mod.rs src/utils/units.rs resources-1.9.1/po/af_ZA.po000066400000000000000000001160371510634446000155050ustar00rootroot00000000000000# # nokyan , 2023. # msgid "" msgstr "" "Project-Id-Version: resources\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-12 18:38+0200\n" "PO-Revision-Date: 2024-02-17 18:12+0200\n" "Last-Translator: \n" "Language-Team: Afrikaans \n" "Language: af_ZA\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.4.2\n" #: data/net.nokyan.Resources.desktop.in.in:3 #: data/net.nokyan.Resources.metainfo.xml.in.in:4 src/application.rs:196 msgid "Resources" msgstr "Hulpbronne" #. Translators: The summary should be 35 characters or less according to Flathub appstream guidelines #: data/net.nokyan.Resources.desktop.in.in:4 #: data/net.nokyan.Resources.metainfo.xml.in.in:6 msgid "Keep an eye on system resources" msgstr "Hou stelselhulpbronne dop" #: data/net.nokyan.Resources.desktop.in.in:10 msgid "" "System;Resources;Monitor;Processes;Usage;Task;Manager;CPU;RAM;Memory;GPU;" msgstr "" "Stelsel; Hulpbronne; Monitor; Prosesse; Gebruik; Taak; Bestuurder; SVE; RAM; " "Geheue; GPU;" #: data/net.nokyan.Resources.gschema.xml.in:6 msgid "Window width" msgstr "Venster breedte" #: data/net.nokyan.Resources.gschema.xml.in:10 msgid "Window height" msgstr "Venster hoogte" #: data/net.nokyan.Resources.gschema.xml.in:14 msgid "Window maximized state" msgstr "Gemaksimeerde venster toestand" #: data/net.nokyan.Resources.gschema.xml.in:18 msgid "Temperature unit" msgstr "Temperatuur eenheid" #: data/net.nokyan.Resources.gschema.xml.in:22 msgid "Unit Prefix Base" msgstr "Eenheid Voorvoegsel Basis" #: data/net.nokyan.Resources.gschema.xml.in:26 #: data/resources/ui/dialogs/settings_dialog.ui:53 msgid "Refresh Speed" msgstr "Verfris Spoed" #: data/net.nokyan.Resources.gschema.xml.in:30 msgid "Show search field for Processes and Applications on launch" msgstr "Wys soekveld vir Prosesse en toepassings tydens bekendstelling" #: data/net.nokyan.Resources.gschema.xml.in:34 msgid "Show virtual block devices such as LVM containers" msgstr "Wys virtuele bloktoestelle soos LVM-houers" #: data/net.nokyan.Resources.gschema.xml.in:38 msgid "Show virtual network interfaces such as Docker interfaces" msgstr "Wys virtuele netwerkkoppelvlakke soos Docker-koppelvlakke" #: data/net.nokyan.Resources.gschema.xml.in:42 msgid "Show usage details in the sidebar" msgstr "Wys gebruiksbesonderhede in die sidebar" #: data/net.nokyan.Resources.gschema.xml.in:46 msgid "Show device description in the sidebar" msgstr "Wys toestelbeskrywing in die sidebar" #: data/net.nokyan.Resources.gschema.xml.in:50 #: data/resources/ui/dialogs/settings_dialog.ui:103 msgid "Sidebar Meter Type" msgstr "Sidebar Meter Tipe" #: data/net.nokyan.Resources.gschema.xml.in:54 msgid "Display network speeds in bits per second" msgstr "Vertoon netwerksnelhede in bisse per sekonde" #: data/net.nokyan.Resources.gschema.xml.in:58 msgid "Display memory usage in Applications view" msgstr "Vertoon geheuegebruik in toepassingsaansig" #: data/net.nokyan.Resources.gschema.xml.in:62 msgid "Display CPU usage in Applications view" msgstr "Vertoon SVE-gebruik in toepassingsaansig" #: data/net.nokyan.Resources.gschema.xml.in:66 msgid "Display drive read speed in Applications view" msgstr "Vertoon skyfleesspoed in Toepassingsaansig" #: data/net.nokyan.Resources.gschema.xml.in:70 msgid "Display drive read total in Applications view" msgstr "Vertoon skyflees totaal in Toepassingsaansig" #: data/net.nokyan.Resources.gschema.xml.in:74 msgid "Display drive write speed in Applications view" msgstr "Vertoon skyfskryfspoed in Toepassingsaansig" #: data/net.nokyan.Resources.gschema.xml.in:78 msgid "Display drive write total in Applications view" msgstr "Vertoon skyfskryf totaal in Toepassingsaansig" #: data/net.nokyan.Resources.gschema.xml.in:82 msgid "Display GPU usage in Applications view" msgstr "Vertoon GPU-gebruik in toepassingsaansig" #: data/net.nokyan.Resources.gschema.xml.in:86 msgid "Display video encoder usage in Applications view" msgstr "Vertoon videokodeerdergebruik in toepassingsaansig" #: data/net.nokyan.Resources.gschema.xml.in:90 msgid "Display video decoder usage in Applications view" msgstr "Vertoon video-dekodeerdergebruik in Toepassingsaansig" #: data/net.nokyan.Resources.gschema.xml.in:94 msgid "Display GPU memory usage in Applications view" msgstr "Vertoon GPU-geheuegebruik in toepassingsaansig" #: data/net.nokyan.Resources.gschema.xml.in:98 msgid "Display process ID in Processes view" msgstr "Vertoon proses-ID in Prosesseaansig" #: data/net.nokyan.Resources.gschema.xml.in:102 msgid "Display user name in Processes view" msgstr "Vertoon gebruikersnaam in Prosesseaansig" #: data/net.nokyan.Resources.gschema.xml.in:106 msgid "Display memory usage in Processes view" msgstr "Vertoon geheuegebruik in Prosesseaansig" #: data/net.nokyan.Resources.gschema.xml.in:110 msgid "Display CPU usage in Processes view" msgstr "Vertoon SVE-gebruik in Prosesseaansig" #: data/net.nokyan.Resources.gschema.xml.in:114 msgid "Display drive read speed in Processes view" msgstr "Vertoon skyfleesspoed in Prosesseaansig" #: data/net.nokyan.Resources.gschema.xml.in:118 msgid "Display drive read total in Processes view" msgstr "Vertoon skyflees totaal in Prosesseaansig" #: data/net.nokyan.Resources.gschema.xml.in:122 msgid "Display drive write speed in Processes view" msgstr "Vertoon skryfspoed in Prosesseaansig" #: data/net.nokyan.Resources.gschema.xml.in:126 msgid "Display drive write total in Processes view" msgstr "Vertoon skyfskryf totaal in Prosesseaansig" #: data/net.nokyan.Resources.gschema.xml.in:130 msgid "Display GPU usage in Processes view" msgstr "Vertoon GPU-gebruik in Prosesseaansig" #: data/net.nokyan.Resources.gschema.xml.in:134 msgid "Display video encoder usage in Processes view" msgstr "Vertoon videokodeerdergebruik in Prosesseaansig" #: data/net.nokyan.Resources.gschema.xml.in:138 msgid "Display video decoder usage in Processes view" msgstr "Vertoon video-dekodeerdergebruik in Prosesseaansig" #: data/net.nokyan.Resources.gschema.xml.in:142 msgid "Display GPU memory usage in Processes view" msgstr "Vertoon GPU-geheuegebruik in Prosesseaansig" #: data/net.nokyan.Resources.gschema.xml.in:146 msgid "Display logical CPU graphs in Processor view" msgstr "Vertoon logiese SVE-grafieke in verwerkeraansig" #: data/net.nokyan.Resources.gschema.xml.in:150 msgid "Show grids in graphs" msgstr "Wys roosters in grafieke" #: data/net.nokyan.Resources.gschema.xml.in:154 msgid "Amount of data points that should be shown in a graph" msgstr "Hoeveelheid datapunte wat in 'n grafiek getoon moet word" #: data/net.nokyan.Resources.metainfo.xml.in.in:18 msgid "" "Resources allows you to check the utilization of your system resources and " "control your running processes and applications. It’s designed to be user-" "friendly and feel right at home on a modern desktop by using GNOME’s " "libadwaita." msgstr "" "Hulpbronne stel u in staat om die gebruik van u stelselhulpbronne na te gaan " "en u lopende prosesse en toepassings te beheer. Dit is ontwerp om " "gebruikersvriendelik te wees en tuis te voel op 'n moderne lessenaar deur " "GNOME se libadwaita te gebruik." #: data/net.nokyan.Resources.metainfo.xml.in.in:21 msgid "Resources supports monitoring the following components:" msgstr "Hulpbronne ondersteun die monitering van die volgende komponente:" #: data/net.nokyan.Resources.metainfo.xml.in.in:25 src/ui/pages/cpu.rs:221 msgid "CPU" msgstr "SVE" #: data/net.nokyan.Resources.metainfo.xml.in.in:26 #: src/ui/pages/applications/mod.rs:629 src/ui/pages/memory.rs:116 #: src/ui/pages/memory.rs:187 src/ui/pages/processes/mod.rs:714 #: data/resources/ui/window.ui:155 data/resources/ui/window.ui:162 #: data/resources/ui/dialogs/app_dialog.ui:83 #: data/resources/ui/dialogs/process_dialog.ui:70 #: data/resources/ui/dialogs/settings_dialog.ui:127 #: data/resources/ui/dialogs/settings_dialog.ui:198 msgid "Memory" msgstr "Geheue" #: data/net.nokyan.Resources.metainfo.xml.in.in:27 #: src/ui/pages/applications/mod.rs:909 src/ui/pages/gpu.rs:138 #: src/ui/pages/processes/mod.rs:1007 src/ui/window.rs:277 #: data/resources/ui/dialogs/app_dialog.ui:132 #: data/resources/ui/dialogs/process_dialog.ui:115 #: data/resources/ui/dialogs/settings_dialog.ui:157 #: data/resources/ui/dialogs/settings_dialog.ui:228 msgid "GPU" msgstr "GPU" #: data/net.nokyan.Resources.metainfo.xml.in.in:28 #: data/resources/ui/dialogs/settings_dialog.ui:266 msgid "Network Interfaces" msgstr "Netwerk Koppelvlakke" #: data/net.nokyan.Resources.metainfo.xml.in.in:29 msgid "Storage Devices" msgstr "Berging toestelle" #: src/application.rs:198 msgid "The Nalux Team" msgstr "Die Nalux-span" #: src/application.rs:206 msgid "Report Issues" msgstr "Rapporteer kwessies" #. Translator credits. Replace "translator-credits" with your name/username, and optionally an email or URL. #. One name per line, please do not remove previous names. #: src/application.rs:212 msgid "translator-credits" msgstr "odofad github.com/odofad" #: src/application.rs:213 msgid "Icon by" msgstr "Ikoon deur" #: src/ui/dialogs/app_dialog.rs:163 src/ui/dialogs/process_dialog.rs:188 #: src/ui/pages/drive.rs:267 src/ui/pages/drive.rs:273 msgid "No" msgstr "Nee" #: src/ui/dialogs/app_dialog.rs:164 src/ui/dialogs/process_dialog.rs:189 msgid "Yes (Flatpak)" msgstr "Ja (Flatpak)" #: src/ui/dialogs/app_dialog.rs:165 src/ui/dialogs/process_dialog.rs:190 msgid "Yes (Snap)" msgstr "Ja (Snap)" #: src/ui/dialogs/process_dialog.rs:129 src/ui/dialogs/process_dialog.rs:136 #: src/ui/dialogs/process_dialog.rs:143 src/ui/dialogs/process_dialog.rs:150 #: src/ui/dialogs/process_dialog.rs:176 src/ui/dialogs/process_dialog.rs:183 #: src/ui/dialogs/process_dialog.rs:185 src/ui/pages/applications/mod.rs:734 #: src/ui/pages/applications/mod.rs:830 src/ui/pages/cpu.rs:222 #: src/ui/pages/cpu.rs:237 src/ui/pages/cpu.rs:251 src/ui/pages/cpu.rs:257 #: src/ui/pages/cpu.rs:263 src/ui/pages/cpu.rs:269 src/ui/pages/cpu.rs:273 #: src/ui/pages/cpu.rs:276 src/ui/pages/cpu.rs:361 src/ui/pages/gpu.rs:240 #: src/ui/pages/gpu.rs:285 src/ui/pages/gpu.rs:308 src/ui/pages/gpu.rs:311 #: src/ui/pages/gpu.rs:322 src/ui/pages/gpu.rs:344 src/ui/pages/gpu.rs:354 #: src/ui/pages/gpu.rs:366 src/ui/pages/gpu.rs:369 src/ui/pages/gpu.rs:375 #: src/ui/pages/gpu.rs:382 src/ui/pages/gpu.rs:386 src/ui/pages/gpu.rs:389 #: src/ui/pages/memory.rs:222 src/ui/pages/memory.rs:227 #: src/ui/pages/memory.rs:232 src/ui/pages/memory.rs:233 #: src/ui/pages/memory.rs:237 src/ui/pages/memory.rs:242 #: src/ui/pages/memory.rs:251 src/ui/pages/memory.rs:305 #: src/ui/pages/network.rs:238 src/ui/pages/network.rs:246 #: src/ui/pages/network.rs:253 src/ui/pages/network.rs:260 #: src/ui/pages/network.rs:263 src/ui/pages/processes/mod.rs:822 #: src/ui/pages/processes/mod.rs:873 src/ui/pages/processes/mod.rs:924 #: src/ui/pages/processes/mod.rs:975 src/utils/app.rs:674 src/utils/app.rs:750 #: src/utils/drive.rs:90 src/utils/gpu/mod.rs:250 src/utils/gpu/mod.rs:256 msgid "N/A" msgstr "N.V.T" #: src/ui/pages/applications/mod.rs:137 data/resources/ui/window.ui:62 #: data/resources/ui/window.ui:69 #: data/resources/ui/dialogs/settings_dialog.ui:121 msgid "Applications" msgstr "Toepassings" #: src/ui/pages/applications/mod.rs:527 msgid "Running Applications: {}" msgstr "Lopende Toepassings: {}" #: src/ui/pages/applications/mod.rs:556 src/ui/pages/processes/mod.rs:538 msgid "Cancel" msgstr "Kanselleer" #: src/ui/pages/applications/mod.rs:583 msgid "Application" msgstr "Toepassing" #: src/ui/pages/applications/mod.rs:673 src/ui/pages/cpu.rs:136 #: src/ui/pages/processes/mod.rs:761 src/ui/window.rs:316 #: data/resources/ui/window.ui:124 data/resources/ui/window.ui:131 #: data/resources/ui/dialogs/app_dialog.ui:74 #: data/resources/ui/dialogs/process_dialog.ui:61 #: data/resources/ui/dialogs/settings_dialog.ui:132 #: data/resources/ui/dialogs/settings_dialog.ui:203 msgid "Processor" msgstr "Verwerker" #: src/ui/pages/applications/mod.rs:716 src/ui/pages/processes/mod.rs:804 #: data/resources/ui/dialogs/app_dialog.ui:92 #: data/resources/ui/dialogs/process_dialog.ui:75 #: data/resources/ui/dialogs/settings_dialog.ui:137 #: data/resources/ui/dialogs/settings_dialog.ui:208 msgid "Drive Read" msgstr "Skyf Lees" #: src/ui/pages/applications/mod.rs:766 src/ui/pages/processes/mod.rs:855 #: data/resources/ui/dialogs/app_dialog.ui:101 #: data/resources/ui/dialogs/process_dialog.ui:84 #: data/resources/ui/dialogs/settings_dialog.ui:142 #: data/resources/ui/dialogs/settings_dialog.ui:213 msgid "Drive Read Total" msgstr "Skyf Totaal" #: src/ui/pages/applications/mod.rs:812 src/ui/pages/processes/mod.rs:906 #: data/resources/ui/dialogs/app_dialog.ui:110 #: data/resources/ui/dialogs/process_dialog.ui:93 #: data/resources/ui/dialogs/settings_dialog.ui:147 #: data/resources/ui/dialogs/settings_dialog.ui:218 msgid "Drive Write" msgstr "Skyf Skryf" #: src/ui/pages/applications/mod.rs:863 src/ui/pages/processes/mod.rs:957 #: data/resources/ui/dialogs/app_dialog.ui:119 #: data/resources/ui/dialogs/process_dialog.ui:102 #: data/resources/ui/dialogs/settings_dialog.ui:152 #: data/resources/ui/dialogs/settings_dialog.ui:223 msgid "Drive Write Total" msgstr "Skryf Totaal" #: src/ui/pages/applications/mod.rs:952 src/ui/pages/processes/mod.rs:1050 #: data/resources/ui/dialogs/app_dialog.ui:150 #: data/resources/ui/dialogs/process_dialog.ui:133 #: data/resources/ui/dialogs/settings_dialog.ui:167 #: data/resources/ui/dialogs/settings_dialog.ui:238 msgid "Video Encoder" msgstr "Videoenkodeerder" #: src/ui/pages/applications/mod.rs:997 src/ui/pages/processes/mod.rs:1095 #: data/resources/ui/dialogs/app_dialog.ui:159 #: data/resources/ui/dialogs/process_dialog.ui:142 #: data/resources/ui/dialogs/settings_dialog.ui:172 #: data/resources/ui/dialogs/settings_dialog.ui:243 msgid "Video Decoder" msgstr "Videodekodeerder" #: src/ui/pages/applications/mod.rs:1041 src/ui/pages/processes/mod.rs:1140 #: data/resources/ui/dialogs/app_dialog.ui:141 #: data/resources/ui/dialogs/process_dialog.ui:124 #: data/resources/ui/dialogs/settings_dialog.ui:162 #: data/resources/ui/dialogs/settings_dialog.ui:233 msgid "Video Memory" msgstr "Video Geheue" #: src/ui/pages/cpu.rs:236 src/ui/pages/cpu.rs:347 src/ui/pages/cpu.rs:351 msgid "CPU {}" msgstr "SVE {}" #: src/ui/pages/drive.rs:135 msgid "Drive" msgstr "Skyf" #: src/ui/pages/drive.rs:216 msgid "Total Usage" msgstr "Totale Gebruik" #: src/ui/pages/drive.rs:223 msgid "Read Speed" msgstr "Lees Spoed" #: src/ui/pages/drive.rs:227 msgid "Write Speed" msgstr "Skryf Spoed" #: src/ui/pages/drive.rs:265 src/ui/pages/drive.rs:271 msgid "Yes" msgstr "Ja" #: src/ui/pages/drive.rs:339 src/ui/pages/drive.rs:344 #: src/ui/pages/network.rs:309 src/ui/pages/network.rs:318 msgid "Highest:" msgstr "Hoogste:" #. Translators: This is an abbreviation for "Read" and "Write". This is displayed in the sidebar so your #. translation should preferably be quite short or an abbreviation #: src/ui/pages/drive.rs:352 msgid "R: {} · W: {}" msgstr "R: {} · W: {}" #: src/ui/pages/gpu.rs:210 msgid "GPU Usage" msgstr "GPU-gebruik" #: src/ui/pages/gpu.rs:218 msgid "Video Encoder/Decoder Usage" msgstr "Gebruik van video-enkodeerder/dekodeerder" #: src/ui/pages/gpu.rs:224 msgid "Video Encoder Usage" msgstr "Gebruik van videokodeerders" #: src/ui/pages/gpu.rs:229 msgid "Video Decoder Usage" msgstr "Gebruik van videodekodeerder" #: src/ui/pages/gpu.rs:234 msgid "Video Memory Usage" msgstr "Gebruik van videogeheue" #: src/ui/pages/gpu.rs:397 msgid "VRAM: {}" msgstr "VRAM: {}" #: src/ui/pages/memory.rs:193 msgid "Swap" msgstr "Ruil" #: src/ui/pages/memory.rs:247 msgid "{} of {}" msgstr "{} van {}" #: src/ui/pages/memory.rs:250 msgid "{} MT/s" msgstr "{} MT/s" #. Translators: This will be displayed in the sidebar, so your translation for "Swap" should #. preferably be quite short or an abbreviation #: src/ui/pages/memory.rs:324 msgid "{} / {} · Swap: {} %" msgstr "{} / {} · Ruil: {} %" #: src/ui/pages/network.rs:134 src/utils/network.rs:122 msgid "Network Interface" msgstr "Netwerk Koppelvlak" #: src/ui/pages/network.rs:221 msgid "Receiving" msgstr "Ontvang" #: src/ui/pages/network.rs:229 msgid "Sending" msgstr "Stuur" #. Translators: This is an abbreviation for "Receive" and "Send". This is displayed in the sidebar so #. your translation should preferably be quite short or an abbreviation #: src/ui/pages/network.rs:332 msgid "R: {} · S: {}" msgstr "R: {} · S: {}" #: src/ui/pages/processes/mod.rs:145 data/resources/ui/window.ui:93 #: data/resources/ui/window.ui:100 #: data/resources/ui/dialogs/settings_dialog.ui:182 msgid "Processes" msgstr "Prosesse" #: src/ui/pages/processes/mod.rs:506 msgid "Running Processes: {}" msgstr "Lopende Prosesse: {}" #: src/ui/pages/processes/mod.rs:577 msgid "root" msgstr "wortel" #: src/ui/pages/processes/mod.rs:591 msgid "Process" msgstr "Verwerking" #: src/ui/pages/processes/mod.rs:637 #: data/resources/ui/dialogs/process_dialog.ui:156 #: data/resources/ui/dialogs/settings_dialog.ui:188 msgid "Process ID" msgstr "Verwerking ID" #: src/ui/pages/processes/mod.rs:675 #: data/resources/ui/dialogs/process_dialog.ui:183 #: data/resources/ui/dialogs/settings_dialog.ui:193 msgid "User" msgstr "Gebruiker" #: src/ui/window.rs:275 msgid "GPU {}" msgstr "GPU {}" #: src/ui/window.rs:794 msgid "End {}?" msgstr "Eindig {}?" #: src/ui/window.rs:795 msgid "Halt {}?" msgstr "Halt {}?" #: src/ui/window.rs:796 msgid "Kill {}?" msgstr "Dood {}?" #: src/ui/window.rs:797 msgid "Continue {}?" msgstr "Gaan voort {}?" #: src/ui/window.rs:803 msgid "Unsaved work might be lost." msgstr "Ongestoorde werk kan verlore gaan." #: src/ui/window.rs:804 msgid "" "Halting an application can come with serious risks such as losing data and " "security implications. Use with caution." msgstr "" "Om 'n aansoek te staak kan ernstige risiko's meebring, soos die verlies van " "data en sekuriteitsimplikasies. Gebruik met omsigtigheid." #: src/ui/window.rs:805 msgid "" "Killing an application can come with serious risks such as losing data and " "security implications. Use with caution." msgstr "" "Om 'n aansoek te dood kan ernstige risiko's meebring, soos die verlies van " "data en sekuriteitsimplikasies. Gebruik met omsigtigheid." #: src/ui/window.rs:812 msgid "End application" msgstr "Eindig Toepassing" #: src/ui/window.rs:813 msgid "Halt application" msgstr "Halt Toepassing" #: src/ui/window.rs:814 msgid "Kill application" msgstr "Dood Toepassing" #: src/ui/window.rs:815 msgid "Continue application" msgstr "Voort Toepassing" #: src/ui/window.rs:821 msgid "Successfully ended {}" msgstr "Suksesvol geëindig {}" #: src/ui/window.rs:822 msgid "Successfully halted {}" msgstr "Suksesvol gehalt {}" #: src/ui/window.rs:823 msgid "Successfully killed {}" msgstr "Suksesvol gedood {}" #: src/ui/window.rs:824 msgid "Successfully continued {}" msgstr "Suksesvol voortgesit {}" #: src/ui/window.rs:831 msgid "There was a problem ending a process" msgid_plural "There were problems ending {} processes" msgstr[0] "Daar was 'n probleem om 'n proses te beëindig" msgstr[1] "Es gab ein Problem beim Beenden eines Prozesses" #: src/ui/window.rs:837 msgid "There was a problem halting a process" msgid_plural "There were problems halting {} processes" msgstr[0] "Daar was 'n probleem om 'n proses te halt" msgstr[1] "Es gab ein Problem beim Anhalten eines Prozesses" #: src/ui/window.rs:843 msgid "There was a problem killing a process" msgid_plural "There were problems killing {} processes" msgstr[0] "Daar was 'n probleem om 'n proses dood te maak" msgstr[1] "Es gab ein Problem beim Abwürgen eines Prozesses" #: src/ui/window.rs:849 msgid "There was a problem continuing a process" msgid_plural "There were problems continuing {} processes" msgstr[0] "Daar was 'n probleem om 'n proses voort te sit" msgstr[1] "Es gab ein Problem beim Fortsetzen eines Prozesses" #: src/ui/window.rs:859 msgid "There was a problem ending {}" msgstr "Daar was 'n probleem om {} te beëindig" #: src/ui/window.rs:860 msgid "There was a problem halting {}" msgstr "Daar was 'n probleem om {} te halt" #: src/ui/window.rs:861 msgid "There was a problem killing {}" msgstr "Daar was 'n probleem om {} dood te maak" #: src/ui/window.rs:862 msgid "There was a problem continuing {}" msgstr "Daar was 'n probleem om voort te gaan met {}" #: src/utils/app.rs:756 msgid "System Processes" msgstr "Stelsel Prosesse" #: src/utils/drive.rs:82 src/utils/drive.rs:153 msgid "CD/DVD/Blu-ray Drive" msgstr "CD/DVD/Blougolf Skyf" #: src/utils/drive.rs:83 msgid "eMMC Storage" msgstr "eMMC-berging" #: src/utils/drive.rs:84 msgid "Flash Storage" msgstr "Flitsberging" #: src/utils/drive.rs:85 src/utils/drive.rs:154 msgid "Floppy Drive" msgstr "Floppyskyf" #: src/utils/drive.rs:86 msgid "Hard Disk Drive" msgstr "Hardeskyf" #: src/utils/drive.rs:87 msgid "Loop Device" msgstr "Lus toestel" #: src/utils/drive.rs:88 msgid "Mapped Device" msgstr "Gekarteerde toestel" #: src/utils/drive.rs:89 msgid "NVMe Drive" msgstr "NVMe-skyf" #: src/utils/drive.rs:91 msgid "Software Raid" msgstr "Sagteware-RAID" #: src/utils/drive.rs:92 msgid "RAM Disk" msgstr "Geheueskyf" #: src/utils/drive.rs:93 msgid "Solid State Drive" msgstr "Vastetoestandskyf" #: src/utils/drive.rs:94 msgid "ZFS Volume" msgstr "ZFS Volume" #: src/utils/drive.rs:95 msgid "Compressed RAM Disk (zram)" msgstr "Saamgeperste Geheueskyf (zram)" #: src/utils/drive.rs:155 msgid "{} Loop Device" msgstr "{} Lus Toestel" #: src/utils/drive.rs:156 msgid "{} Mapped Device" msgstr "{} Gekarteerde Toestel" #: src/utils/drive.rs:157 msgid "{} RAID" msgstr "{} RAID" #: src/utils/drive.rs:158 msgid "{} RAM Disk" msgstr "{} Geheueskyf" #: src/utils/drive.rs:159 msgid "{} zram Device" msgstr "{} zram Toestel" #: src/utils/drive.rs:160 msgid "{} ZFS Volume" msgstr "{} ZFS Volume" #: src/utils/drive.rs:161 msgid "{} Drive" msgstr "{} Skyf" #: src/utils/network.rs:111 msgid "Bluetooth Tether" msgstr "Bluetooth Tether" #: src/utils/network.rs:112 msgid "Network Bridge" msgstr "Netwerk Brug" #: src/utils/network.rs:113 msgid "Ethernet Connection" msgstr "Ethernet-verbinding" #: src/utils/network.rs:114 msgid "InfiniBand Connection" msgstr "InfiniBand-verbinding" #: src/utils/network.rs:115 msgid "Serial Line IP Connection" msgstr "Seriële lyn IP-verbinding" #: src/utils/network.rs:116 msgid "Virtual Ethernet Device" msgstr "Virtuele Ethernet-toestel" #: src/utils/network.rs:117 msgid "VM Network Bridge" msgstr "VM Netwerk Brug" #: src/utils/network.rs:118 msgid "VPN Tunnel" msgstr "Skynprivaatnetwerk-tonnel" #: src/utils/network.rs:119 msgid "VPN Tunnel (WireGuard)" msgstr "Skynprivaatnetwerk-tonnel (WireGuard)" #: src/utils/network.rs:120 msgid "Wi-Fi Connection" msgstr "Wi-Fi-verbinding" #: src/utils/network.rs:121 msgid "WWAN Connection" msgstr "WWAN-verbinding" #: src/utils/units.rs:51 msgid "{} K" msgstr "{} K" #: src/utils/units.rs:53 msgid "{} °C" msgstr "{} °C" #: src/utils/units.rs:55 msgid "{} °F" msgstr "{} ° F" #: src/utils/units.rs:73 src/utils/units.rs:87 src/utils/units.rs:107 #: src/utils/units.rs:121 msgid "{} B" msgstr "{} B" #: src/utils/units.rs:74 src/utils/units.rs:88 msgid "{} kB" msgstr "{} kB" #: src/utils/units.rs:75 src/utils/units.rs:89 msgid "{} MB" msgstr "{} MB" #: src/utils/units.rs:76 src/utils/units.rs:90 msgid "{} GB" msgstr "{} GB" #: src/utils/units.rs:77 src/utils/units.rs:91 msgid "{} TB" msgstr "{} TB" #: src/utils/units.rs:78 src/utils/units.rs:92 msgid "{} PB" msgstr "{} PB" #: src/utils/units.rs:79 src/utils/units.rs:93 msgid "{} EB" msgstr "{} EB" #: src/utils/units.rs:80 src/utils/units.rs:94 msgid "{} ZB" msgstr "{} ZB" #: src/utils/units.rs:81 src/utils/units.rs:95 msgid "{} YB" msgstr "{} YB" #: src/utils/units.rs:82 src/utils/units.rs:96 msgid "{} RB" msgstr "{} RB" #: src/utils/units.rs:83 src/utils/units.rs:97 msgid "{} QB" msgstr "{} QB" #: src/utils/units.rs:108 src/utils/units.rs:122 msgid "{} KiB" msgstr "{} KiB" #: src/utils/units.rs:109 src/utils/units.rs:123 msgid "{} MiB" msgstr "{} MiB" #: src/utils/units.rs:110 src/utils/units.rs:124 msgid "{} GiB" msgstr "{} GiB" #: src/utils/units.rs:111 src/utils/units.rs:125 msgid "{} TiB" msgstr "{} TiB" #: src/utils/units.rs:112 src/utils/units.rs:126 msgid "{} PiB" msgstr "{} PiB" #: src/utils/units.rs:113 src/utils/units.rs:127 msgid "{} EiB" msgstr "{} EiB" #: src/utils/units.rs:114 src/utils/units.rs:128 msgid "{} ZiB" msgstr "{} ZiB" #: src/utils/units.rs:115 src/utils/units.rs:129 msgid "{} YiB" msgstr "{} YiB" #: src/utils/units.rs:116 src/utils/units.rs:130 msgid "{} RiB" msgstr "{} RiB" #: src/utils/units.rs:117 src/utils/units.rs:131 msgid "{} QiB" msgstr "{} QiB" #: src/utils/units.rs:158 src/utils/units.rs:175 msgid "{} B/s" msgstr "{} B/s" #: src/utils/units.rs:159 msgid "{} kB/s" msgstr "{} kB/s" #: src/utils/units.rs:160 msgid "{} MB/s" msgstr "{} MB/s" #: src/utils/units.rs:161 msgid "{} GB/s" msgstr "{} GB/s" #: src/utils/units.rs:162 msgid "{} TB/s" msgstr "{} TB/s" #: src/utils/units.rs:163 msgid "{} PB/s" msgstr "{} PB/s" #: src/utils/units.rs:164 msgid "{} EB/s" msgstr "{} EB/s" #: src/utils/units.rs:165 msgid "{} ZB/s" msgstr "{} ZB/s" #: src/utils/units.rs:166 msgid "{} YB/s" msgstr "{} YB/s" #: src/utils/units.rs:167 msgid "{} RB/s" msgstr "{} RB/s" #: src/utils/units.rs:168 msgid "{} QB/s" msgstr "{} QB/s" #: src/utils/units.rs:176 msgid "{} KiB/s" msgstr "{} KiB/s" #: src/utils/units.rs:177 msgid "{} MiB/s" msgstr "{} MiB/s" #: src/utils/units.rs:178 msgid "{} GiB/s" msgstr "{} GiB/s" #: src/utils/units.rs:179 msgid "{} TiB/s" msgstr "{} TiB/s" #: src/utils/units.rs:180 msgid "{} PiB/s" msgstr "{} PiB/s" #: src/utils/units.rs:181 msgid "{} EiB/s" msgstr "{} EiB/s" #: src/utils/units.rs:182 msgid "{} ZiB/s" msgstr "{} ZiB/s" #: src/utils/units.rs:183 msgid "{} YiB/s" msgstr "{} YiB/s" #: src/utils/units.rs:184 msgid "{} RiB/s" msgstr "{} RiB/s" #: src/utils/units.rs:185 msgid "{} QiB/s" msgstr "{} QiB/s" #: src/utils/units.rs:192 src/utils/units.rs:209 msgid "{} b/s" msgstr "{} b/s" #: src/utils/units.rs:193 msgid "{} kb/s" msgstr "{} KB/S" #: src/utils/units.rs:194 msgid "{} Mb/s" msgstr "{} Mb/s" #: src/utils/units.rs:195 msgid "{} Gb/s" msgstr "{} Gb/s" #: src/utils/units.rs:196 msgid "{} Tb/s" msgstr "{} Tb/s" #: src/utils/units.rs:197 msgid "{} Pb/s" msgstr "{} Pb/s" #: src/utils/units.rs:198 msgid "{} Eb/s" msgstr "{} Eb/s" #: src/utils/units.rs:199 msgid "{} Zb/s" msgstr "{} Zb/s" #: src/utils/units.rs:200 msgid "{} Yb/s" msgstr "{} Yb/s" #: src/utils/units.rs:201 msgid "{} Rb/s" msgstr "{} Rb/s" #: src/utils/units.rs:202 msgid "{} Qb/s" msgstr "{} Qb/s" #: src/utils/units.rs:210 msgid "{} Kib/s" msgstr "{} Kib/s" #: src/utils/units.rs:211 msgid "{} Mib/s" msgstr "{} Mib/s" #: src/utils/units.rs:212 msgid "{} Gib/s" msgstr "{} Gib/s" #: src/utils/units.rs:213 msgid "{} Tib/s" msgstr "{} Tib/s" #: src/utils/units.rs:214 msgid "{} Pib/s" msgstr "{} Pib/s" #: src/utils/units.rs:215 msgid "{} Eib/s" msgstr "{} Eib/s" #: src/utils/units.rs:216 msgid "{} Zib/s" msgstr "{} Zib/s" #: src/utils/units.rs:217 msgid "{} Yib/s" msgstr "{} Yib/s" #: src/utils/units.rs:218 msgid "{} Rib/s" msgstr "{} Rib/s" #: src/utils/units.rs:219 msgid "{} Qib/s" msgstr "{} Qib/s" #: src/utils/units.rs:226 msgid "{} Hz" msgstr "{} Hz" #: src/utils/units.rs:227 msgid "{} kHz" msgstr "{} kHz" #: src/utils/units.rs:228 msgid "{} MHz" msgstr "{} MHz" #: src/utils/units.rs:229 msgid "{} GHz" msgstr "{} GHz" #: src/utils/units.rs:230 msgid "{} THz" msgstr "{} THz" #: src/utils/units.rs:231 msgid "{} PHz" msgstr "{} PHz" #: src/utils/units.rs:232 msgid "{} EHz" msgstr "{} EHz" #: src/utils/units.rs:233 msgid "{} ZHz" msgstr "{} ZHz" #: src/utils/units.rs:234 msgid "{} YHz" msgstr "{} YHz" #: src/utils/units.rs:235 msgid "{} RHz" msgstr "{} RHz" #: src/utils/units.rs:236 msgid "{} QHz" msgstr "{} QHz" #: src/utils/units.rs:243 msgid "{} W" msgstr "{} W" #: src/utils/units.rs:244 msgid "{} kW" msgstr "{} kW" #: src/utils/units.rs:245 msgid "{} MW" msgstr "{} MW" #: src/utils/units.rs:246 msgid "{} GW" msgstr "{} GW" #: src/utils/units.rs:247 msgid "{} TW" msgstr "{} TW" #: src/utils/units.rs:248 msgid "{} PW" msgstr "{} PW" #: src/utils/units.rs:249 msgid "{} EW" msgstr "{} EW" #: src/utils/units.rs:250 msgid "{} ZW" msgstr "{} ZW" #: src/utils/units.rs:251 msgid "{} YW" msgstr "{} YW" #: src/utils/units.rs:252 msgid "{} RW" msgstr "{} RW" #: src/utils/units.rs:253 msgid "{} QW" msgstr "{} QW" #: data/resources/ui/shortcuts.ui:11 msgctxt "shortcut window" msgid "General" msgstr "Algemeen" #: data/resources/ui/shortcuts.ui:14 msgctxt "shortcut window" msgid "Preferences" msgstr "Voorkeure" #: data/resources/ui/shortcuts.ui:20 msgctxt "shortcut window" msgid "Show Shortcuts" msgstr "Wys Kortpaaie" #: data/resources/ui/shortcuts.ui:26 msgctxt "shortcut window" msgid "Quit" msgstr "Sluit" #: data/resources/ui/shortcuts.ui:32 msgctxt "shortcut window" msgid "Toggle Search Field" msgstr "Wissel Soekveld" #: data/resources/ui/shortcuts.ui:38 msgctxt "shortcut window" msgid "End Application/Process" msgstr "Beëindig Toepassing/Proses" #: data/resources/ui/shortcuts.ui:44 msgctxt "shortcut window" msgid "Kill Application/Process" msgstr "Dood Toepassing/Proses" #: data/resources/ui/shortcuts.ui:50 msgctxt "shortcut window" msgid "Halt Application/Process" msgstr "Stop Toepassing/Proses" #: data/resources/ui/shortcuts.ui:56 msgctxt "shortcut window" msgid "Continue Application/Process" msgstr "Gaan voort met Toepassing/Proses" #: data/resources/ui/shortcuts.ui:62 msgctxt "shortcut window" msgid "Show Information for Application/Process" msgstr "Wys inligting vir Toepassing/Proses" #: data/resources/ui/window.ui:6 msgid "Preferences" msgstr "Voorkeure" #: data/resources/ui/window.ui:10 msgid "Keyboard Shortcuts" msgstr "Kortpadsleutels" #: data/resources/ui/window.ui:14 msgid "About Resources" msgstr "Oor Hulpbronne" #: data/resources/ui/dialogs/app_dialog.ui:9 msgid "Application Information" msgstr "Toepassing Inligting" #: data/resources/ui/dialogs/app_dialog.ui:71 #: data/resources/ui/dialogs/process_dialog.ui:54 #: data/resources/ui/pages/cpu.ui:42 data/resources/ui/pages/cpu.ui:55 #: data/resources/ui/pages/drive.ui:22 data/resources/ui/pages/gpu.ui:22 #: data/resources/ui/pages/memory.ui:31 data/resources/ui/pages/network.ui:22 msgid "Usage" msgstr "Verbruik" #: data/resources/ui/dialogs/app_dialog.ui:166 #: data/resources/ui/dialogs/process_dialog.ui:149 #: data/resources/ui/pages/applications.ui:26 data/resources/ui/pages/cpu.ui:91 #: data/resources/ui/pages/drive.ui:36 data/resources/ui/pages/gpu.ui:80 #: data/resources/ui/pages/memory.ui:42 data/resources/ui/pages/network.ui:51 #: data/resources/ui/pages/processes.ui:26 msgid "Properties" msgstr "Eienskappe" #: data/resources/ui/dialogs/app_dialog.ui:172 msgid "ID" msgstr "ID" #: data/resources/ui/dialogs/app_dialog.ui:182 #: data/resources/ui/dialogs/process_dialog.ui:165 msgid "Running Since" msgstr "Hardloop sedert" #: data/resources/ui/dialogs/app_dialog.ui:190 msgid "Running Processes" msgstr "Lopende prosesse" #: data/resources/ui/dialogs/app_dialog.ui:199 #: data/resources/ui/dialogs/process_dialog.ui:201 msgid "Containerized" msgstr "Gehouer" #: data/resources/ui/dialogs/process_dialog.ui:9 msgid "Process Information" msgstr "Verwerk inligting" #: data/resources/ui/dialogs/process_dialog.ui:174 msgid "Commandline" msgstr "Opdraglyn" #: data/resources/ui/dialogs/process_dialog.ui:192 msgid "Control Group" msgstr "Kontrolegroep" #: data/resources/ui/dialogs/settings_dialog.ui:10 msgid "General" msgstr "Algemeen" #: data/resources/ui/dialogs/settings_dialog.ui:13 msgid "Units" msgstr "Eenhede" #: data/resources/ui/dialogs/settings_dialog.ui:16 msgid "Data Unit Prefix" msgstr "Data-eenheid Voorvoegsel" #: data/resources/ui/dialogs/settings_dialog.ui:20 msgid "Decimal" msgstr "Desimale" #: data/resources/ui/dialogs/settings_dialog.ui:21 msgid "Binary" msgstr "Binêre" #: data/resources/ui/dialogs/settings_dialog.ui:29 msgid "Show Network Speeds in Bits per Second" msgstr "Wys netwerksnelhede in bisse per sekonde" #: data/resources/ui/dialogs/settings_dialog.ui:34 msgid "Temperature Unit" msgstr "Temperatuur eenheid" #: data/resources/ui/dialogs/settings_dialog.ui:38 msgid "Celsius" msgstr "Celsius" #: data/resources/ui/dialogs/settings_dialog.ui:39 msgid "Kelvin" msgstr "Kelvin" #: data/resources/ui/dialogs/settings_dialog.ui:40 msgid "Fahrenheit" msgstr "Fahrenheit" #: data/resources/ui/dialogs/settings_dialog.ui:50 msgid "User Interface" msgstr "Gebruikerskoppelvlak" #: data/resources/ui/dialogs/settings_dialog.ui:57 msgid "Very Slow" msgstr "Baie stadig" #: data/resources/ui/dialogs/settings_dialog.ui:58 msgid "Slow" msgstr "Stadige" #: data/resources/ui/dialogs/settings_dialog.ui:59 msgid "Normal" msgstr "Normaal" #: data/resources/ui/dialogs/settings_dialog.ui:60 msgid "Fast" msgstr "Vinnig" #: data/resources/ui/dialogs/settings_dialog.ui:61 msgid "Very Fast" msgstr "Baie vinnig" #: data/resources/ui/dialogs/settings_dialog.ui:69 msgid "Show Graph Grids" msgstr "Wys grafiekroosters" #: data/resources/ui/dialogs/settings_dialog.ui:74 msgid "Graph Data Points" msgstr "Grafiek data punte" #: data/resources/ui/dialogs/settings_dialog.ui:88 msgid "Show Search Fields on Launch" msgstr "Wys soekvelde by bekendstelling" #: data/resources/ui/dialogs/settings_dialog.ui:93 msgid "Show Usage Details in Sidebar" msgstr "Wys Gebruiksbesonderhede in Sidebar" #: data/resources/ui/dialogs/settings_dialog.ui:98 msgid "Show Device Descriptions in Sidebar" msgstr "Wys Toestelbeskrywings in Sidebar" #: data/resources/ui/dialogs/settings_dialog.ui:107 msgid "Bar" msgstr "Balk" #: data/resources/ui/dialogs/settings_dialog.ui:108 msgid "Graph" msgstr "Grafiek" #: data/resources/ui/dialogs/settings_dialog.ui:124 #: data/resources/ui/dialogs/settings_dialog.ui:185 msgid "Information Columns" msgstr "Inligting Kolomme" #: data/resources/ui/dialogs/settings_dialog.ui:253 msgid "Devices" msgstr "Toestelle" #: data/resources/ui/dialogs/settings_dialog.ui:256 msgid "Drives" msgstr "Aandrywers" #: data/resources/ui/dialogs/settings_dialog.ui:259 msgid "Show Virtual Drives" msgstr "Wys Virtuele Skywe" #: data/resources/ui/dialogs/settings_dialog.ui:269 msgid "Show Virtual Network Interfaces" msgstr "Wys Virtuele Netwerkkoppelvlakke" #: data/resources/ui/pages/applications.ui:6 #: data/resources/ui/pages/applications.ui:36 msgid "Kill Application" msgstr "Dood Toepassing" #: data/resources/ui/pages/applications.ui:10 #: data/resources/ui/pages/applications.ui:40 msgid "Halt Application" msgstr "Halt Toepassing" #: data/resources/ui/pages/applications.ui:14 #: data/resources/ui/pages/applications.ui:44 msgid "Continue Application" msgstr "Voort Toepassing" #: data/resources/ui/pages/applications.ui:32 #: data/resources/ui/pages/applications.ui:111 msgid "End Application" msgstr "Eindig Toepassing" #: data/resources/ui/pages/cpu.ui:22 msgid "Options" msgstr "Opsies" #: data/resources/ui/pages/cpu.ui:26 msgid "Show Usages of Logical CPUs" msgstr "Toon gebruike van logiese SVE's" #: data/resources/ui/pages/cpu.ui:77 data/resources/ui/pages/gpu.ui:66 msgid "Sensors" msgstr "Sensors" #: data/resources/ui/pages/cpu.ui:84 data/resources/ui/pages/gpu.ui:69 msgid "Temperature" msgstr "Temperatuur" #: data/resources/ui/pages/cpu.ui:98 msgid "Max Frequency" msgstr "Maksimum frekwensie" #: data/resources/ui/pages/cpu.ui:107 msgid "Logical Cores" msgstr "Logiese kerne" #: data/resources/ui/pages/cpu.ui:116 msgid "Physical Cores" msgstr "Fisiese kerne" #: data/resources/ui/pages/cpu.ui:125 msgid "Sockets" msgstr "Houers" #: data/resources/ui/pages/cpu.ui:134 msgid "Virtualization" msgstr "Virtualisering" #: data/resources/ui/pages/cpu.ui:143 msgid "Architecture" msgstr "Argitektuur" #: data/resources/ui/pages/drive.ui:39 data/resources/ui/pages/memory.ui:72 msgid "Type" msgstr "Tipe" #: data/resources/ui/pages/drive.ui:48 msgid "Device" msgstr "Toestel" #: data/resources/ui/pages/drive.ui:57 msgid "Capacity" msgstr "Kapasiteit" #: data/resources/ui/pages/drive.ui:66 msgid "Writable" msgstr "Skryfbare" #: data/resources/ui/pages/drive.ui:75 msgid "Removable" msgstr "Verwyderbare" #: data/resources/ui/pages/gpu.ui:37 msgid "GPU Frequency" msgstr "GPU frekwensie" #: data/resources/ui/pages/gpu.ui:50 msgid "Video Memory Frequency" msgstr "Videogeheue Frekwensie" #: data/resources/ui/pages/gpu.ui:55 msgid "Power Usage" msgstr "Kragverbruik" #: data/resources/ui/pages/gpu.ui:87 data/resources/ui/pages/network.ui:58 msgid "Manufacturer" msgstr "Vervaardiger" #: data/resources/ui/pages/gpu.ui:96 msgid "PCI Slot" msgstr "PCI-gleuf" #: data/resources/ui/pages/gpu.ui:105 data/resources/ui/pages/network.ui:67 msgid "Driver Used" msgstr "Aandrywer gebruik" #: data/resources/ui/pages/gpu.ui:114 msgid "Current Power Cap" msgstr "Huidige kragverbruiksplafon" #: data/resources/ui/pages/gpu.ui:123 msgid "Max Power Cap" msgstr "Maksimum kragverbruiksplafon" #: data/resources/ui/pages/memory.ui:9 msgid "You need to authenticate to see memory properties" msgstr "U moet verifieer om geheue-eienskappe te sien" #: data/resources/ui/pages/memory.ui:10 msgid "Authenticate" msgstr "Verifieer" #: data/resources/ui/pages/memory.ui:45 msgid "Slots Used" msgstr "Slots Gebruik" #: data/resources/ui/pages/memory.ui:54 msgid "Speed" msgstr "Spoed" #: data/resources/ui/pages/memory.ui:63 msgid "Form Factor" msgstr "Vorm Faktor" #: data/resources/ui/pages/memory.ui:81 msgid "Type Detail" msgstr "Tipe Besonderhede" #: data/resources/ui/pages/network.ui:35 msgid "Total Received" msgstr "Totaal Ontvang" #: data/resources/ui/pages/network.ui:44 msgid "Total Sent" msgstr "Totaal Gestuur" #: data/resources/ui/pages/network.ui:76 msgid "Interface" msgstr "Koppelvlak" #: data/resources/ui/pages/network.ui:85 msgid "Hardware Address" msgstr "Hardeware Adres" #: data/resources/ui/pages/processes.ui:6 #: data/resources/ui/pages/processes.ui:36 msgid "Kill Process" msgstr "Dood proses" #: data/resources/ui/pages/processes.ui:10 #: data/resources/ui/pages/processes.ui:40 msgid "Halt Process" msgstr "Halt Proses" #: data/resources/ui/pages/processes.ui:14 #: data/resources/ui/pages/processes.ui:44 msgid "Continue Process" msgstr "Voort Proses" #: data/resources/ui/pages/processes.ui:32 #: data/resources/ui/pages/processes.ui:111 msgid "End Process" msgstr "Einding Proses" msgid "Monitor your system resources and processes" msgstr "Monitor u stelselhulpbronne en -prosesse" msgid "Show Network Speeds in Bits" msgstr "Wys netwerksnelhede in Bisse" msgid "Monitor your Resources and Processes" msgstr "Monitor jou hulpbronne en prosesse" msgid "A simple yet powerful monitor for your system resources and processes." msgstr "" "'N Eenvoudige, maar kragtige monitor vir u stelselhulpbronne en -prosesse." msgid "{} {}B Drive" msgstr "{}-{}B-Skyf" msgid "" "Killing a process can come with serious risks such as losing data and " "security implications. Use with caution." msgstr "" "Die doodmaak van 'n proses kan ernstige risiko's inhou, soos die verlies van " "data en veiligheidsimplikasies. Gebruik versigtig." msgid "" "Halting a process can come with serious risks such as losing data and " "security implications. Use with caution." msgstr "" "Die staking van 'n proses kan ernstige risiko's inhou, soos die verlies van " "data en veiligheidsimplikasies. Gebruik versigtig." resources-1.9.1/po/ar.po000066400000000000000000001565641510634446000151400ustar00rootroot00000000000000# Arabic translation of Resources. # Copyright (C) 2025 Resources's COPYRIGHT HOLDER # This file is distributed under the same license as the Resources package.. # Ahmed Najmawi , 2025. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-03-05 18:24+0100\n" "PO-Revision-Date: 2025-05-06 17:46+0300\n" "Last-Translator: Ahmed Najmawi \n" "Language-Team: \n" "Language: ar\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=6; plural=(n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5);\n" "X-Generator: Poedit 3.4.4\n" #: data/net.nokyan.Resources.desktop.in.in:3 data/net.nokyan.Resources.metainfo.xml.in.in:4 src/application.rs:265 data/resources/ui/window.ui:22 msgid "Resources" msgstr "موارد" #. Translators: The summary should be 35 characters or less according to Flathub appstream guidelines #: data/net.nokyan.Resources.desktop.in.in:4 data/net.nokyan.Resources.metainfo.xml.in.in:5 msgid "Keep an eye on system resources" msgstr "راقب موارد النظام عن كثب" #: data/net.nokyan.Resources.desktop.in.in:10 msgid "System;Resources;Monitor;Processes;Usage;Task;Manager;CPU;RAM;Memory;GPU;" msgstr "النظام;موارد;مراقب;مرقاب;عمليات;استعمال;مهام;مدير;معالج;ذاكرة;رسوميات;" #: data/net.nokyan.Resources.metainfo.xml.in.in:17 msgid "" "Resources allows you to check the utilization of your system resources and control your running processes and apps. It’s designed to be user-friendly and feel right at home on a modern desktop by " "using GNOME’s libadwaita." msgstr "يتيح لك «موارد» التحقق من مدى استعمال موارد نظامك والتحكم في العمليات والتطبيقات قيد التشغيل. صُمِّم ليكون سهل الاستخدام ومتآلفًا مع سطح المكتب الحديث عبر استخدام مكتبة أدوايتا من جنوم." #: data/net.nokyan.Resources.metainfo.xml.in.in:20 msgid "Resources supports monitoring the following components:" msgstr "يدعم «موارد» مراقبة المكونات التالية:" #: data/net.nokyan.Resources.metainfo.xml.in.in:24 msgid "CPU" msgstr "المُعالج" #: data/net.nokyan.Resources.metainfo.xml.in.in:25 src/ui/pages/applications/mod.rs:802 src/ui/pages/memory.rs:106 src/ui/pages/memory.rs:191 src/ui/pages/processes/mod.rs:1078 #: data/resources/ui/window.ui:176 data/resources/ui/window.ui:183 data/resources/ui/dialogs/app_dialog.ui:82 data/resources/ui/dialogs/process_dialog.ui:64 #: data/resources/ui/dialogs/settings_dialog.ui:128 data/resources/ui/dialogs/settings_dialog.ui:220 msgid "Memory" msgstr "الذاكرة" #: data/net.nokyan.Resources.metainfo.xml.in.in:26 src/ui/pages/applications/mod.rs:1175 src/ui/pages/gpu.rs:118 src/ui/pages/processes/mod.rs:1462 src/ui/window.rs:454 #: data/resources/ui/dialogs/app_dialog.ui:140 data/resources/ui/dialogs/process_dialog.ui:118 data/resources/ui/dialogs/settings_dialog.ui:158 data/resources/ui/dialogs/settings_dialog.ui:250 msgid "GPU" msgstr "معالج الرسوميات" #: data/net.nokyan.Resources.metainfo.xml.in.in:27 data/resources/ui/dialogs/settings_dialog.ui:319 msgid "Network Interfaces" msgstr "واجهات الشبكة" #: data/net.nokyan.Resources.metainfo.xml.in.in:28 msgid "Storage Devices" msgstr "أجهزة التخزين" #: data/net.nokyan.Resources.metainfo.xml.in.in:29 msgid "Batteries" msgstr "البطاريات" #: data/net.nokyan.Resources.metainfo.xml.in.in:51 msgid "Apps page in light theme" msgstr "صفحة التطبيقات بالسمة الفاتحة" #: data/net.nokyan.Resources.metainfo.xml.in.in:55 msgid "Processes page in dark theme" msgstr "صفحة العمليات بالسمة الداكنة" #: data/net.nokyan.Resources.metainfo.xml.in.in:59 msgid "Processor page in light theme" msgstr "صفحة المعالج بالسمة الفاتحة" #: data/net.nokyan.Resources.metainfo.xml.in.in:63 msgid "Memory page in dark theme" msgstr "صفحة الذاكرة بالسمة الداكنة" #: data/net.nokyan.Resources.metainfo.xml.in.in:67 msgid "GPU page in light theme" msgstr "صفحة معالج الرسوميات بالسمة الفاتحة" #: data/net.nokyan.Resources.metainfo.xml.in.in:71 msgid "Drive page in dark theme" msgstr "صفحة القرص بالسمة الداكنة" #: data/net.nokyan.Resources.metainfo.xml.in.in:75 msgid "Network Interface page in light theme" msgstr "صفحة واجهة الشبكة بالسمة الفاتحة" #: data/net.nokyan.Resources.metainfo.xml.in.in:79 msgid "Battery page in dark theme" msgstr "صفحة البطارية بالسمة الداكنة" #: src/application.rs:267 msgid "The Nalux Team" msgstr "فريق نالُكس" #: src/application.rs:275 msgid "Report Issues" msgstr "أبلِغ عن العلل" #. Translator credits. Replace "translator-credits" with your name/username, and optionally an email or URL. #. One name per line, please do not remove previous names. #: src/application.rs:281 msgid "translator-credits" msgstr "أحمد النجماوي " #: src/application.rs:282 msgid "Icon by" msgstr "صَمَّمَ الأيقونة" #: src/ui/dialogs/app_dialog.rs:153 src/ui/dialogs/process_dialog.rs:131 src/ui/dialogs/process_dialog.rs:135 src/ui/dialogs/process_dialog.rs:144 src/ui/dialogs/process_dialog.rs:146 #: src/ui/dialogs/process_dialog.rs:169 src/ui/dialogs/process_dialog.rs:176 src/ui/dialogs/process_dialog.rs:183 src/ui/dialogs/process_dialog.rs:190 src/ui/pages/applications/mod.rs:945 #: src/ui/pages/applications/mod.rs:1069 src/ui/pages/battery.rs:204 src/ui/pages/battery.rs:224 src/ui/pages/battery.rs:230 src/ui/pages/battery.rs:233 src/ui/pages/battery.rs:264 #: src/ui/pages/battery.rs:288 src/ui/pages/battery.rs:290 src/ui/pages/battery.rs:300 src/ui/pages/cpu.rs:237 src/ui/pages/cpu.rs:252 src/ui/pages/cpu.rs:271 src/ui/pages/cpu.rs:277 #: src/ui/pages/cpu.rs:283 src/ui/pages/cpu.rs:289 src/ui/pages/cpu.rs:293 src/ui/pages/cpu.rs:296 src/ui/pages/cpu.rs:420 src/ui/pages/drive.rs:315 src/ui/pages/drive.rs:346 src/ui/pages/drive.rs:348 #: src/ui/pages/drive.rs:377 src/ui/pages/drive.rs:379 src/ui/pages/drive.rs:395 src/ui/pages/drive.rs:396 src/ui/pages/drive.rs:403 src/ui/pages/drive.rs:413 src/ui/pages/drive.rs:423 #: src/ui/pages/drive.rs:429 src/ui/pages/gpu.rs:243 src/ui/pages/gpu.rs:250 src/ui/pages/gpu.rs:295 src/ui/pages/gpu.rs:320 src/ui/pages/gpu.rs:323 src/ui/pages/gpu.rs:334 src/ui/pages/gpu.rs:354 #: src/ui/pages/gpu.rs:366 src/ui/pages/gpu.rs:377 src/ui/pages/gpu.rs:389 src/ui/pages/gpu.rs:396 src/ui/pages/gpu.rs:400 src/ui/pages/gpu.rs:430 src/ui/pages/gpu.rs:436 src/ui/pages/memory.rs:226 #: src/ui/pages/memory.rs:227 src/ui/pages/memory.rs:231 src/ui/pages/memory.rs:232 src/ui/pages/memory.rs:236 src/ui/pages/memory.rs:237 src/ui/pages/memory.rs:265 src/ui/pages/memory.rs:326 #: src/ui/pages/network.rs:240 src/ui/pages/network.rs:247 src/ui/pages/network.rs:254 src/ui/pages/network.rs:260 src/ui/pages/network.rs:263 src/ui/pages/network.rs:270 src/ui/pages/network.rs:335 #: src/ui/pages/network.rs:338 src/ui/pages/network.rs:340 src/ui/pages/network.rs:369 src/ui/pages/network.rs:372 src/ui/pages/network.rs:374 src/ui/pages/npu.rs:217 src/ui/pages/npu.rs:253 #: src/ui/pages/npu.rs:308 src/ui/pages/npu.rs:317 src/ui/pages/npu.rs:329 src/ui/pages/npu.rs:336 src/ui/pages/npu.rs:340 src/ui/pages/npu.rs:361 src/ui/pages/npu.rs:367 #: src/ui/pages/processes/mod.rs:1220 src/ui/pages/processes/mod.rs:1286 src/ui/pages/processes/mod.rs:1352 src/ui/pages/processes/mod.rs:1418 src/ui/pages/processes/mod.rs:1900 #: src/ui/pages/processes/mod.rs:1902 src/utils/battery.rs:149 src/utils/drive.rs:136 src/utils/gpu/mod.rs:284 src/utils/gpu/mod.rs:296 src/utils/link.rs:314 src/utils/npu/mod.rs:260 #: src/utils/npu/mod.rs:266 msgid "N/A" msgstr "غير متوفر" #: src/ui/dialogs/process_options_dialog.rs:145 src/ui/pages/cpu.rs:251 src/ui/pages/cpu.rs:389 src/ui/pages/cpu.rs:393 msgid "CPU {}" msgstr "المعالج {}" #: src/ui/pages/applications/application_entry.rs:190 src/ui/pages/drive.rs:410 src/ui/pages/drive.rs:420 src/ui/pages/processes/process_entry.rs:211 msgid "No" msgstr "لا" #: src/ui/pages/applications/application_entry.rs:191 src/ui/pages/processes/process_entry.rs:212 msgid "Yes (Flatpak)" msgstr "نعم (فلاتباك)" #: src/ui/pages/applications/application_entry.rs:192 src/ui/pages/processes/process_entry.rs:213 msgid "Yes (Snap)" msgstr "نعم (سناب)" #: src/ui/pages/applications/mod.rs:131 data/resources/ui/window.ui:65 data/resources/ui/window.ui:72 data/resources/ui/dialogs/settings_dialog.ui:122 msgid "Apps" msgstr "التطبيقات" #. -1 because we don't want to count System Processes #: src/ui/pages/applications/mod.rs:659 msgid "Running Apps: {}" msgstr "التطبيقات قيد التشغيل: {}" #: src/ui/pages/applications/mod.rs:699 src/ui/pages/processes/mod.rs:861 msgid "Cancel" msgstr "ألغِ" #: src/ui/pages/applications/mod.rs:745 msgid "App" msgstr "التطبيق" #: src/ui/pages/applications/mod.rs:861 src/ui/pages/cpu.rs:123 src/ui/pages/processes/mod.rs:1136 src/ui/window.rs:289 data/resources/ui/window.ui:145 data/resources/ui/window.ui:152 #: data/resources/ui/dialogs/app_dialog.ui:73 data/resources/ui/dialogs/process_dialog.ui:55 data/resources/ui/dialogs/settings_dialog.ui:133 data/resources/ui/dialogs/settings_dialog.ui:225 msgid "Processor" msgstr "المُعالج" #: src/ui/pages/applications/mod.rs:924 src/ui/pages/processes/mod.rs:1199 data/resources/ui/dialogs/app_dialog.ui:100 data/resources/ui/dialogs/process_dialog.ui:78 #: data/resources/ui/dialogs/settings_dialog.ui:138 data/resources/ui/dialogs/settings_dialog.ui:230 msgid "Drive Read" msgstr "قراءة محرك الأقراص" #: src/ui/pages/applications/mod.rs:988 src/ui/pages/processes/mod.rs:1265 data/resources/ui/dialogs/app_dialog.ui:109 data/resources/ui/dialogs/process_dialog.ui:87 #: data/resources/ui/dialogs/settings_dialog.ui:143 data/resources/ui/dialogs/settings_dialog.ui:235 msgid "Drive Read Total" msgstr "إجمالي قراءة محرك الأقراص" #: src/ui/pages/applications/mod.rs:1048 src/ui/pages/processes/mod.rs:1331 data/resources/ui/dialogs/app_dialog.ui:118 data/resources/ui/dialogs/process_dialog.ui:96 #: data/resources/ui/dialogs/settings_dialog.ui:148 data/resources/ui/dialogs/settings_dialog.ui:240 msgid "Drive Write" msgstr "كتابة محرك الأقراص" #: src/ui/pages/applications/mod.rs:1114 src/ui/pages/processes/mod.rs:1397 data/resources/ui/dialogs/app_dialog.ui:127 data/resources/ui/dialogs/process_dialog.ui:105 #: data/resources/ui/dialogs/settings_dialog.ui:153 data/resources/ui/dialogs/settings_dialog.ui:245 msgid "Drive Write Total" msgstr "إجمالي كتابة محرك الأقراص" #: src/ui/pages/applications/mod.rs:1233 src/ui/pages/processes/mod.rs:1520 data/resources/ui/dialogs/app_dialog.ui:158 data/resources/ui/dialogs/process_dialog.ui:136 #: data/resources/ui/dialogs/settings_dialog.ui:168 data/resources/ui/dialogs/settings_dialog.ui:260 msgid "Video Encoder" msgstr "مرمِّز الفيديو" #: src/ui/pages/applications/mod.rs:1293 src/ui/pages/processes/mod.rs:1580 data/resources/ui/dialogs/app_dialog.ui:167 data/resources/ui/dialogs/process_dialog.ui:145 #: data/resources/ui/dialogs/settings_dialog.ui:173 data/resources/ui/dialogs/settings_dialog.ui:265 msgid "Video Decoder" msgstr "فاكّ ترميز الفيديو" #: src/ui/pages/applications/mod.rs:1352 src/ui/pages/processes/mod.rs:1640 data/resources/ui/dialogs/app_dialog.ui:149 data/resources/ui/dialogs/process_dialog.ui:127 #: data/resources/ui/dialogs/settings_dialog.ui:163 data/resources/ui/dialogs/settings_dialog.ui:255 msgid "Video Memory" msgstr "ذاكرة الفيديو" #: src/ui/pages/applications/mod.rs:1410 src/ui/pages/memory.rs:197 src/ui/pages/processes/mod.rs:1943 data/resources/ui/dialogs/app_dialog.ui:91 data/resources/ui/dialogs/process_dialog.ui:73 #: data/resources/ui/dialogs/settings_dialog.ui:178 data/resources/ui/dialogs/settings_dialog.ui:290 msgid "Swap" msgstr "الإبدال" #: src/ui/pages/applications/mod.rs:1469 src/ui/pages/processes/mod.rs:2001 data/resources/ui/dialogs/settings_dialog.ui:183 data/resources/ui/dialogs/settings_dialog.ui:295 msgid "Combined Memory" msgstr "الذاكرة المندمجة" #: src/ui/pages/applications/mod.rs:1528 src/ui/pages/processes/mod.rs:2060 msgid "End {}?" msgstr "أأنهِ {}؟" #: src/ui/pages/applications/mod.rs:1529 src/ui/pages/processes/mod.rs:2061 msgid "Halt {}?" msgstr "أأوقِف {}؟" #: src/ui/pages/applications/mod.rs:1530 src/ui/pages/processes/mod.rs:2062 msgid "Kill {}?" msgstr "أأقتل {}؟" #: src/ui/pages/applications/mod.rs:1531 src/ui/pages/processes/mod.rs:2063 msgid "Continue {}?" msgstr "أأستئنف {}؟" #: src/ui/pages/applications/mod.rs:1537 src/ui/pages/processes/mod.rs:2098 msgid "Unsaved work might be lost." msgstr "قد تُفقد الأعمال غير المحفوظة." #: src/ui/pages/applications/mod.rs:1539 msgid "Halting an app can come with serious risks such as losing data and security implications. Use with caution." msgstr "قد ينطوي إيقاف تطبيق على مخاطر جسيمة مثل فقدان البيانات وتداعيات أمنية. استخدم بحذر." #: src/ui/pages/applications/mod.rs:1542 msgid "Killing an app can come with serious risks such as losing data and security implications. Use with caution." msgstr "قد ينطوي قتل تطبيق على مخاطر جسيمة مثل فقدان البيانات وتداعيات أمنية. استخدم بحذر." #: src/ui/pages/applications/mod.rs:1550 data/resources/ui/pages/applications.ui:22 data/resources/ui/pages/applications.ui:98 msgid "End App" msgstr "أنهِ التطبيق" #: src/ui/pages/applications/mod.rs:1551 data/resources/ui/pages/applications.ui:10 data/resources/ui/pages/applications.ui:30 msgid "Halt App" msgstr "أوقِف التطبيق" #: src/ui/pages/applications/mod.rs:1552 data/resources/ui/pages/applications.ui:6 data/resources/ui/pages/applications.ui:26 msgid "Kill App" msgstr "اقتل التطبيق" #: src/ui/pages/applications/mod.rs:1553 data/resources/ui/pages/applications.ui:14 data/resources/ui/pages/applications.ui:34 msgid "Continue App" msgstr "استئنف التطبيق" #: src/ui/pages/battery.rs:102 src/ui/pages/drive.rs:126 msgid "Drive" msgstr "محرك الأقراص" #: src/ui/pages/battery.rs:209 msgid "Battery Charge" msgstr "شحن البطارية" #: src/ui/pages/battery.rs:216 data/resources/ui/pages/gpu.ui:55 data/resources/ui/pages/npu.ui:49 msgid "Power Usage" msgstr "استعمال الطاقة" #: src/ui/pages/battery.rs:278 src/ui/pages/cpu.rs:410 src/ui/pages/drive.rs:340 src/ui/pages/drive.rs:371 src/ui/pages/gpu.rs:422 src/ui/pages/network.rs:327 src/ui/pages/network.rs:361 #: src/ui/pages/npu.rs:304 src/ui/pages/npu.rs:353 msgid "Highest:" msgstr "الأقصى:" #: src/ui/pages/cpu.rs:236 src/ui/pages/gpu.rs:210 src/ui/pages/npu.rs:201 msgid "Total Usage" msgstr "الاستعمال الكلي" #: src/ui/pages/cpu.rs:264 src/ui/pages/gpu.rs:237 src/ui/pages/npu.rs:211 msgid "Temperature" msgstr "درجة الحرارة" #: src/ui/pages/drive.rs:235 msgid "Drive Activity" msgstr "نشاط محرك الأقراص" #: src/ui/pages/drive.rs:242 msgid "Read Speed" msgstr "سرعة القراءة" #: src/ui/pages/drive.rs:246 msgid "Write Speed" msgstr "سرعة الكتابة" #: src/ui/pages/drive.rs:408 src/ui/pages/drive.rs:418 msgid "Yes" msgstr "نعم" #. Translators: This is an abbreviation for "Read" and "Write". This is displayed in the sidebar so your #. translation should preferably be quite short or an abbreviation #: src/ui/pages/drive.rs:436 msgid "R: {} · W: {}" msgstr "ق: {} · ك: {}" #: src/ui/pages/gpu.rs:218 msgid "Video Encoder/Decoder Usage" msgstr "استعمال مرمِّز\\فاكّ ترميز الفيديو" #: src/ui/pages/gpu.rs:224 msgid "Video Encoder Usage" msgstr "استعمال مرمِّز الفيديو" #: src/ui/pages/gpu.rs:229 msgid "Video Decoder Usage" msgstr "استعمال فاكّ ترميز الفيديو" #: src/ui/pages/gpu.rs:234 msgid "Video Memory Usage" msgstr "استعمال ذاكرة الفيديو" #. Translators: This will be displayed in the sidebar, please try to keep your translation as short as (or even #. shorter than) 'Memory' #: src/ui/pages/gpu.rs:408 src/ui/pages/npu.rs:278 src/ui/pages/npu.rs:299 msgid "Memory: {}" msgstr "الذاكرة: {}" #: src/ui/pages/memory.rs:261 msgid "{} of {}" msgstr "{} من {}" #: src/ui/pages/memory.rs:264 msgid "{} MT/s" msgstr "{} ميجا نقل\\ثانية" #. Translators: This will be displayed in the sidebar, so your translation for "Swap" should #. preferably be quite short or an abbreviation #: src/ui/pages/memory.rs:345 msgid "{} / {} · Swap: {} %" msgstr "{} \\ {} · مبادلة: {} %" #: src/ui/pages/network.rs:118 src/utils/network.rs:136 msgid "Network Interface" msgstr "واجهة الشبكة" #: src/ui/pages/network.rs:229 msgid "Receiving" msgstr "يستلم" #: src/ui/pages/network.rs:233 msgid "Sending" msgstr "يرسل" #. Translators: This is an abbreviation for "Receive" and "Send". This is displayed in the sidebar so #. your translation should preferably be quite short or an abbreviation #: src/ui/pages/network.rs:384 msgid "R: {} · S: {}" msgstr "است: {} · ارس: {}" #: src/ui/pages/npu.rs:109 src/ui/window.rs:484 msgid "NPU" msgstr "وحدة المعالجة العصبية" #: src/ui/pages/npu.rs:208 msgid "Memory Usage" msgstr "استعمال الذاكرة" #: src/ui/pages/processes/mod.rs:175 data/resources/ui/window.ui:105 data/resources/ui/window.ui:112 data/resources/ui/dialogs/settings_dialog.ui:193 msgid "Processes" msgstr "العمليات" #: src/ui/pages/processes/mod.rs:522 src/ui/pages/processes/mod.rs:2111 data/resources/ui/pages/processes.ui:38 data/resources/ui/pages/processes.ui:157 msgid "End Process" msgstr "أنهِ العملية" #: src/ui/pages/processes/mod.rs:526 data/resources/ui/pages/processes.ui:70 msgid "End Processes" msgstr "أنهِ العمليات" #: src/ui/pages/processes/mod.rs:812 msgid "Running Processes: {}" msgstr "العمليات قيد التشغيل: {}" #: src/ui/pages/processes/mod.rs:910 msgid "Process" msgstr "العملية" #: src/ui/pages/processes/mod.rs:971 data/resources/ui/dialogs/process_dialog.ui:186 data/resources/ui/dialogs/settings_dialog.ui:210 msgid "Process ID" msgstr "مُعرِّف العملية" #: src/ui/pages/processes/mod.rs:1024 data/resources/ui/dialogs/process_dialog.ui:213 data/resources/ui/dialogs/settings_dialog.ui:215 msgid "User" msgstr "المُستخدم" #: src/ui/pages/processes/mod.rs:1699 data/resources/ui/dialogs/process_dialog.ui:154 data/resources/ui/dialogs/settings_dialog.ui:270 msgid "Total CPU Time" msgstr "إجمالي وقت المعالج" #: src/ui/pages/processes/mod.rs:1758 data/resources/ui/dialogs/process_dialog.ui:163 data/resources/ui/dialogs/settings_dialog.ui:275 msgid "User CPU Time" msgstr "وقت معالج المستخدم" #: src/ui/pages/processes/mod.rs:1817 data/resources/ui/dialogs/process_dialog.ui:172 data/resources/ui/dialogs/settings_dialog.ui:280 msgid "System CPU Time" msgstr "وقت معالج النظام" #: src/ui/pages/processes/mod.rs:1876 data/resources/ui/dialogs/process_options_dialog.ui:87 data/resources/ui/dialogs/settings_dialog.ui:285 msgid "Priority" msgstr "الأولوية" #: src/ui/pages/processes/mod.rs:2070 msgid "End process?" msgid_plural "End {} processes?" msgstr[0] "أأنهِ العملية؟" msgstr[1] "أأنهِ العملية؟" msgstr[2] "أأنهِ عمليتين؟" msgstr[3] "أأنهِ {} عمليات؟" msgstr[4] "أأنهِ {} عملية؟" msgstr[5] "أأنهِ {} عملية؟" #: src/ui/pages/processes/mod.rs:2076 msgid "Halt process?" msgid_plural "Halt {} processes?" msgstr[0] "أأوقف العملية؟" msgstr[1] "أأوقف العملية؟" msgstr[2] "أأوقف عمليتين؟" msgstr[3] "أأوقف {} عمليات؟" msgstr[4] "أأوقف {} عملية؟" msgstr[5] "أأوقف {} عملية؟" #: src/ui/pages/processes/mod.rs:2082 src/ui/pages/processes/mod.rs:2088 msgid "Kill process?" msgid_plural "Kill {} processes?" msgstr[0] "أأقتل العملية؟" msgstr[1] "أأقتل العملية؟" msgstr[2] "أأقتل عمليتين؟" msgstr[3] "أأقتل {} عمليات؟" msgstr[4] "أأقتل {} عملية؟" msgstr[5] "أأقتل {} عملية؟" #: src/ui/pages/processes/mod.rs:2100 msgid "Halting a process can come with serious risks such as losing data and security implications. Use with caution." msgstr "قد ينطوي إيقاف عملية على مخاطر جسيمة مثل فقدان البيانات وتداعيات أمنية. استخدم بحذر." #: src/ui/pages/processes/mod.rs:2103 msgid "Killing a process can come with serious risks such as losing data and security implications. Use with caution." msgstr "قد ينطوي قتل عملية على مخاطر جسيمة مثل فقدان البيانات وتداعيات أمنية. استخدم بحذر." #: src/ui/pages/processes/mod.rs:2112 data/resources/ui/pages/processes.ui:10 data/resources/ui/pages/processes.ui:46 msgid "Halt Process" msgstr "أوقف العملية" #: src/ui/pages/processes/mod.rs:2113 data/resources/ui/pages/processes.ui:6 data/resources/ui/pages/processes.ui:42 msgid "Kill Process" msgstr "اقتل العملية" #: src/ui/pages/processes/mod.rs:2114 data/resources/ui/pages/processes.ui:14 data/resources/ui/pages/processes.ui:50 msgid "Continue Process" msgstr "استئنف العملية" #: src/ui/window.rs:452 msgid "GPU {}" msgstr "معالج الرسوميات {}" #: src/ui/window.rs:482 msgid "NPU {}" msgstr "وحدة المعالجة العصبية {}" #: src/ui/window.rs:1158 msgid "Successfully adjusted {}" msgstr "عُدِّل {} بنجاح" #: src/ui/window.rs:1159 msgid "There was a problem adjusting {}" msgstr "حدثت مشكلة أثناء تعديل {}" #: src/ui/window.rs:1241 msgid "Successfully ended {}" msgstr "أنهيّ {} بنجاح" #: src/ui/window.rs:1242 msgid "Successfully halted {}" msgstr "أوقِف {} بنجاح" #: src/ui/window.rs:1243 msgid "Successfully killed {}" msgstr "قُتل {} بنجاح" #: src/ui/window.rs:1244 msgid "Successfully continued {}" msgstr "استُئنف {} بنجاح" #: src/ui/window.rs:1251 msgid "Successfully ended the process" msgid_plural "Successfully ended {} processes" msgstr[0] "أُنهيت العملية بنجاح" msgstr[1] "أُنهيت العملية بنجاح" msgstr[2] "أُنهيت عمليتان بنجاح" msgstr[3] "أُنهيت {} عمليات بنجاح" msgstr[4] "أُنهيت {} عملية بنجاح" msgstr[5] "أُنهيت {} عملية بنجاح" #: src/ui/window.rs:1257 msgid "Successfully halted the process" msgid_plural "Successfully halted {} processes" msgstr[0] "أوقِفت العملية بنجاح" msgstr[1] "أوقِفت العملية بنجاح" msgstr[2] "أوقِفت عمليتان بنجاح" msgstr[3] "أوقِفت {} عمليات بنجاح" msgstr[4] "أوقِفت {} عملية بنجاح" msgstr[5] "أوقِفت {} عملية بنجاح" #: src/ui/window.rs:1263 msgid "Successfully killed the process" msgid_plural "Successfully killed {} processes" msgstr[0] "قُتلت العملية بنجاح" msgstr[1] "قُتلت العملية بنجاح" msgstr[2] "قُتلت عمليتان بنجاح" msgstr[3] "قُتلت {} عمليات بنجاح" msgstr[4] "قُتلت {} عملية بنجاح" msgstr[5] "قُتلت {} عملية بنجاح" #: src/ui/window.rs:1269 msgid "Successfully continued the process" msgid_plural "Successfully continued {} processes" msgstr[0] "استُئنفت العملية بنجاح" msgstr[1] "استُئنفت العملية بنجاح" msgstr[2] "استُئنفت عمليتان بنجاح" msgstr[3] "استُئنفت {} عمليات بنجاح" msgstr[4] "استُئنفت {} عملية بنجاح" msgstr[5] "استُئنفت {} عملية بنجاح" #: src/ui/window.rs:1280 msgid "There was a problem ending a process" msgid_plural "There were problems ending {} processes" msgstr[0] "حدثت مشكلة أثناء إنهاء عملية" msgstr[1] "حدثت مشكلة أثناء إنهاء عملية" msgstr[2] "حدثت مشاكل أثناء إنهاء عمليتين" msgstr[3] "حدثت مشاكل أثناء إنهاء {} عمليات" msgstr[4] "حدثت مشاكل أثناء إنهاء {} عملية" msgstr[5] "حدثت مشاكل أثناء إنهاء {} عملية" #: src/ui/window.rs:1286 msgid "There was a problem halting a process" msgid_plural "There were problems halting {} processes" msgstr[0] "حدثت مشكلة أثناء إيقاف عملية" msgstr[1] "حدثت مشكلة أثناء إيقاف عملية" msgstr[2] "حدثت مشاكل أثناء إيقاف عمليتين" msgstr[3] "حدثت مشاكل أثناء إيقاف {} عمليات" msgstr[4] "حدثت مشاكل أثناء إيقاف {} عملية" msgstr[5] "حدثت مشاكل أثناء إيقاف {} عملية" #: src/ui/window.rs:1292 msgid "There was a problem killing a process" msgid_plural "There were problems killing {} processes" msgstr[0] "حدثت مشكلة أثناء قتل عملية" msgstr[1] "حدثت مشكلة أثناء قتل عملية" msgstr[2] "حدثت مشاكل أثناء قتل عمليتين" msgstr[3] "حدثت مشاكل أثناء قتل {} عمليات" msgstr[4] "حدثت مشاكل أثناء قتل {} عملية" msgstr[5] "حدثت مشاكل أثناء قتل {} عملية" #: src/ui/window.rs:1298 msgid "There was a problem continuing a process" msgid_plural "There were problems continuing {} processes" msgstr[0] "حدثت مشكلة أثناء مواصلة عملية" msgstr[1] "حدثت مشكلة أثناء مواصلة عملية" msgstr[2] "حدثت مشاكل أثناء متابعة عمليتين" msgstr[3] "حدثت مشاكل أثناء مواصلة {} عمليات" msgstr[4] "حدثت مشاكل أثناء مواصلة {} عملية" msgstr[5] "حدثت مشاكل أثناء مواصلة {} عملية" #: src/ui/window.rs:1308 msgid "There was a problem ending {}" msgstr "حدثت مشكلة أثناء إنهاء {}" #: src/ui/window.rs:1309 msgid "There was a problem halting {}" msgstr "حدثت مشكلة أثناء إيقاف {}" #: src/ui/window.rs:1310 msgid "There was a problem killing {}" msgstr "حدثت مشكلة أثناء قتل {}" #: src/ui/window.rs:1311 msgid "There was a problem continuing {}" msgstr "حدثت مشكلة أثناء مواصلة {}" #: src/utils/app.rs:222 msgid "System Processes" msgstr "عمليات النظام" #: src/utils/battery.rs:90 msgid "Charging" msgstr "تشحن" #: src/utils/battery.rs:91 msgid "Discharging" msgstr "تُفرَّغ" #: src/utils/battery.rs:92 msgid "Empty" msgstr "فارغة" #: src/utils/battery.rs:93 msgid "Full" msgstr "ممتلئة" #: src/utils/battery.rs:94 msgid "Unknown" msgstr "مجهول" #: src/utils/battery.rs:140 msgid "Nickel-Metal Hydride" msgstr "هيدريد فلز النيكل" #: src/utils/battery.rs:141 msgid "Nickel-Cadmium" msgstr "كادميوم نيكل" #: src/utils/battery.rs:142 msgid "Nickel-Zinc" msgstr "زنك نيكل" #: src/utils/battery.rs:143 msgid "Lead-Acid" msgstr "حامض الرصاص" #: src/utils/battery.rs:144 msgid "Lithium-Ion" msgstr "أيونات ليثيوم" #: src/utils/battery.rs:145 msgid "Lithium Iron Phosphate" msgstr "فوسفات حديد الليثيوم" #: src/utils/battery.rs:146 msgid "Lithium Polymer" msgstr "بوليمرات ليثيوم" #: src/utils/battery.rs:148 msgid "Rechargeable Alkaline Managanese" msgstr "منغنيز قلوي قابل لإعادة الشحن" #: src/utils/battery.rs:259 msgid "{} Battery" msgstr "البطارية {}" #: src/utils/battery.rs:261 msgid "Battery" msgstr "البطارية" #: src/utils/drive.rs:128 src/utils/drive.rs:207 msgid "CD/DVD/Blu-ray Drive" msgstr "مشغل CD/DVD/Blu-ray" #: src/utils/drive.rs:129 msgid "eMMC Storage" msgstr "وسيط تخزين eMMC" #: src/utils/drive.rs:130 msgid "Flash Storage" msgstr "وسيط تخزين فلاش" #: src/utils/drive.rs:131 src/utils/drive.rs:208 msgid "Floppy Drive" msgstr "مشغل أقراص مرنة" #: src/utils/drive.rs:132 msgid "Hard Disk Drive" msgstr "مشغل أقراص صلب" #: src/utils/drive.rs:133 msgid "Loop Device" msgstr "جهاز حلقي" #: src/utils/drive.rs:134 msgid "Mapped Device" msgstr "جهاز مُعين" #: src/utils/drive.rs:135 msgid "NVMe Drive" msgstr "مشغل أقراص NVMe" #: src/utils/drive.rs:137 msgid "Software Raid" msgstr "مصفوفة RAID برمجية" #: src/utils/drive.rs:138 msgid "RAM Disk" msgstr "قرص ذاكرة الوصول العشوائي" #: src/utils/drive.rs:139 msgid "Solid State Drive" msgstr "وسيط تخزين ذو حالة ثابتة (SSD)" #: src/utils/drive.rs:140 msgid "ZFS Volume" msgstr "وحدة تخزين ZFS" #: src/utils/drive.rs:141 msgid "Compressed RAM Disk (zram)" msgstr "قرص ذاكرة الوصول العشوائي المضغوط (zram)" #: src/utils/drive.rs:209 msgid "{} Loop Device" msgstr "جهاز حلقي {}" #: src/utils/drive.rs:210 msgid "{} Mapped Device" msgstr "جهاز مُعين {}" #: src/utils/drive.rs:211 msgid "{} RAID" msgstr "مصفوفة RAID {}" #: src/utils/drive.rs:212 msgid "{} RAM Disk" msgstr "قرص ذاكرة الوصول العشوائي {}" #: src/utils/drive.rs:213 msgid "{} zram Device" msgstr "جهاز zram {}" #: src/utils/drive.rs:214 msgid "{} ZFS Volume" msgstr "وحدة تخزين ZFS {}" #: src/utils/drive.rs:215 msgid "{} Drive" msgstr "محرك أقراص {}" #: src/utils/network.rs:124 msgid "Bluetooth Tether" msgstr "ربط بلوتوث" #: src/utils/network.rs:125 msgid "Network Bridge" msgstr "جسر شبكة" #: src/utils/network.rs:126 msgid "Ethernet Connection" msgstr "اتصال إثِرنِت" #: src/utils/network.rs:127 msgid "Docker Bridge" msgstr "جسر دوكر" #: src/utils/network.rs:128 msgid "InfiniBand Connection" msgstr "اتصال InfiniBand" #: src/utils/network.rs:129 msgid "Serial Line IP Connection" msgstr "اتصال IP عبر خط تسلسلي" #: src/utils/network.rs:130 msgid "Virtual Ethernet Device" msgstr "جهاز إثِرنِت افتراضي" #: src/utils/network.rs:131 msgid "VM Network Bridge" msgstr "جسر شبكة لآلة افتراضية" #: src/utils/network.rs:132 msgid "VPN Tunnel" msgstr "نفق شبكة خاصة افتراضية" #: src/utils/network.rs:133 msgid "VPN Tunnel (WireGuard)" msgstr "نفق شبكة خاصة افتراضية (WireGuard)" #: src/utils/network.rs:134 msgid "Wi-Fi Connection" msgstr "اتصال واي-فاي" #: src/utils/network.rs:135 msgid "WWAN Connection" msgstr "اتصال WWAN" #: src/utils/units.rs:76 msgid "{} K" msgstr "{} كلفن" #: src/utils/units.rs:78 msgid "{} °C" msgstr "{} °م" #: src/utils/units.rs:80 msgid "{} °F" msgstr "{} °ف" #: src/utils/units.rs:98 src/utils/units.rs:112 src/utils/units.rs:132 src/utils/units.rs:146 msgid "{} B" msgstr "{} بايت" #: src/utils/units.rs:99 src/utils/units.rs:113 msgid "{} kB" msgstr "{} كيلوبايت" #: src/utils/units.rs:100 src/utils/units.rs:114 msgid "{} MB" msgstr "{} ميغابايت" #: src/utils/units.rs:101 src/utils/units.rs:115 msgid "{} GB" msgstr "{} جيجابايت" #: src/utils/units.rs:102 src/utils/units.rs:116 msgid "{} TB" msgstr "{} تيرابايت" #: src/utils/units.rs:103 src/utils/units.rs:117 msgid "{} PB" msgstr "{} پيتابايت" #: src/utils/units.rs:104 src/utils/units.rs:118 msgid "{} EB" msgstr "{} إكسابايت" #: src/utils/units.rs:105 src/utils/units.rs:119 msgid "{} ZB" msgstr "{} زيتابايت" #: src/utils/units.rs:106 src/utils/units.rs:120 msgid "{} YB" msgstr "{} يوتابايت" #: src/utils/units.rs:107 src/utils/units.rs:121 msgid "{} RB" msgstr "{} رونابايت" #: src/utils/units.rs:108 src/utils/units.rs:122 msgid "{} QB" msgstr "{} كويتابايت" #: src/utils/units.rs:133 src/utils/units.rs:147 msgid "{} KiB" msgstr "{} كيبيبايت" #: src/utils/units.rs:134 src/utils/units.rs:148 msgid "{} MiB" msgstr "{} ميبيبايت" #: src/utils/units.rs:135 src/utils/units.rs:149 msgid "{} GiB" msgstr "{} جيبيبايت" #: src/utils/units.rs:136 src/utils/units.rs:150 msgid "{} TiB" msgstr "{} تيبيبايت" #: src/utils/units.rs:137 src/utils/units.rs:151 msgid "{} PiB" msgstr "{} پيبيبايت" #: src/utils/units.rs:138 src/utils/units.rs:152 msgid "{} EiB" msgstr "{} إكسبيبيات" #: src/utils/units.rs:139 src/utils/units.rs:153 msgid "{} ZiB" msgstr "{} زيبيبايت" #: src/utils/units.rs:140 src/utils/units.rs:154 msgid "{} YiB" msgstr "{} يوبيبايت" #: src/utils/units.rs:141 src/utils/units.rs:155 msgid "{} RiB" msgstr "{} روبيبايت" #: src/utils/units.rs:142 src/utils/units.rs:156 msgid "{} QiB" msgstr "{} كويبيبات" #: src/utils/units.rs:183 src/utils/units.rs:200 msgid "{} B/s" msgstr "{} بايت\\ثانية" #: src/utils/units.rs:184 msgid "{} kB/s" msgstr "{} كيلوبايت\\ثانية" #: src/utils/units.rs:185 msgid "{} MB/s" msgstr "{} ميغابايت\\ثانية" #: src/utils/units.rs:186 msgid "{} GB/s" msgstr "{} جيجابايت\\ثانية" #: src/utils/units.rs:187 msgid "{} TB/s" msgstr "{} تيرابايت\\ثانية" #: src/utils/units.rs:188 msgid "{} PB/s" msgstr "{} پيتابايت\\ثانية" #: src/utils/units.rs:189 msgid "{} EB/s" msgstr "{} إكسابايت\\ثانية" #: src/utils/units.rs:190 msgid "{} ZB/s" msgstr "{} زيتابايت\\ثانية" #: src/utils/units.rs:191 msgid "{} YB/s" msgstr "{} يوتابايت\\ثانية" #: src/utils/units.rs:192 msgid "{} RB/s" msgstr "{} رونابايت\\ثانية" #: src/utils/units.rs:193 msgid "{} QB/s" msgstr "{} كويتابايت\\ثانية" #: src/utils/units.rs:201 msgid "{} KiB/s" msgstr "{} كيبيبايت\\ثانية" #: src/utils/units.rs:202 msgid "{} MiB/s" msgstr "{} ميبيبايت\\ثانية" #: src/utils/units.rs:203 msgid "{} GiB/s" msgstr "{} جيبيبايت\\ثانية" #: src/utils/units.rs:204 msgid "{} TiB/s" msgstr "{} تيبيبايت\\ثانية" #: src/utils/units.rs:205 msgid "{} PiB/s" msgstr "{} پيبيبايت\\ثانية" #: src/utils/units.rs:206 msgid "{} EiB/s" msgstr "{} إكسبيبيات\\ثانية" #: src/utils/units.rs:207 msgid "{} ZiB/s" msgstr "{} زيبيبايت\\ثانية" #: src/utils/units.rs:208 msgid "{} YiB/s" msgstr "{} يوبيبايت\\ثانية" #: src/utils/units.rs:209 msgid "{} RiB/s" msgstr "{} روبيبايت\\ثانية" #: src/utils/units.rs:210 msgid "{} QiB/s" msgstr "{} كويبيبات\\ثانية" #: src/utils/units.rs:224 src/utils/units.rs:241 msgid "{} b/s" msgstr "{} بت\\ثانية" #: src/utils/units.rs:225 msgid "{} kb/s" msgstr "{} كيلوبت\\ثانية" #: src/utils/units.rs:226 msgid "{} Mb/s" msgstr "{} ميجابت\\ثانية" #: src/utils/units.rs:227 msgid "{} Gb/s" msgstr "{} جيجابت\\ثانية" #: src/utils/units.rs:228 msgid "{} Tb/s" msgstr "{} تيرابت\\ثانية" #: src/utils/units.rs:229 msgid "{} Pb/s" msgstr "{} پيتابت\\ثانية" #: src/utils/units.rs:230 msgid "{} Eb/s" msgstr "{} إكسابت\\ثانية" #: src/utils/units.rs:231 msgid "{} Zb/s" msgstr "{} زيتابت\\ثانية" #: src/utils/units.rs:232 msgid "{} Yb/s" msgstr "{} يوتابت\\ثانية" #: src/utils/units.rs:233 msgid "{} Rb/s" msgstr "{} رونابت\\ثانية" #: src/utils/units.rs:234 msgid "{} Qb/s" msgstr "{} كويتوبت\\ثانية" #: src/utils/units.rs:242 msgid "{} Kib/s" msgstr "{} كيبيبت\\ثانية" #: src/utils/units.rs:243 msgid "{} Mib/s" msgstr "{} ميبيبت\\ثانية" #: src/utils/units.rs:244 msgid "{} Gib/s" msgstr "{} جيبيبت\\ثانية" #: src/utils/units.rs:245 msgid "{} Tib/s" msgstr "{} تيبيبت\\ثانية" #: src/utils/units.rs:246 msgid "{} Pib/s" msgstr "{} پيبيبت\\ثانية" #: src/utils/units.rs:247 msgid "{} Eib/s" msgstr "{} إكسبيبت\\ثانية" #: src/utils/units.rs:248 msgid "{} Zib/s" msgstr "{} زيبيبت\\ثانية" #: src/utils/units.rs:249 msgid "{} Yib/s" msgstr "{} يوبيبيت\\ثانية" #: src/utils/units.rs:250 msgid "{} Rib/s" msgstr "{} روبيبيت\\ثانية" #: src/utils/units.rs:251 msgid "{} Qib/s" msgstr "{} كويبيبت\\ثانية" #: src/utils/units.rs:258 msgid "{} Hz" msgstr "{} هرتز" #: src/utils/units.rs:259 msgid "{} kHz" msgstr "{} كيلوهرتز" #: src/utils/units.rs:260 msgid "{} MHz" msgstr "{} ميغاهرتز" #: src/utils/units.rs:261 msgid "{} GHz" msgstr "{} جيجاهرتز" #: src/utils/units.rs:262 msgid "{} THz" msgstr "{} تيراهرتز" #: src/utils/units.rs:263 msgid "{} PHz" msgstr "{} پيتاهرتز" #: src/utils/units.rs:264 msgid "{} EHz" msgstr "{} إكساهرتز" #: src/utils/units.rs:265 msgid "{} ZHz" msgstr "{} زيتاهرتز" #: src/utils/units.rs:266 msgid "{} YHz" msgstr "{} يوتاهرتز" #: src/utils/units.rs:267 msgid "{} RHz" msgstr "{} روناهرتز" #: src/utils/units.rs:268 msgid "{} QHz" msgstr "{} كويتاهرتز" #: src/utils/units.rs:275 msgid "{} W" msgstr "{} واط" #: src/utils/units.rs:276 msgid "{} kW" msgstr "{} كيلوواط" #: src/utils/units.rs:277 msgid "{} MW" msgstr "{} ميغاواط" #: src/utils/units.rs:278 msgid "{} GW" msgstr "{} جيجاواط" #: src/utils/units.rs:279 msgid "{} TW" msgstr "{} تيراواط" #: src/utils/units.rs:280 msgid "{} PW" msgstr "{} پيتاواط" #: src/utils/units.rs:281 msgid "{} EW" msgstr "{} إكساواط" #: src/utils/units.rs:282 msgid "{} ZW" msgstr "{} زيتاواط" #: src/utils/units.rs:283 msgid "{} YW" msgstr "{} يوتاواط" #: src/utils/units.rs:284 msgid "{} RW" msgstr "{} روناواط" #: src/utils/units.rs:285 msgid "{} QW" msgstr "{} كويتاواط" #: src/utils/units.rs:294 src/utils/units.rs:308 msgid "{} Wh" msgstr "{} واط ساعة" #: src/utils/units.rs:295 src/utils/units.rs:309 msgid "{} kWh" msgstr "{} كيلوواط ساعة" #: src/utils/units.rs:296 src/utils/units.rs:310 msgid "{} MWh" msgstr "{} ميغاواط ساعة" #: src/utils/units.rs:297 src/utils/units.rs:311 msgid "{} GWh" msgstr "{} جيجاواط ساعة" #: src/utils/units.rs:298 src/utils/units.rs:312 msgid "{} TWh" msgstr "{} تيراواط ساعة" #: src/utils/units.rs:299 src/utils/units.rs:313 msgid "{} PWh" msgstr "{} پيتاواط ساعة" #: src/utils/units.rs:300 src/utils/units.rs:314 msgid "{} EWh" msgstr "{} إكساواط ساعة" #: src/utils/units.rs:301 src/utils/units.rs:315 msgid "{} ZWh" msgstr "{} زيتاواط ساعة" #: src/utils/units.rs:302 src/utils/units.rs:316 msgid "{} YWh" msgstr "{} يوتاواط ساعة" #: src/utils/units.rs:303 src/utils/units.rs:317 msgid "{} RWh" msgstr "{} روناواط ساعة" #: src/utils/units.rs:304 src/utils/units.rs:318 msgid "{} QWh" msgstr "{} كويتاواط ساعة" #: data/resources/ui/shortcuts.ui:11 msgctxt "shortcut window" msgid "General" msgstr "عام" #: data/resources/ui/shortcuts.ui:14 msgctxt "shortcut window" msgid "Preferences" msgstr "التفضيلات" #: data/resources/ui/shortcuts.ui:20 msgctxt "shortcut window" msgid "Show Shortcuts" msgstr "اعرض الاختصارات" #: data/resources/ui/shortcuts.ui:26 msgctxt "shortcut window" msgid "Quit" msgstr "اخرج" #: data/resources/ui/shortcuts.ui:32 msgctxt "shortcut window" msgid "Toggle Search Field" msgstr "بدِّل حقل البحث" #: data/resources/ui/shortcuts.ui:38 msgctxt "shortcut window" msgid "End App/Process" msgstr "أنهِ تطبيقًا\\عملية" #: data/resources/ui/shortcuts.ui:44 msgctxt "shortcut window" msgid "Kill App/Process" msgstr "اقتل تطبيقًأ\\عملية" #: data/resources/ui/shortcuts.ui:50 msgctxt "shortcut window" msgid "Halt App/Process" msgstr "أوقف تطبيقًا\\عملية" #: data/resources/ui/shortcuts.ui:56 msgctxt "shortcut window" msgid "Continue App/Process" msgstr "استئنف تطبيقًا\\عملية" #: data/resources/ui/shortcuts.ui:62 msgctxt "shortcut window" msgid "Show Information for App/Process" msgstr "اعرض معلومات تطبيق\\عملية" #: data/resources/ui/shortcuts.ui:68 msgctxt "shortcut window" msgid "Show Process Options" msgstr "اعرض خيارات العملية" #: data/resources/ui/window.ui:6 msgid "Preferences" msgstr "التفضيلات" #: data/resources/ui/window.ui:10 msgid "Keyboard Shortcuts" msgstr "اختصارات لوحة المفاتيح" #: data/resources/ui/window.ui:14 msgid "About Resources" msgstr "عَنْ «موارد»" #: data/resources/ui/window.ui:88 data/resources/ui/window.ui:128 msgid "Search" msgstr "ابحث" #: data/resources/ui/window.ui:90 data/resources/ui/window.ui:130 msgid "Toggle search field" msgstr "بدِّل حقل البحث" #: data/resources/ui/dialogs/app_dialog.ui:7 msgid "App Information" msgstr "معلومات التطبيق" #: data/resources/ui/dialogs/app_dialog.ui:70 data/resources/ui/dialogs/process_dialog.ui:48 data/resources/ui/pages/battery.ui:22 data/resources/ui/pages/cpu.ui:37 data/resources/ui/pages/cpu.ui:50 #: data/resources/ui/pages/drive.ui:22 data/resources/ui/pages/gpu.ui:22 data/resources/ui/pages/memory.ui:31 data/resources/ui/pages/network.ui:22 data/resources/ui/pages/npu.ui:22 msgid "Usage" msgstr "الاستعمال" #: data/resources/ui/dialogs/app_dialog.ui:174 data/resources/ui/dialogs/process_dialog.ui:179 data/resources/ui/pages/battery.ui:33 data/resources/ui/pages/cpu.ui:83 #: data/resources/ui/pages/drive.ui:54 data/resources/ui/pages/gpu.ui:74 data/resources/ui/pages/memory.ui:42 data/resources/ui/pages/network.ui:51 data/resources/ui/pages/npu.ui:68 msgid "Properties" msgstr "الخصائص" #: data/resources/ui/dialogs/app_dialog.ui:180 msgid "ID" msgstr "المُعرِّف" #: data/resources/ui/dialogs/app_dialog.ui:190 data/resources/ui/dialogs/process_dialog.ui:195 msgid "Running Since" msgstr "يُشَغَّل منذ" #: data/resources/ui/dialogs/app_dialog.ui:198 msgid "Running Processes" msgstr "العمليات المُشَغَّلة" #: data/resources/ui/dialogs/app_dialog.ui:207 data/resources/ui/dialogs/process_dialog.ui:231 msgid "Containerized" msgstr "ضمن حاوية" #: data/resources/ui/dialogs/process_dialog.ui:7 msgid "Process Information" msgstr "معلومات العمليَّة" #: data/resources/ui/dialogs/process_dialog.ui:204 msgid "Commandline" msgstr "سطر الأوامر" #: data/resources/ui/dialogs/process_dialog.ui:222 msgid "Control Group" msgstr "مجموعة التحكم" #: data/resources/ui/dialogs/process_options_dialog.ui:7 data/resources/ui/dialogs/process_options_dialog.ui:69 msgid "Process Options" msgstr "خيارات العملية" #: data/resources/ui/dialogs/process_options_dialog.ui:29 msgid "Apply" msgstr "طبِّق" #: data/resources/ui/dialogs/process_options_dialog.ui:72 msgid "Niceness" msgstr "السماحية" #: data/resources/ui/dialogs/process_options_dialog.ui:73 msgid "The priority of a process is given by its niceness. A lower niceness value correspond to a higher priority." msgstr "تُحدَّد أولوية العملية من خلال قيمة سماحيَّتها. قيمة سماحيَّة أقل تعني أولويّة أعلى." #: data/resources/ui/dialogs/process_options_dialog.ui:91 msgctxt "process priority" msgid "Very High" msgstr "عالية جدًا" #: data/resources/ui/dialogs/process_options_dialog.ui:92 msgctxt "process priority" msgid "High" msgstr "عالية" #: data/resources/ui/dialogs/process_options_dialog.ui:93 msgctxt "process priority" msgid "Normal" msgstr "عاديَّة" #: data/resources/ui/dialogs/process_options_dialog.ui:94 msgctxt "process priority" msgid "Low" msgstr "منخفضة" #: data/resources/ui/dialogs/process_options_dialog.ui:95 msgctxt "process priority" msgid "Very Low" msgstr "منخفضة جدًا" #: data/resources/ui/dialogs/process_options_dialog.ui:103 msgid "Processor Affinity" msgstr "ألفة المعالج" #: data/resources/ui/dialogs/process_options_dialog.ui:108 msgid "Toggle All" msgstr "بدِّل الكل" #: data/resources/ui/dialogs/process_options_dialog.ui:111 msgid "Select which processor cores the process is allowed to run on" msgstr "اختر أنوية المعالج المسموح للعمليَّة بالعمل عليها" #: data/resources/ui/dialogs/settings_dialog.ui:7 msgid "General" msgstr "عام" #: data/resources/ui/dialogs/settings_dialog.ui:10 msgid "Units" msgstr "الوحدات" #: data/resources/ui/dialogs/settings_dialog.ui:13 msgid "Data Unit Prefix" msgstr "بادئة وحدة البيانات" #: data/resources/ui/dialogs/settings_dialog.ui:17 msgid "Decimal" msgstr "عشري" #: data/resources/ui/dialogs/settings_dialog.ui:18 msgid "Binary" msgstr "ثنائي" #: data/resources/ui/dialogs/settings_dialog.ui:26 msgid "Show Network Speeds in Bits per Second" msgstr "أظهر سرعات الشبكة بالبتّ في الثانية" #: data/resources/ui/dialogs/settings_dialog.ui:31 msgid "Temperature Unit" msgstr "وحدة درجة الحرارة" #: data/resources/ui/dialogs/settings_dialog.ui:35 msgid "Celsius" msgstr "سيلزيوس (مئوية)" #: data/resources/ui/dialogs/settings_dialog.ui:36 msgid "Kelvin" msgstr "كلفن" #: data/resources/ui/dialogs/settings_dialog.ui:37 msgid "Fahrenheit" msgstr "فهرنهايت" #: data/resources/ui/dialogs/settings_dialog.ui:47 msgid "User Interface" msgstr "واجهة المستخدم" #: data/resources/ui/dialogs/settings_dialog.ui:50 msgid "Refresh Speed" msgstr "سرعة التحديث" #: data/resources/ui/dialogs/settings_dialog.ui:51 msgid "Higher refresh speeds can lead to higher processor usage" msgstr "سرعات التحديث الأعلى قد تؤدي إلى الاستعمال أعلى للمعالج" #: data/resources/ui/dialogs/settings_dialog.ui:55 msgctxt "UI refresh speed" msgid "Very Slow" msgstr "بطيئة جدًا" #: data/resources/ui/dialogs/settings_dialog.ui:56 msgctxt "UI refresh speed" msgid "Slow" msgstr "بطيئة" #: data/resources/ui/dialogs/settings_dialog.ui:57 msgctxt "UI refresh speed" msgid "Normal" msgstr "عادية" #: data/resources/ui/dialogs/settings_dialog.ui:58 msgctxt "UI refresh speed" msgid "Fast" msgstr "سريعة" #: data/resources/ui/dialogs/settings_dialog.ui:59 msgctxt "UI refresh speed" msgid "Very Fast" msgstr "سريعة جدًا" #: data/resources/ui/dialogs/settings_dialog.ui:67 msgid "Show Graph Grids" msgstr "أظهر شبكات الرسوم البيانيّة" #: data/resources/ui/dialogs/settings_dialog.ui:72 msgid "Graph Data Points" msgstr "نقاط بيانات الرسم البياني" #: data/resources/ui/dialogs/settings_dialog.ui:86 msgid "Show Usage Details in Sidebar" msgstr "أظهر تفاصيل الاستعمال في الشريط الجانبي" #: data/resources/ui/dialogs/settings_dialog.ui:87 msgid "If enabled, the usage along with other information will be displayed" msgstr "إذا مُكِّن هذا الخيار، فسيُعرَض الاستعمال بالإضافة إلى معلومات أخرى" #: data/resources/ui/dialogs/settings_dialog.ui:92 msgid "Show Device Descriptions in Sidebar" msgstr "أظهر أوصاف الأجهزة في الشّريط الجانبي" #: data/resources/ui/dialogs/settings_dialog.ui:93 msgid "If enabled, a device identifier like its name or device type will be displayed" msgstr "إذا مُكِّن هذا الخيار، فسيُعرَض مُعرِّف للجهاز مثل اسمه أو نوعه" #: data/resources/ui/dialogs/settings_dialog.ui:98 msgid "Sidebar Meter Type" msgstr "نوع عدَّاد الشريط الجانبي" #: data/resources/ui/dialogs/settings_dialog.ui:102 msgid "Bar" msgstr "شريط" #: data/resources/ui/dialogs/settings_dialog.ui:103 msgid "Graph" msgstr "رسم بياني" #: data/resources/ui/dialogs/settings_dialog.ui:111 msgid "Normalize Processor Usage" msgstr "تطبيع استعمال المعالج" #: data/resources/ui/dialogs/settings_dialog.ui:112 msgid "If enabled, the total usage of all cores will be divided by the amount of cores" msgstr "إذا مُكِّن هذا الخيار، فسيُقسَم الاستعمال الكلِّي لجميع الأنوية على عددها" #: data/resources/ui/dialogs/settings_dialog.ui:125 data/resources/ui/dialogs/settings_dialog.ui:207 msgid "Information Columns" msgstr "أعمدة المعلومات" #: data/resources/ui/dialogs/settings_dialog.ui:196 data/resources/ui/pages/cpu.ui:22 data/resources/ui/pages/processes.ui:56 msgid "Options" msgstr "الخيارات" #: data/resources/ui/dialogs/settings_dialog.ui:199 msgid "Show Niceness Values" msgstr "أظهر قيم السماحيَّة" #: data/resources/ui/dialogs/settings_dialog.ui:200 msgid "Display priorities as niceness to allow for more fine-grained adjustments" msgstr "اعرض الأولويَّات كقيم سماحيَّة للسماح بتعديلات أكثر دقَّة" #: data/resources/ui/dialogs/settings_dialog.ui:305 msgid "Devices" msgstr "الأجهزة" #: data/resources/ui/dialogs/settings_dialog.ui:308 msgid "Drives" msgstr "محركات الأقراص" #: data/resources/ui/dialogs/settings_dialog.ui:311 msgid "Show Virtual Drives" msgstr "أظهر محركات الأقراص الافتراضية" #: data/resources/ui/dialogs/settings_dialog.ui:312 msgid "Virtual drives are for example ZFS volumes or mapped devices" msgstr "محركات الأقراص الافتراضية هي على سبيل المثال وحدات ZFS أو الأجهزة المعيّنة" #: data/resources/ui/dialogs/settings_dialog.ui:322 msgid "Show Virtual Network Interfaces" msgstr "أظهر واجهات الشبكة الافتراضية" #: data/resources/ui/dialogs/settings_dialog.ui:323 msgid "Virtual network interfaces are for example bridges or VPN tunnels" msgstr "واجهات الشبكة الافتراضية هي على سبيل المثال الجسور أو أنفاق الشبكات الخاصة الافتراضية" #: data/resources/ui/pages/applications.ui:40 data/resources/ui/pages/processes.ui:62 msgid "Information" msgstr "معلومات" #: data/resources/ui/pages/applications.ui:57 msgid "Search applications" msgstr "ابحث في التطبيقات" #: data/resources/ui/pages/applications.ui:87 data/resources/ui/pages/applications.ui:89 msgid "Show App Information" msgstr "أظهِر معلومات التّطبيق" #: data/resources/ui/pages/battery.ui:36 msgid "Battery Health" msgstr "سلامة البطارية" #: data/resources/ui/pages/battery.ui:45 msgid "Design Capacity" msgstr "السعة التّصميمية" #: data/resources/ui/pages/battery.ui:54 msgid "Charge Cycles" msgstr "دورات الشحن" #: data/resources/ui/pages/battery.ui:63 msgid "Technology" msgstr "التقانة" #: data/resources/ui/pages/battery.ui:72 data/resources/ui/pages/gpu.ui:81 data/resources/ui/pages/network.ui:58 data/resources/ui/pages/npu.ui:75 msgid "Manufacturer" msgstr "الشّركة المصنِّعة" #: data/resources/ui/pages/battery.ui:81 msgid "Model Name" msgstr "اسم الطِّراز" #: data/resources/ui/pages/battery.ui:90 data/resources/ui/pages/drive.ui:66 msgid "Device" msgstr "الجهاز" #: data/resources/ui/pages/cpu.ui:26 msgid "Show Usages of Logical CPUs" msgstr "أظهر استعمالات المعالجات المنطقية" #: data/resources/ui/pages/cpu.ui:75 data/resources/ui/pages/gpu.ui:66 data/resources/ui/pages/npu.ui:60 msgid "Sensors" msgstr "المستشعرات" #: data/resources/ui/pages/cpu.ui:90 msgid "Max Frequency" msgstr "التّردُّد الأقصى" #: data/resources/ui/pages/cpu.ui:99 msgid "Logical Cores" msgstr "الأنوية المنطقية" #: data/resources/ui/pages/cpu.ui:108 msgid "Physical Cores" msgstr "الأنوية المادية" #: data/resources/ui/pages/cpu.ui:117 msgid "Sockets" msgstr "المقابس" #: data/resources/ui/pages/cpu.ui:126 msgid "Virtualization" msgstr "المحاكاة الافتراضية" #: data/resources/ui/pages/cpu.ui:135 msgid "Architecture" msgstr "المعمارية" #: data/resources/ui/pages/drive.ui:38 msgid "Total Read" msgstr "إجمالي المقروء" #: data/resources/ui/pages/drive.ui:47 msgid "Total Written" msgstr "إجمالي المكتوب" #: data/resources/ui/pages/drive.ui:57 data/resources/ui/pages/memory.ui:72 msgid "Type" msgstr "النوع" #: data/resources/ui/pages/drive.ui:75 msgid "Capacity" msgstr "السعة" #: data/resources/ui/pages/drive.ui:84 msgid "Writable" msgstr "قابل للكتابة" #: data/resources/ui/pages/drive.ui:93 msgid "Removable" msgstr "قابل للإزالة" #. Translators: "Link" refers to something like "PCIe 4.0 ×16" #: data/resources/ui/pages/drive.ui:102 data/resources/ui/pages/gpu.ui:113 data/resources/ui/pages/npu.ui:107 msgid "Link" msgstr "الوصلة" #: data/resources/ui/pages/gpu.ui:37 msgid "GPU Frequency" msgstr "تردُّد معالج الرسوميات" #: data/resources/ui/pages/gpu.ui:50 msgid "Video Memory Frequency" msgstr "تردُّد ذاكرة الفيديو" #: data/resources/ui/pages/gpu.ui:90 data/resources/ui/pages/npu.ui:84 msgid "PCI Slot" msgstr "شقّ PCI" #: data/resources/ui/pages/gpu.ui:99 data/resources/ui/pages/network.ui:67 data/resources/ui/pages/npu.ui:93 msgid "Driver Used" msgstr "مشغل الأقراص المستخدم" #: data/resources/ui/pages/gpu.ui:108 data/resources/ui/pages/npu.ui:102 msgid "Max Power Cap" msgstr "سقف الطاقة الأقصى" #: data/resources/ui/pages/memory.ui:9 msgid "You need to authenticate to see memory properties" msgstr "تحتاج إلى الاستيثاق لرؤية خصائص الذاكرة" #: data/resources/ui/pages/memory.ui:10 msgid "Authenticate" msgstr "استوثق" #: data/resources/ui/pages/memory.ui:45 msgid "Slots Used" msgstr "الشقوق المستخدمة" #: data/resources/ui/pages/memory.ui:54 msgid "Speed" msgstr "السرعة" #: data/resources/ui/pages/memory.ui:63 msgid "Form Factor" msgstr "عامل الشكل" #: data/resources/ui/pages/memory.ui:81 msgid "Type Detail" msgstr "تفصيل النوع" #: data/resources/ui/pages/network.ui:35 msgid "Total Received" msgstr "إجمالي المستلَم" #: data/resources/ui/pages/network.ui:44 msgid "Total Sent" msgstr "إجمالي المرسَل" #: data/resources/ui/pages/network.ui:76 msgid "Interface" msgstr "الواجهة" #: data/resources/ui/pages/network.ui:85 msgid "Hardware Address" msgstr "عنوان العتاد" #: data/resources/ui/pages/network.ui:94 msgid "Link Speed" msgstr "سرعة الوصلة" #: data/resources/ui/pages/npu.ui:31 msgid "NPU Frequency" msgstr "تردد وحدة المعالجة العصبية" #: data/resources/ui/pages/npu.ui:44 msgid "Memory Frequency" msgstr "تردد الذاكرة" #: data/resources/ui/pages/processes.ui:22 data/resources/ui/pages/processes.ui:74 msgid "Kill Processes" msgstr "اقتل العمليات" #: data/resources/ui/pages/processes.ui:26 data/resources/ui/pages/processes.ui:78 msgid "Halt Processes" msgstr "أوقف العمليات" #: data/resources/ui/pages/processes.ui:30 data/resources/ui/pages/processes.ui:82 msgid "Continue Processes" msgstr "استئنف العمليات" #: data/resources/ui/pages/processes.ui:103 msgid "Search processes" msgstr "ابحث في العمليات" #: data/resources/ui/pages/processes.ui:133 data/resources/ui/pages/processes.ui:135 msgid "Show Process Options" msgstr "أظهر خيارات العملية" #: data/resources/ui/pages/processes.ui:146 data/resources/ui/pages/processes.ui:148 msgid "Show Process Information" msgstr "أظهر معلومات العملية" resources-1.9.1/po/bg.po000066400000000000000000001563221510634446000151160ustar00rootroot00000000000000# Bulgarian translation of resources po-file. # Copyright (C) 2025 twlvnn kraftwerk . # This file is distributed under the same license as the resources package. # twlvnn kraftwerk , 2025. # msgid "" msgstr "" "Project-Id-Version: resources main\n" "Report-Msgid-Bugs-To: https://github.com/nokyan/resources/issues/\n" "POT-Creation-Date: 2025-10-25 03:38+0000\n" "PO-Revision-Date: 2025-10-25 15:28+0200\n" "Last-Translator: twlvnn kraftwerk \n" "Language-Team: Bulgarian \n" "Language: bg\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.8\n" #: data/net.nokyan.Resources.desktop.in.in:2 data/net.nokyan.Resources.metainfo.xml.in.in:4 data/resources/ui/window.ui:22 src/application.rs:272 msgid "Resources" msgstr "Ресурси" #. Translators: The summary should be 35 characters or less according to Flathub appstream guidelines #: data/net.nokyan.Resources.desktop.in.in:3 data/net.nokyan.Resources.metainfo.xml.in.in:5 msgid "Keep an eye on system resources" msgstr "Наблюдение на системните ресурси" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/net.nokyan.Resources.desktop.in.in:9 msgid "System;Resources;Monitor;Processes;Usage;Task;Manager;CPU;RAM;Memory;GPU;" msgstr "система;ресурси;наблюдаване;процеси;използване;мениджър;цп;памет;видеокарта;system;resources;monitor;processes;usage;task;manager;cpu;ram;memory;gpu;" #: data/net.nokyan.Resources.metainfo.xml.in.in:17 msgid "" "Resources allows you to check the utilization of your system resources and control your running processes and apps. It’s designed to be user-friendly and " "feel right at home on a modern desktop by using GNOME’s libadwaita." msgstr "" "„Ресурси“ ви позволява да наблюдавате използването на системните ресурси и да контролирате работещите процеси и програми. Програмата е проектиран да бъде " "лесна за използване и да се чувствате като у дома си на модерна работна среда, като използва libadwaita на GNOME." #: data/net.nokyan.Resources.metainfo.xml.in.in:20 msgid "Resources supports monitoring the following components:" msgstr "„Ресурси“ поддържа наблюдаване на следните компоненти:" #: data/net.nokyan.Resources.metainfo.xml.in.in:24 msgid "CPU" msgstr "Процесор" #: data/net.nokyan.Resources.metainfo.xml.in.in:25 data/resources/ui/dialogs/app_dialog.ui:82 data/resources/ui/dialogs/process_dialog.ui:64 #: data/resources/ui/dialogs/settings_dialog.ui:128 data/resources/ui/dialogs/settings_dialog.ui:220 data/resources/ui/window.ui:176 #: data/resources/ui/window.ui:183 src/ui/pages/applications/mod.rs:803 src/ui/pages/memory.rs:106 src/ui/pages/memory.rs:192 #: src/ui/pages/processes/mod.rs:1080 msgid "Memory" msgstr "Памет" #: data/net.nokyan.Resources.metainfo.xml.in.in:26 data/resources/ui/dialogs/app_dialog.ui:140 data/resources/ui/dialogs/process_dialog.ui:118 #: data/resources/ui/dialogs/settings_dialog.ui:158 data/resources/ui/dialogs/settings_dialog.ui:250 src/ui/pages/applications/mod.rs:1181 #: src/ui/pages/gpu.rs:119 src/ui/pages/processes/mod.rs:1470 src/ui/window.rs:468 msgid "GPU" msgstr "Видеокарта" #: data/net.nokyan.Resources.metainfo.xml.in.in:27 data/resources/ui/dialogs/settings_dialog.ui:324 msgid "Network Interfaces" msgstr "Мрежови интерфейси" #: data/net.nokyan.Resources.metainfo.xml.in.in:28 msgid "Storage Devices" msgstr "Устройства за съхранение" #: data/net.nokyan.Resources.metainfo.xml.in.in:29 msgid "Batteries" msgstr "Батерии" #: data/net.nokyan.Resources.metainfo.xml.in.in:51 msgid "Apps page in light theme" msgstr "Страница с програмите в светла тема" #: data/net.nokyan.Resources.metainfo.xml.in.in:55 msgid "Processes page in dark theme" msgstr "Страница с програмите в тъмна тема" #: data/net.nokyan.Resources.metainfo.xml.in.in:59 msgid "Processor page in light theme" msgstr "Страница с процесора в светла тема" #: data/net.nokyan.Resources.metainfo.xml.in.in:63 msgid "Memory page in dark theme" msgstr "Страница с паметта в тъмна тема" #: data/net.nokyan.Resources.metainfo.xml.in.in:67 msgid "GPU page in light theme" msgstr "Страница с видеокартата в светла тема" #: data/net.nokyan.Resources.metainfo.xml.in.in:71 msgid "Drive page in dark theme" msgstr "Страница с диска в тъмна тема" #: data/net.nokyan.Resources.metainfo.xml.in.in:75 msgid "Network Interface page in light theme" msgstr "Страница с мрежовия интерфейс в светла тема" #: data/net.nokyan.Resources.metainfo.xml.in.in:79 msgid "Battery page in dark theme" msgstr "Страница с батерията в тъмна тема" #: data/net.nokyan.Resources.policy.in.in:9 msgid "Control Process" msgstr "Управление на процес" #: data/net.nokyan.Resources.policy.in.in:10 msgid "Authentication is required to control superuser’s or other users’ processes" msgstr "За управление на процесите на привилегирован потребител или други потребители е необходима идентификация" #: data/resources/ui/dialogs/app_dialog.ui:7 msgid "App Information" msgstr "Информация за програмата" #: data/resources/ui/dialogs/app_dialog.ui:70 data/resources/ui/dialogs/process_dialog.ui:48 data/resources/ui/pages/battery.ui:22 #: data/resources/ui/pages/cpu.ui:37 data/resources/ui/pages/cpu.ui:50 data/resources/ui/pages/drive.ui:22 data/resources/ui/pages/gpu.ui:22 #: data/resources/ui/pages/memory.ui:31 data/resources/ui/pages/network.ui:22 data/resources/ui/pages/npu.ui:22 msgid "Usage" msgstr "Използване" #: data/resources/ui/dialogs/app_dialog.ui:73 data/resources/ui/dialogs/process_dialog.ui:55 data/resources/ui/dialogs/settings_dialog.ui:133 #: data/resources/ui/dialogs/settings_dialog.ui:225 data/resources/ui/window.ui:145 data/resources/ui/window.ui:152 src/ui/pages/applications/mod.rs:862 #: src/ui/pages/cpu.rs:128 src/ui/pages/processes/mod.rs:1139 src/ui/window.rs:290 msgid "Processor" msgstr "Процесор" #: data/resources/ui/dialogs/app_dialog.ui:91 data/resources/ui/dialogs/process_dialog.ui:73 data/resources/ui/dialogs/settings_dialog.ui:178 #: data/resources/ui/dialogs/settings_dialog.ui:290 src/ui/pages/applications/mod.rs:1420 src/ui/pages/memory.rs:198 src/ui/pages/processes/mod.rs:1955 msgid "Swap" msgstr "Странициране" #: data/resources/ui/dialogs/app_dialog.ui:100 data/resources/ui/dialogs/process_dialog.ui:78 data/resources/ui/dialogs/settings_dialog.ui:138 #: data/resources/ui/dialogs/settings_dialog.ui:230 src/ui/pages/applications/mod.rs:926 src/ui/pages/processes/mod.rs:1203 msgid "Drive Read" msgstr "Четене" #: data/resources/ui/dialogs/app_dialog.ui:109 data/resources/ui/dialogs/process_dialog.ui:87 data/resources/ui/dialogs/settings_dialog.ui:143 #: data/resources/ui/dialogs/settings_dialog.ui:235 src/ui/pages/applications/mod.rs:991 src/ui/pages/processes/mod.rs:1270 msgid "Drive Read Total" msgstr "Общо четене от диск" #: data/resources/ui/dialogs/app_dialog.ui:118 data/resources/ui/dialogs/process_dialog.ui:96 data/resources/ui/dialogs/settings_dialog.ui:148 #: data/resources/ui/dialogs/settings_dialog.ui:240 src/ui/pages/applications/mod.rs:1052 src/ui/pages/processes/mod.rs:1337 msgid "Drive Write" msgstr "Записи" #: data/resources/ui/dialogs/app_dialog.ui:127 data/resources/ui/dialogs/process_dialog.ui:105 data/resources/ui/dialogs/settings_dialog.ui:153 #: data/resources/ui/dialogs/settings_dialog.ui:245 src/ui/pages/applications/mod.rs:1119 src/ui/pages/processes/mod.rs:1404 msgid "Drive Write Total" msgstr "Общо запис на диск" #: data/resources/ui/dialogs/app_dialog.ui:149 data/resources/ui/dialogs/process_dialog.ui:127 data/resources/ui/dialogs/settings_dialog.ui:163 #: data/resources/ui/dialogs/settings_dialog.ui:255 src/ui/pages/applications/mod.rs:1361 src/ui/pages/processes/mod.rs:1651 msgid "Video Memory" msgstr "Видео памет" #: data/resources/ui/dialogs/app_dialog.ui:158 data/resources/ui/dialogs/process_dialog.ui:136 data/resources/ui/dialogs/settings_dialog.ui:168 #: data/resources/ui/dialogs/settings_dialog.ui:260 src/ui/pages/applications/mod.rs:1240 src/ui/pages/processes/mod.rs:1529 msgid "Video Encoder" msgstr "Видео кодер" #: data/resources/ui/dialogs/app_dialog.ui:167 data/resources/ui/dialogs/process_dialog.ui:145 data/resources/ui/dialogs/settings_dialog.ui:173 #: data/resources/ui/dialogs/settings_dialog.ui:265 src/ui/pages/applications/mod.rs:1301 src/ui/pages/processes/mod.rs:1590 msgid "Video Decoder" msgstr "Видео декодер" #: data/resources/ui/dialogs/app_dialog.ui:174 data/resources/ui/dialogs/process_dialog.ui:179 data/resources/ui/pages/battery.ui:33 #: data/resources/ui/pages/cpu.ui:83 data/resources/ui/pages/drive.ui:54 data/resources/ui/pages/gpu.ui:74 data/resources/ui/pages/memory.ui:42 #: data/resources/ui/pages/network.ui:51 data/resources/ui/pages/npu.ui:68 msgid "Properties" msgstr "Свойства" #: data/resources/ui/dialogs/app_dialog.ui:180 msgid "ID" msgstr "ИД" #: data/resources/ui/dialogs/app_dialog.ui:190 data/resources/ui/dialogs/process_dialog.ui:195 msgid "Running Since" msgstr "Работи от" #: data/resources/ui/dialogs/app_dialog.ui:198 msgid "Running Processes" msgstr "Работещи процеси" #: data/resources/ui/dialogs/app_dialog.ui:207 data/resources/ui/dialogs/process_dialog.ui:231 msgid "Containerized" msgstr "В контейнер" #: data/resources/ui/dialogs/process_dialog.ui:7 msgid "Process Information" msgstr "Информация за процеса" #: data/resources/ui/dialogs/process_dialog.ui:154 data/resources/ui/dialogs/settings_dialog.ui:270 src/ui/pages/processes/mod.rs:1711 msgid "Total CPU Time" msgstr "Общо процесорно време" #: data/resources/ui/dialogs/process_dialog.ui:163 data/resources/ui/dialogs/settings_dialog.ui:275 src/ui/pages/processes/mod.rs:1770 msgid "User CPU Time" msgstr "Потребителско процесорно време" #: data/resources/ui/dialogs/process_dialog.ui:172 data/resources/ui/dialogs/settings_dialog.ui:280 src/ui/pages/processes/mod.rs:1829 msgid "System CPU Time" msgstr "Системно процесорно време" #: data/resources/ui/dialogs/process_dialog.ui:186 data/resources/ui/dialogs/settings_dialog.ui:210 src/ui/pages/processes/mod.rs:973 msgid "Process ID" msgstr "Ид. на процес" #: data/resources/ui/dialogs/process_dialog.ui:204 data/resources/ui/dialogs/settings_dialog.ui:300 src/ui/pages/processes/mod.rs:2075 msgid "Commandline" msgstr "Команден ред" #: data/resources/ui/dialogs/process_dialog.ui:213 data/resources/ui/dialogs/settings_dialog.ui:215 src/ui/pages/processes/mod.rs:1026 msgid "User" msgstr "Потребител" #: data/resources/ui/dialogs/process_dialog.ui:222 msgid "Control Group" msgstr "Група за контрол" #: data/resources/ui/dialogs/process_options_dialog.ui:7 data/resources/ui/dialogs/process_options_dialog.ui:69 msgid "Process Options" msgstr "Настройки на процеса" #: data/resources/ui/dialogs/process_options_dialog.ui:29 msgid "Apply" msgstr "Прилагане" #: data/resources/ui/dialogs/process_options_dialog.ui:72 msgid "Niceness" msgstr "Ниво на приоритет" #: data/resources/ui/dialogs/process_options_dialog.ui:73 msgid "The priority of a process is given by its niceness. A lower niceness value correspond to a higher priority." msgstr "Приоритетът на даден процес се определя от неговото ниво. По-ниската стойност на нивото съответства на по-висок приоритет." #: data/resources/ui/dialogs/process_options_dialog.ui:87 data/resources/ui/dialogs/settings_dialog.ui:285 src/ui/pages/processes/mod.rs:1888 msgid "Priority" msgstr "Приоритет" #: data/resources/ui/dialogs/process_options_dialog.ui:91 msgctxt "process priority" msgid "Very High" msgstr "Много висок" #: data/resources/ui/dialogs/process_options_dialog.ui:92 msgctxt "process priority" msgid "High" msgstr "Висок" #: data/resources/ui/dialogs/process_options_dialog.ui:93 msgctxt "process priority" msgid "Normal" msgstr "Нормален" #: data/resources/ui/dialogs/process_options_dialog.ui:94 msgctxt "process priority" msgid "Low" msgstr "Нисък" #: data/resources/ui/dialogs/process_options_dialog.ui:95 msgctxt "process priority" msgid "Very Low" msgstr "Много нисък" #: data/resources/ui/dialogs/process_options_dialog.ui:103 msgid "Processor Affinity" msgstr "Афинитет на процесора" #: data/resources/ui/dialogs/process_options_dialog.ui:108 msgid "Toggle All" msgstr "Превключване на всички" #: data/resources/ui/dialogs/process_options_dialog.ui:111 msgid "Select which processor cores the process is allowed to run on" msgstr "Изберете на процесорните ядра за изпълнение на процеса" #: data/resources/ui/dialogs/settings_dialog.ui:7 msgid "General" msgstr "Общи" #: data/resources/ui/dialogs/settings_dialog.ui:10 msgid "Units" msgstr "Единици" #: data/resources/ui/dialogs/settings_dialog.ui:13 msgid "Data Unit Prefix" msgstr "Представка за единиците данни" #: data/resources/ui/dialogs/settings_dialog.ui:17 msgid "Decimal" msgstr "Десетична" #: data/resources/ui/dialogs/settings_dialog.ui:18 msgid "Binary" msgstr "Двоична" #: data/resources/ui/dialogs/settings_dialog.ui:26 msgid "Show Network Speeds in Bits per Second" msgstr "Показване на скоростта на мрежата в битове в секунда" #: data/resources/ui/dialogs/settings_dialog.ui:31 msgid "Temperature Unit" msgstr "Единица за температура" #: data/resources/ui/dialogs/settings_dialog.ui:35 msgid "Celsius" msgstr "Целзий" #: data/resources/ui/dialogs/settings_dialog.ui:36 msgid "Kelvin" msgstr "Келвин" #: data/resources/ui/dialogs/settings_dialog.ui:37 msgid "Fahrenheit" msgstr "Фаренхайт" #: data/resources/ui/dialogs/settings_dialog.ui:47 msgid "User Interface" msgstr "Потребителски интерфейс" #: data/resources/ui/dialogs/settings_dialog.ui:50 msgid "Refresh Speed" msgstr "Скорост на опресняване" #: data/resources/ui/dialogs/settings_dialog.ui:51 msgid "Higher refresh speeds can lead to higher processor usage" msgstr "По-високите скорости на опресняване може да натоварят процесора" #: data/resources/ui/dialogs/settings_dialog.ui:55 msgctxt "UI refresh speed" msgid "Very Slow" msgstr "Много бавна" #: data/resources/ui/dialogs/settings_dialog.ui:56 msgctxt "UI refresh speed" msgid "Slow" msgstr "Бавна" #: data/resources/ui/dialogs/settings_dialog.ui:57 msgctxt "UI refresh speed" msgid "Normal" msgstr "Нормална" #: data/resources/ui/dialogs/settings_dialog.ui:58 msgctxt "UI refresh speed" msgid "Fast" msgstr "Бърза" #: data/resources/ui/dialogs/settings_dialog.ui:59 msgctxt "UI refresh speed" msgid "Very Fast" msgstr "Много бърза" #: data/resources/ui/dialogs/settings_dialog.ui:67 msgid "Show Graph Grids" msgstr "Показване на мрежата на графиките" #: data/resources/ui/dialogs/settings_dialog.ui:72 msgid "Graph Data Points" msgstr "Брой точки на графиките" #: data/resources/ui/dialogs/settings_dialog.ui:86 msgid "Show Usage Details in Sidebar" msgstr "Подробности за използването в страничната лента" #: data/resources/ui/dialogs/settings_dialog.ui:87 msgid "If enabled, the usage along with other information will be displayed" msgstr "Когато е включено, се показва и друга информация освен използването" #: data/resources/ui/dialogs/settings_dialog.ui:92 msgid "Show Device Descriptions in Sidebar" msgstr "Показване на описанията на устройствата в страничната лента" #: data/resources/ui/dialogs/settings_dialog.ui:93 msgid "If enabled, a device identifier like its name or device type will be displayed" msgstr "Когато е включено, ще се покаже идентификаторът на устройството, като например неговото име или вид" #: data/resources/ui/dialogs/settings_dialog.ui:98 msgid "Sidebar Meter Type" msgstr "Вид на визуализацията в страничната лента" #: data/resources/ui/dialogs/settings_dialog.ui:102 msgid "Bar" msgstr "Ивици" #: data/resources/ui/dialogs/settings_dialog.ui:103 msgid "Graph" msgstr "Графики" #: data/resources/ui/dialogs/settings_dialog.ui:111 msgid "Normalize Processor Usage" msgstr "Нормализиране на използването на процесора" #: data/resources/ui/dialogs/settings_dialog.ui:112 msgid "If enabled, the total usage of all cores will be divided by the amount of cores" msgstr "Когато е включено, общото използване на всички ядра ще бъде разделено на броя на ядрата" #: data/resources/ui/dialogs/settings_dialog.ui:122 data/resources/ui/window.ui:65 data/resources/ui/window.ui:72 src/ui/pages/applications/mod.rs:131 msgid "Apps" msgstr "Програми" #: data/resources/ui/dialogs/settings_dialog.ui:125 data/resources/ui/dialogs/settings_dialog.ui:207 msgid "Information Columns" msgstr "Информационни колони" # Или обединена? #: data/resources/ui/dialogs/settings_dialog.ui:183 data/resources/ui/dialogs/settings_dialog.ui:295 src/ui/pages/applications/mod.rs:1479 #: src/ui/pages/processes/mod.rs:2014 msgid "Combined Memory" msgstr "Комбинирана памет" #: data/resources/ui/dialogs/settings_dialog.ui:193 data/resources/ui/window.ui:105 data/resources/ui/window.ui:112 src/ui/pages/processes/mod.rs:175 msgid "Processes" msgstr "Процеси" #: data/resources/ui/dialogs/settings_dialog.ui:196 data/resources/ui/pages/cpu.ui:22 data/resources/ui/pages/processes.ui:56 msgid "Options" msgstr "Опции" #: data/resources/ui/dialogs/settings_dialog.ui:199 msgid "Show Niceness Values" msgstr "Показване на нивата на приоритет" #: data/resources/ui/dialogs/settings_dialog.ui:200 msgid "Display priorities as niceness to allow for more fine-grained adjustments" msgstr "Показва приоритетите като нива за по-прецизно настройване" #: data/resources/ui/dialogs/settings_dialog.ui:310 msgid "Devices" msgstr "Устройства" #: data/resources/ui/dialogs/settings_dialog.ui:313 msgid "Drives" msgstr "Дискове" #: data/resources/ui/dialogs/settings_dialog.ui:316 msgid "Show Virtual Drives" msgstr "Показване на виртуалните дискове" #: data/resources/ui/dialogs/settings_dialog.ui:317 msgid "Virtual drives are for example ZFS volumes or mapped devices" msgstr "Виртуалните устройства са например томове на ZFS или зададени устройства" #: data/resources/ui/dialogs/settings_dialog.ui:327 msgid "Show Virtual Network Interfaces" msgstr "Показване на виртуалните мрежови интерфейси" #: data/resources/ui/dialogs/settings_dialog.ui:328 msgid "Virtual network interfaces are for example bridges or VPN tunnels" msgstr "Виртуалните мрежови интерфейси са напр. мостове или тунели по ВЧМ" #: data/resources/ui/pages/applications.ui:6 data/resources/ui/pages/applications.ui:26 src/ui/pages/applications/mod.rs:1563 msgid "Kill App" msgstr "Убиване на програмата" #: data/resources/ui/pages/applications.ui:10 data/resources/ui/pages/applications.ui:30 src/ui/pages/applications/mod.rs:1562 msgid "Halt App" msgstr "Спиране на програмата" #: data/resources/ui/pages/applications.ui:14 data/resources/ui/pages/applications.ui:34 src/ui/pages/applications/mod.rs:1564 msgid "Continue App" msgstr "Продължаване на програмата" #: data/resources/ui/pages/applications.ui:22 data/resources/ui/pages/applications.ui:98 src/ui/pages/applications/mod.rs:1561 msgid "End App" msgstr "Прекратяване на програмата" #: data/resources/ui/pages/applications.ui:40 data/resources/ui/pages/processes.ui:62 msgid "Information" msgstr "Информация" #: data/resources/ui/pages/applications.ui:57 msgid "Search applications" msgstr "Търсене на програми" #: data/resources/ui/pages/applications.ui:87 data/resources/ui/pages/applications.ui:89 msgid "Show App Information" msgstr "Показване на информация за програмата" #: data/resources/ui/pages/battery.ui:36 msgid "Battery Health" msgstr "Здраве на батерията" #: data/resources/ui/pages/battery.ui:45 msgid "Design Capacity" msgstr "Начален капацитет" #: data/resources/ui/pages/battery.ui:54 msgid "Charge Cycles" msgstr "Цикли на зареждане" #: data/resources/ui/pages/battery.ui:63 msgid "Technology" msgstr "Технология" #: data/resources/ui/pages/battery.ui:72 data/resources/ui/pages/gpu.ui:81 data/resources/ui/pages/network.ui:58 data/resources/ui/pages/npu.ui:75 msgid "Manufacturer" msgstr "Производител" #: data/resources/ui/pages/battery.ui:81 msgid "Model Name" msgstr "Име на модела" #: data/resources/ui/pages/battery.ui:90 data/resources/ui/pages/drive.ui:66 msgid "Device" msgstr "Устройство" #: data/resources/ui/pages/cpu.ui:26 msgid "Show Usages of Logical CPUs" msgstr "Използване на логическите процесори" #: data/resources/ui/pages/cpu.ui:75 data/resources/ui/pages/gpu.ui:66 data/resources/ui/pages/npu.ui:60 msgid "Sensors" msgstr "Сензори" #: data/resources/ui/pages/cpu.ui:90 msgid "Max Frequency" msgstr "Максимална честота" #: data/resources/ui/pages/cpu.ui:99 msgid "Logical Cores" msgstr "Логически ядра" #: data/resources/ui/pages/cpu.ui:108 msgid "Physical Cores" msgstr "Физически ядра" #: data/resources/ui/pages/cpu.ui:117 msgid "Sockets" msgstr "Гнезда" #: data/resources/ui/pages/cpu.ui:126 msgid "Uptime" msgstr "Време на работа" #: data/resources/ui/pages/cpu.ui:135 msgid "Virtualization" msgstr "Виртуализация" #: data/resources/ui/pages/cpu.ui:144 msgid "Architecture" msgstr "Архитектура" #: data/resources/ui/pages/drive.ui:38 msgid "Total Read" msgstr "Общо четене" #: data/resources/ui/pages/drive.ui:47 msgid "Total Written" msgstr "Общо записи" #: data/resources/ui/pages/drive.ui:57 data/resources/ui/pages/memory.ui:72 msgid "Type" msgstr "Вид" #: data/resources/ui/pages/drive.ui:75 msgid "Capacity" msgstr "Капацитет" #: data/resources/ui/pages/drive.ui:84 msgid "Writable" msgstr "Записваем" #: data/resources/ui/pages/drive.ui:93 msgid "Removable" msgstr "Преносим" #. Translators: "Link" refers to something like "PCIe 4.0 ×16" #: data/resources/ui/pages/drive.ui:102 data/resources/ui/pages/gpu.ui:113 data/resources/ui/pages/network.ui:103 data/resources/ui/pages/npu.ui:107 msgid "Link" msgstr "Връзка" #: data/resources/ui/pages/gpu.ui:37 msgid "GPU Frequency" msgstr "Честота на видеокартата" #: data/resources/ui/pages/gpu.ui:50 msgid "Video Memory Frequency" msgstr "Честота на видео паметта" #: data/resources/ui/pages/gpu.ui:55 data/resources/ui/pages/npu.ui:49 src/ui/pages/battery.rs:217 msgid "Power Usage" msgstr "Енергопотребление" #: data/resources/ui/pages/gpu.ui:90 data/resources/ui/pages/npu.ui:84 msgid "PCI Slot" msgstr "Слот на PCI" #: data/resources/ui/pages/gpu.ui:99 data/resources/ui/pages/network.ui:67 data/resources/ui/pages/npu.ui:93 msgid "Driver Used" msgstr "Драйвер" #: data/resources/ui/pages/gpu.ui:108 data/resources/ui/pages/npu.ui:102 msgid "Max Power Cap" msgstr "Максимална мощност" #: data/resources/ui/pages/memory.ui:9 msgid "You need to authenticate to see memory properties" msgstr "За достъп до свойствата на паметта е необходима идентификация" #: data/resources/ui/pages/memory.ui:10 msgid "Authenticate" msgstr "Идентифициране" #: data/resources/ui/pages/memory.ui:45 msgid "Slots Used" msgstr "Използвани слотове" #: data/resources/ui/pages/memory.ui:54 msgid "Speed" msgstr "Скорост" #: data/resources/ui/pages/memory.ui:63 msgid "Form Factor" msgstr "Формат" #: data/resources/ui/pages/memory.ui:81 msgid "Type Detail" msgstr "Подробности за вида" #: data/resources/ui/pages/network.ui:35 msgid "Total Received" msgstr "Общо получени" #: data/resources/ui/pages/network.ui:44 msgid "Total Sent" msgstr "Общо изпратени" #: data/resources/ui/pages/network.ui:76 msgid "Interface" msgstr "Интерфейс" #: data/resources/ui/pages/network.ui:85 msgid "Hardware Address" msgstr "Хардуерен адрес" #: data/resources/ui/pages/network.ui:94 msgid "Network Name" msgstr "Име на мрежата" #: data/resources/ui/pages/network.ui:112 msgid "Link Speed" msgstr "Скорост на връзката" #: data/resources/ui/pages/npu.ui:31 msgid "NPU Frequency" msgstr "Честота на НП" #: data/resources/ui/pages/npu.ui:44 msgid "Memory Frequency" msgstr "Честота на паметта" #: data/resources/ui/pages/processes.ui:6 data/resources/ui/pages/processes.ui:42 src/ui/pages/processes/mod.rs:2184 msgid "Kill Process" msgstr "Убиване на процеса" #: data/resources/ui/pages/processes.ui:10 data/resources/ui/pages/processes.ui:46 src/ui/pages/processes/mod.rs:2183 msgid "Halt Process" msgstr "Спиране на процеса" #: data/resources/ui/pages/processes.ui:14 data/resources/ui/pages/processes.ui:50 src/ui/pages/processes/mod.rs:2185 msgid "Continue Process" msgstr "Продължаване на процеса" #: data/resources/ui/pages/processes.ui:22 data/resources/ui/pages/processes.ui:74 msgid "Kill Processes" msgstr "Убиване на процесите" #: data/resources/ui/pages/processes.ui:26 data/resources/ui/pages/processes.ui:78 msgid "Halt Processes" msgstr "Спиране на процесите" #: data/resources/ui/pages/processes.ui:30 data/resources/ui/pages/processes.ui:82 msgid "Continue Processes" msgstr "Продължаване на процесите" #: data/resources/ui/pages/processes.ui:38 data/resources/ui/pages/processes.ui:157 src/ui/pages/processes/mod.rs:524 src/ui/pages/processes/mod.rs:2182 msgid "End Process" msgstr "Прекратяване на процеса" #: data/resources/ui/pages/processes.ui:70 src/ui/pages/processes/mod.rs:528 msgid "End Processes" msgstr "Прекратяване на процесите" #: data/resources/ui/pages/processes.ui:103 msgid "Search processes" msgstr "Търсене на процеси" #: data/resources/ui/pages/processes.ui:133 data/resources/ui/pages/processes.ui:135 msgid "Show Process Options" msgstr "Показване на настройките на процеса" #: data/resources/ui/pages/processes.ui:146 data/resources/ui/pages/processes.ui:148 msgid "Show Process Information" msgstr "Показване на информацията за процеса" #: data/resources/ui/shortcuts.ui:6 msgctxt "shortcut window" msgid "General" msgstr "Общи" #: data/resources/ui/shortcuts.ui:9 msgctxt "shortcut window" msgid "Preferences" msgstr "Настройки" #: data/resources/ui/shortcuts.ui:15 msgctxt "shortcut window" msgid "Show Shortcuts" msgstr "Показване на клавишните комбинации" #: data/resources/ui/shortcuts.ui:21 msgctxt "shortcut window" msgid "Quit" msgstr "Спиране на програмата" #: data/resources/ui/shortcuts.ui:29 msgctxt "shortcut window" msgid "Apps/Processes" msgstr "Приложения/Процеси" #: data/resources/ui/shortcuts.ui:32 msgctxt "shortcut window" msgid "Toggle Search Field" msgstr "Превключване на полето за търсене" #: data/resources/ui/shortcuts.ui:38 msgctxt "shortcut window" msgid "End App/Process" msgstr "Прекратяване на програма/процес" #: data/resources/ui/shortcuts.ui:44 msgctxt "shortcut window" msgid "Kill App/Process" msgstr "Убиване на програма/процес" #: data/resources/ui/shortcuts.ui:50 msgctxt "shortcut window" msgid "Halt App/Process" msgstr "Спиране на програма/процес" # или продължаване? не ми звучи разбираемо #: data/resources/ui/shortcuts.ui:56 msgctxt "shortcut window" msgid "Continue App/Process" msgstr "Възобновяване на програма/процес" #: data/resources/ui/shortcuts.ui:62 msgctxt "shortcut window" msgid "Show Information for App/Process" msgstr "Показване на информация за програма/процес" #: data/resources/ui/shortcuts.ui:68 msgctxt "shortcut window" msgid "Show Process Options" msgstr "Показване на опциите на процес" #: data/resources/ui/window.ui:6 msgid "Preferences" msgstr "Настройки" #: data/resources/ui/window.ui:10 msgid "Keyboard Shortcuts" msgstr "Клавишни комбинации" #: data/resources/ui/window.ui:14 msgid "About Resources" msgstr "Относно „Ресурси“" #: data/resources/ui/window.ui:88 data/resources/ui/window.ui:128 msgid "Search" msgstr "Търсене" #: data/resources/ui/window.ui:90 data/resources/ui/window.ui:130 msgid "Toggle search field" msgstr "Превключване на полето за търсене" #: src/application.rs:274 msgid "The Nalux Team" msgstr "Екипът на Nalux" #: src/application.rs:282 msgid "Report Issues" msgstr "Доклад на проблем" #. Translator credits. Replace "translator-credits" with your name/username, and optionally an email or URL. #. One name per line, please do not remove previous names. #: src/application.rs:288 msgid "translator-credits" msgstr "" "Twlvnn Kraftwerk <kraft_werk@tutanota.com>\n" "\n" "\n" "Проектът за превод на GNOME има нужда от подкрепа.\n" "Научете повече за нас на уеб сайта ни.\n" "Докладвайте за грешки в превода в съответния раздел." #: src/application.rs:289 msgid "Icon by" msgstr "Иконка от" #: src/ui/dialogs/app_dialog.rs:155 src/ui/dialogs/process_dialog.rs:133 src/ui/dialogs/process_dialog.rs:137 src/ui/dialogs/process_dialog.rs:146 #: src/ui/dialogs/process_dialog.rs:148 src/ui/dialogs/process_dialog.rs:171 src/ui/dialogs/process_dialog.rs:178 src/ui/dialogs/process_dialog.rs:185 #: src/ui/dialogs/process_dialog.rs:192 src/ui/pages/applications/mod.rs:948 src/ui/pages/applications/mod.rs:1074 src/ui/pages/battery.rs:205 #: src/ui/pages/battery.rs:225 src/ui/pages/battery.rs:231 src/ui/pages/battery.rs:234 src/ui/pages/battery.rs:265 src/ui/pages/battery.rs:289 #: src/ui/pages/battery.rs:291 src/ui/pages/battery.rs:301 src/ui/pages/cpu.rs:243 src/ui/pages/cpu.rs:258 src/ui/pages/cpu.rs:278 src/ui/pages/cpu.rs:284 #: src/ui/pages/cpu.rs:290 src/ui/pages/cpu.rs:296 src/ui/pages/cpu.rs:300 src/ui/pages/cpu.rs:303 src/ui/pages/cpu.rs:341 src/ui/pages/cpu.rs:448 #: src/ui/pages/drive.rs:319 src/ui/pages/drive.rs:350 src/ui/pages/drive.rs:352 src/ui/pages/drive.rs:381 src/ui/pages/drive.rs:383 src/ui/pages/drive.rs:399 #: src/ui/pages/drive.rs:400 src/ui/pages/drive.rs:407 src/ui/pages/drive.rs:417 src/ui/pages/drive.rs:427 src/ui/pages/drive.rs:433 src/ui/pages/gpu.rs:245 #: src/ui/pages/gpu.rs:252 src/ui/pages/gpu.rs:297 src/ui/pages/gpu.rs:322 src/ui/pages/gpu.rs:325 src/ui/pages/gpu.rs:336 src/ui/pages/gpu.rs:377 #: src/ui/pages/gpu.rs:384 src/ui/pages/gpu.rs:396 src/ui/pages/gpu.rs:403 src/ui/pages/gpu.rs:407 src/ui/pages/gpu.rs:437 src/ui/pages/gpu.rs:443 #: src/ui/pages/memory.rs:227 src/ui/pages/memory.rs:228 src/ui/pages/memory.rs:232 src/ui/pages/memory.rs:233 src/ui/pages/memory.rs:237 #: src/ui/pages/memory.rs:238 src/ui/pages/memory.rs:266 src/ui/pages/memory.rs:327 src/ui/pages/network.rs:252 src/ui/pages/network.rs:259 #: src/ui/pages/network.rs:266 src/ui/pages/network.rs:272 src/ui/pages/network.rs:275 src/ui/pages/network.rs:285 src/ui/pages/network.rs:292 #: src/ui/pages/network.rs:302 src/ui/pages/network.rs:370 src/ui/pages/network.rs:373 src/ui/pages/network.rs:375 src/ui/pages/network.rs:404 #: src/ui/pages/network.rs:407 src/ui/pages/network.rs:409 src/ui/pages/network.rs:417 src/ui/pages/network.rs:424 src/ui/pages/network.rs:434 #: src/ui/pages/processes/mod.rs:1225 src/ui/pages/processes/mod.rs:1292 src/ui/pages/processes/mod.rs:1359 src/ui/pages/processes/mod.rs:1426 #: src/ui/pages/processes/mod.rs:1912 src/ui/pages/processes/mod.rs:1914 src/utils/battery.rs:152 src/utils/drive.rs:137 src/utils/gpu/mod.rs:279 #: src/utils/gpu/mod.rs:291 src/utils/link/mod.rs:61 src/utils/npu/mod.rs:244 src/utils/npu/mod.rs:250 msgid "N/A" msgstr "Липсва" #: src/ui/dialogs/process_options_dialog.rs:147 src/ui/pages/cpu.rs:257 src/ui/pages/cpu.rs:417 src/ui/pages/cpu.rs:421 msgid "CPU {}" msgstr "ЦП {}" #: src/ui/pages/applications/application_entry.rs:190 src/ui/pages/drive.rs:414 src/ui/pages/drive.rs:424 src/ui/pages/processes/process_entry.rs:211 msgid "No" msgstr "Не" #: src/ui/pages/applications/application_entry.rs:191 src/ui/pages/processes/process_entry.rs:212 msgid "Yes (Flatpak)" msgstr "Да (Flatpak)" #: src/ui/pages/applications/application_entry.rs:192 src/ui/pages/processes/process_entry.rs:213 msgid "Yes (Snap)" msgstr "Да (Snap)" #: src/ui/pages/applications/mod.rs:660 msgid "Running Apps: {}" msgstr "Работещи програми: {}" #: src/ui/pages/applications/mod.rs:700 src/ui/pages/processes/mod.rs:863 msgid "Cancel" msgstr "Отказване" #: src/ui/pages/applications/mod.rs:746 msgid "App" msgstr "Програма" #: src/ui/pages/applications/mod.rs:1539 src/ui/pages/processes/mod.rs:2131 msgid "End {}?" msgstr "Прекратяване на {}?" #: src/ui/pages/applications/mod.rs:1540 src/ui/pages/processes/mod.rs:2132 msgid "Halt {}?" msgstr "Спиране на {}?" #: src/ui/pages/applications/mod.rs:1541 src/ui/pages/processes/mod.rs:2133 msgid "Kill {}?" msgstr "Убиване на на {}?" #: src/ui/pages/applications/mod.rs:1542 src/ui/pages/processes/mod.rs:2134 msgid "Continue {}?" msgstr "Продължаване на {}?" #: src/ui/pages/applications/mod.rs:1548 src/ui/pages/processes/mod.rs:2169 msgid "Unsaved work might be lost." msgstr "Незапазената работа може да се загуби." #: src/ui/pages/applications/mod.rs:1550 msgid "Halting an app can come with serious risks such as losing data and security implications. Use with caution." msgstr "Спирането на програма може да доведе до сериозни рискове, като загуба на данни и последствия за сигурността. Внимавайте!" #: src/ui/pages/applications/mod.rs:1553 msgid "Killing an app can come with serious risks such as losing data and security implications. Use with caution." msgstr "Убиването на програма може да доведе до сериозни рискове, като загуба на данни и последствия за сигурността. Внимавайте!" #: src/ui/pages/battery.rs:102 src/utils/battery.rs:258 msgid "Battery" msgstr "Батерия" #: src/ui/pages/battery.rs:210 msgid "Battery Charge" msgstr "Заряд на батерията" #: src/ui/pages/battery.rs:279 src/ui/pages/cpu.rs:438 src/ui/pages/drive.rs:344 src/ui/pages/drive.rs:375 src/ui/pages/gpu.rs:429 src/ui/pages/network.rs:362 #: src/ui/pages/network.rs:396 msgid "Highest:" msgstr "Най-висока:" #: src/ui/pages/cpu.rs:242 src/ui/pages/gpu.rs:212 msgid "Total Usage" msgstr "Общо използване" #: src/ui/pages/cpu.rs:271 src/ui/pages/gpu.rs:239 msgid "Temperature" msgstr "Температура" #: src/ui/pages/drive.rs:126 msgid "Drive" msgstr "Устройство" #: src/ui/pages/drive.rs:236 msgid "Drive Activity" msgstr "Дейност на диска" #: src/ui/pages/drive.rs:243 msgid "Read Speed" msgstr "Скорост на четене" #: src/ui/pages/drive.rs:247 msgid "Write Speed" msgstr "Скорост на записване" #: src/ui/pages/drive.rs:412 src/ui/pages/drive.rs:422 msgid "Yes" msgstr "Да" #. Translators: This is an abbreviation for "Read" and "Write". This is displayed in the sidebar so your #. translation should preferably be quite short or an abbreviation #: src/ui/pages/drive.rs:440 msgid "R: {} · W: {}" msgstr "Ч: {} · З: {}" #: src/ui/pages/gpu.rs:220 msgid "Video Encoder/Decoder Usage" msgstr "Използване на видео кодера/декодера" #: src/ui/pages/gpu.rs:226 msgid "Video Encoder Usage" msgstr "Използване на видео кодера" #: src/ui/pages/gpu.rs:231 msgid "Video Decoder Usage" msgstr "Използване на видео декодера" #: src/ui/pages/gpu.rs:236 msgid "Video Memory Usage" msgstr "Използване на видео паметта" #. Translators: This will be displayed in the sidebar, please try to keep your translation as short as (or even #. shorter than) 'Memory' #: src/ui/pages/gpu.rs:415 msgid "Memory: {}" msgstr "Памет: {}" #: src/ui/pages/memory.rs:262 msgid "{} of {}" msgstr "{} от {}" #: src/ui/pages/memory.rs:265 msgid "{} MT/s" msgstr "{} МТ/с" #. Translators: This will be displayed in the sidebar, so your translation for "Swap" should #. preferably be quite short or an abbreviation #: src/ui/pages/memory.rs:346 msgid "{} / {} · Swap: {} %" msgstr "{} / {} · Странициране: {} %" #: src/ui/pages/network.rs:127 src/utils/network.rs:135 msgid "Network Interface" msgstr "Мрежов интерфейс" #: src/ui/pages/network.rs:241 msgid "Receiving" msgstr "Получаване" #: src/ui/pages/network.rs:245 msgid "Sending" msgstr "Изпращане" #. Translators: This is an abbreviation for "Receive" and "Send". This is displayed in the sidebar so #. your translation should preferably be quite short or an abbreviation #: src/ui/pages/network.rs:445 msgid "R: {} · S: {}" msgstr "П: {} · И: {}" #: src/ui/pages/processes/mod.rs:814 msgid "Running Processes: {}" msgstr "Работещи процеси: {}" #: src/ui/pages/processes/mod.rs:912 msgid "Process" msgstr "Процес" #: src/ui/pages/processes/mod.rs:2141 msgid "End process?" msgid_plural "End {} processes?" msgstr[0] "Прекратяване на процеса?" msgstr[1] "Прекратяване на {} процеса?" #: src/ui/pages/processes/mod.rs:2147 msgid "Halt process?" msgid_plural "Halt {} processes?" msgstr[0] "Спиране на процеса?" msgstr[1] "Спиране на {} процеса?" #: src/ui/pages/processes/mod.rs:2153 src/ui/pages/processes/mod.rs:2159 msgid "Kill process?" msgid_plural "Kill {} processes?" msgstr[0] "Убиване нароцеса?" msgstr[1] "Убиване на {} процеса?" #: src/ui/pages/processes/mod.rs:2171 msgid "Halting a process can come with serious risks such as losing data and security implications. Use with caution." msgstr "Спирането на процес може да доведе до сериозни рискове, като загуба на данни и последствия за сигурността. Внимавайте!" #: src/ui/pages/processes/mod.rs:2174 msgid "Killing a process can come with serious risks such as losing data and security implications. Use with caution." msgstr "Убиването на процес може да доведе до сериозни рискове, като загуба на данни и последствия за сигурността. Внимавайте!" #: src/ui/window.rs:466 msgid "GPU {}" msgstr "Видеокарта {}" #: src/ui/window.rs:496 msgid "NPU {}" msgstr "НП {}" # Невронен процесор #: src/ui/window.rs:498 msgid "NPU" msgstr "НП" #: src/ui/window.rs:1174 msgid "Successfully adjusted {}" msgstr "Успешно задаване на {}" #: src/ui/window.rs:1175 msgid "There was a problem adjusting {}" msgstr "Проблем при задаването на {}" #: src/ui/window.rs:1257 msgid "Successfully ended {}" msgstr "Успешно прекратяване на {}" #: src/ui/window.rs:1258 msgid "Successfully halted {}" msgstr "Успешно спиране на {}" #: src/ui/window.rs:1259 msgid "Successfully killed {}" msgstr "Успешно убиване на {}" #: src/ui/window.rs:1260 msgid "Successfully continued {}" msgstr "Успешно продължаване на {}" #: src/ui/window.rs:1267 msgid "Successfully ended the process" msgid_plural "Successfully ended {} processes" msgstr[0] "Успешно прекратен процес" msgstr[1] "Успешно прекратени {} процеси" #: src/ui/window.rs:1273 msgid "Successfully halted the process" msgid_plural "Successfully halted {} processes" msgstr[0] "Успешно спрян процес" msgstr[1] "Успешно спрени {} процеси" #: src/ui/window.rs:1279 msgid "Successfully killed the process" msgid_plural "Successfully killed {} processes" msgstr[0] "Успешно убит процес" msgstr[1] "Успешно убити {} процеси" #: src/ui/window.rs:1285 msgid "Successfully continued the process" msgid_plural "Successfully continued {} processes" msgstr[0] "Успешно продължен процес" msgstr[1] "Успешно продължени {} процеси" #: src/ui/window.rs:1296 msgid "There was a problem ending a process" msgid_plural "There were problems ending {} processes" msgstr[0] "Проблем при прекратяването на процеса" msgstr[1] "Проблем при прекратяването на {} процеси" #: src/ui/window.rs:1302 msgid "There was a problem halting a process" msgid_plural "There were problems halting {} processes" msgstr[0] "Проблем при спирането на процеса" msgstr[1] "Проблем при спирането на {} процеси" #: src/ui/window.rs:1308 msgid "There was a problem killing a process" msgid_plural "There were problems killing {} processes" msgstr[0] "Проблем при убиването на процеса" msgstr[1] "Проблем при убиването на {} процеси" #: src/ui/window.rs:1314 msgid "There was a problem continuing a process" msgid_plural "There were problems continuing {} processes" msgstr[0] "Проблем при продължаването на процеса" msgstr[1] "Проблем при продължаването на {} процеси" #: src/ui/window.rs:1324 msgid "There was a problem ending {}" msgstr "Проблем при прекратяването на {}" #: src/ui/window.rs:1325 msgid "There was a problem halting {}" msgstr "Проблем при спирането на {}" #: src/ui/window.rs:1326 msgid "There was a problem killing {}" msgstr "Проблем при убиването на {}" #: src/ui/window.rs:1327 msgid "There was a problem continuing {}" msgstr "Проблем при продължаването на {}" #: src/utils/app.rs:222 msgid "System Processes" msgstr "Системни процеси" #: src/utils/battery.rs:93 msgid "Charging" msgstr "Зареждане" #: src/utils/battery.rs:94 msgid "Discharging" msgstr "Разреждане" #: src/utils/battery.rs:95 msgid "Empty" msgstr "Разредена" #: src/utils/battery.rs:96 msgid "Full" msgstr "Напълно заредено" #: src/utils/battery.rs:97 msgid "Unknown" msgstr "Неизвестно" #: src/utils/battery.rs:143 msgid "Nickel-Metal Hydride" msgstr "Никел-металохидридна" #: src/utils/battery.rs:144 msgid "Nickel-Cadmium" msgstr "Никел-кадмиева" #: src/utils/battery.rs:145 msgid "Nickel-Zinc" msgstr "Никел-цинкова" #: src/utils/battery.rs:146 msgid "Lead-Acid" msgstr "Оловно-киселинна" #: src/utils/battery.rs:147 msgid "Lithium-Ion" msgstr "Литиевойонна" #: src/utils/battery.rs:148 msgid "Lithium Iron Phosphate" msgstr "Литиево-железен фосфат" #: src/utils/battery.rs:149 msgid "Lithium Polymer" msgstr "Литиево-полимерна" #: src/utils/battery.rs:151 msgid "Rechargeable Alkaline Managanese" msgstr "Презареждаща алкално магнезиева" #: src/utils/battery.rs:256 msgid "{} Battery" msgstr "{} батерия" #: src/utils/units.rs:91 msgid "{} K" msgstr "{} K" #: src/utils/units.rs:93 msgid "{} °C" msgstr "{} °C" #: src/utils/units.rs:95 msgid "{} °F" msgstr "{} °F" #: src/utils/units.rs:113 src/utils/units.rs:127 src/utils/units.rs:147 src/utils/units.rs:161 msgid "{} B" msgstr "{} B" #: src/utils/units.rs:114 src/utils/units.rs:128 msgid "{} kB" msgstr "{} kB" #: src/utils/units.rs:115 src/utils/units.rs:129 msgid "{} MB" msgstr "{} MB" #: src/utils/units.rs:116 src/utils/units.rs:130 msgid "{} GB" msgstr "{} GB" #: src/utils/units.rs:117 src/utils/units.rs:131 msgid "{} TB" msgstr "{} TB" #: src/utils/units.rs:118 src/utils/units.rs:132 msgid "{} PB" msgstr "{} PB" #: src/utils/units.rs:119 src/utils/units.rs:133 msgid "{} EB" msgstr "{} EB" #: src/utils/units.rs:120 src/utils/units.rs:134 msgid "{} ZB" msgstr "{} ZB" #: src/utils/units.rs:121 src/utils/units.rs:135 msgid "{} YB" msgstr "{} YB" #: src/utils/units.rs:122 src/utils/units.rs:136 msgid "{} RB" msgstr "{} RB" #: src/utils/units.rs:123 src/utils/units.rs:137 msgid "{} QB" msgstr "{} QB" #: src/utils/units.rs:148 src/utils/units.rs:162 msgid "{} KiB" msgstr "{} KiB" #: src/utils/units.rs:149 src/utils/units.rs:163 msgid "{} MiB" msgstr "{} MiB" #: src/utils/units.rs:150 src/utils/units.rs:164 msgid "{} GiB" msgstr "{} GiB" #: src/utils/units.rs:151 src/utils/units.rs:165 msgid "{} TiB" msgstr "{} TiB" #: src/utils/units.rs:152 src/utils/units.rs:166 msgid "{} PiB" msgstr "{} PiB" #: src/utils/units.rs:153 src/utils/units.rs:167 msgid "{} EiB" msgstr "{} EiB" #: src/utils/units.rs:154 src/utils/units.rs:168 msgid "{} ZiB" msgstr "{} ZiB" #: src/utils/units.rs:155 src/utils/units.rs:169 msgid "{} YiB" msgstr "{} YiB" #: src/utils/units.rs:156 src/utils/units.rs:170 msgid "{} RiB" msgstr "{} RiB" #: src/utils/units.rs:157 src/utils/units.rs:171 msgid "{} QiB" msgstr "{} QiB" #: src/utils/units.rs:198 src/utils/units.rs:215 msgid "{} B/s" msgstr "{} B/s" #: src/utils/units.rs:199 msgid "{} kB/s" msgstr "{} kB/s" #: src/utils/units.rs:200 msgid "{} MB/s" msgstr "{} MB/s" #: src/utils/units.rs:201 msgid "{} GB/s" msgstr "{} GB/s" #: src/utils/units.rs:202 msgid "{} TB/s" msgstr "{} TB/s" #: src/utils/units.rs:203 msgid "{} PB/s" msgstr "{} PB/s" #: src/utils/units.rs:204 msgid "{} EB/s" msgstr "{} EB/s" #: src/utils/units.rs:205 msgid "{} ZB/s" msgstr "{} ZB/s" #: src/utils/units.rs:206 msgid "{} YB/s" msgstr "{} YB/s" #: src/utils/units.rs:207 msgid "{} RB/s" msgstr "{} RB/s" #: src/utils/units.rs:208 msgid "{} QB/s" msgstr "{} QB/s" #: src/utils/units.rs:216 msgid "{} KiB/s" msgstr "{} KiB/s" #: src/utils/units.rs:217 msgid "{} MiB/s" msgstr "{} MiB/s" #: src/utils/units.rs:218 msgid "{} GiB/s" msgstr "{} GiB/s" #: src/utils/units.rs:219 msgid "{} TiB/s" msgstr "{} TiB/s" #: src/utils/units.rs:220 msgid "{} PiB/s" msgstr "{} PiB/s" #: src/utils/units.rs:221 msgid "{} EiB/s" msgstr "{} EiB/s" #: src/utils/units.rs:222 msgid "{} ZiB/s" msgstr "{} ZiB/s" #: src/utils/units.rs:223 msgid "{} YiB/s" msgstr "{} YiB/s" #: src/utils/units.rs:224 msgid "{} RiB/s" msgstr "{} RiB/s" #: src/utils/units.rs:225 msgid "{} QiB/s" msgstr "{} QiB/s" #: src/utils/units.rs:239 src/utils/units.rs:256 msgid "{} b/s" msgstr "{} b/s" #: src/utils/units.rs:240 msgid "{} kb/s" msgstr "{} kb/s" #: src/utils/units.rs:241 msgid "{} Mb/s" msgstr "{} Mb/s" #: src/utils/units.rs:242 msgid "{} Gb/s" msgstr "{} Gb/s" #: src/utils/units.rs:243 msgid "{} Tb/s" msgstr "{} Tb/s" #: src/utils/units.rs:244 msgid "{} Pb/s" msgstr "{} Pb/s" #: src/utils/units.rs:245 msgid "{} Eb/s" msgstr "{} Eb/s" #: src/utils/units.rs:246 msgid "{} Zb/s" msgstr "{} Zb/s" #: src/utils/units.rs:247 msgid "{} Yb/s" msgstr "{} Yb/s" #: src/utils/units.rs:248 msgid "{} Rb/s" msgstr "{} Rb/s" #: src/utils/units.rs:249 msgid "{} Qb/s" msgstr "{} Qb/s" #: src/utils/units.rs:257 msgid "{} Kib/s" msgstr "{} Kib/s" #: src/utils/units.rs:258 msgid "{} Mib/s" msgstr "{} Mib/s" #: src/utils/units.rs:259 msgid "{} Gib/s" msgstr "{} Gib/s" #: src/utils/units.rs:260 msgid "{} Tib/s" msgstr "{} Tib/s" #: src/utils/units.rs:261 msgid "{} Pib/s" msgstr "{} Pib/s" #: src/utils/units.rs:262 msgid "{} Eib/s" msgstr "{} Eib/s" #: src/utils/units.rs:263 msgid "{} Zib/s" msgstr "{} Zib/s" #: src/utils/units.rs:264 msgid "{} Yib/s" msgstr "{} Yib/s" #: src/utils/units.rs:265 msgid "{} Rib/s" msgstr "{} Rib/s" #: src/utils/units.rs:266 msgid "{} Qib/s" msgstr "{} Qib/s" #: src/utils/units.rs:273 msgid "{} Hz" msgstr "{} Hz" #: src/utils/units.rs:274 msgid "{} kHz" msgstr "{} kHz" #: src/utils/units.rs:275 msgid "{} MHz" msgstr "{} MHz" #: src/utils/units.rs:276 msgid "{} GHz" msgstr "{} GHz" #: src/utils/units.rs:277 msgid "{} THz" msgstr "{} THz" #: src/utils/units.rs:278 msgid "{} PHz" msgstr "{} PHz" #: src/utils/units.rs:279 msgid "{} EHz" msgstr "{} EHz" #: src/utils/units.rs:280 msgid "{} ZHz" msgstr "{} ZHz" #: src/utils/units.rs:281 msgid "{} YHz" msgstr "{} YHz" #: src/utils/units.rs:282 msgid "{} RHz" msgstr "{} RHz" #: src/utils/units.rs:283 msgid "{} QHz" msgstr "{} QHz" #: src/utils/units.rs:290 msgid "{} W" msgstr "{} W" #: src/utils/units.rs:291 msgid "{} kW" msgstr "{} kW" #: src/utils/units.rs:292 msgid "{} MW" msgstr "{} MW" #: src/utils/units.rs:293 msgid "{} GW" msgstr "{} GW" #: src/utils/units.rs:294 msgid "{} TW" msgstr "{} TW" #: src/utils/units.rs:295 msgid "{} PW" msgstr "{} PW" #: src/utils/units.rs:296 msgid "{} EW" msgstr "{} EW" #: src/utils/units.rs:297 msgid "{} ZW" msgstr "{} ZW" #: src/utils/units.rs:298 msgid "{} YW" msgstr "{} YW" #: src/utils/units.rs:299 msgid "{} RW" msgstr "{} RW" #: src/utils/units.rs:300 msgid "{} QW" msgstr "{} QW" #: src/utils/units.rs:309 src/utils/units.rs:323 msgid "{} Wh" msgstr "{} Wh" #: src/utils/units.rs:310 src/utils/units.rs:324 msgid "{} kWh" msgstr "{} kWh" #: src/utils/units.rs:311 src/utils/units.rs:325 msgid "{} MWh" msgstr "{} MWh" #: src/utils/units.rs:312 src/utils/units.rs:326 msgid "{} GWh" msgstr "{} GWh" #: src/utils/units.rs:313 src/utils/units.rs:327 msgid "{} TWh" msgstr "{} TWh" #: src/utils/units.rs:314 src/utils/units.rs:328 msgid "{} PWh" msgstr "{} PWh" #: src/utils/units.rs:315 src/utils/units.rs:329 msgid "{} EWh" msgstr "{} EWh" #: src/utils/units.rs:316 src/utils/units.rs:330 msgid "{} ZWh" msgstr "{} ZWh" #: src/utils/units.rs:317 src/utils/units.rs:331 msgid "{} YWh" msgstr "{} YWh" #: src/utils/units.rs:318 src/utils/units.rs:332 msgid "{} RWh" msgstr "{} RWh" #: src/utils/units.rs:319 src/utils/units.rs:333 msgid "{} QWh" msgstr "{} QWh" #: src/utils/drive.rs:129 src/utils/drive.rs:208 msgid "CD/DVD/Blu-ray Drive" msgstr "CD/DVD/Blu-ray диск" #: src/utils/drive.rs:130 msgid "eMMC Storage" msgstr "eMMC памет" #: src/utils/drive.rs:131 msgid "Flash Storage" msgstr "Флаш памет" #: src/utils/drive.rs:132 src/utils/drive.rs:209 msgid "Floppy Drive" msgstr "Дискета" #: src/utils/drive.rs:133 msgid "Hard Disk Drive" msgstr "Твърд диск" #: src/utils/drive.rs:134 msgid "Loop Device" msgstr "Устройство за файлове с образи" #: src/utils/drive.rs:135 msgid "Mapped Device" msgstr "Зададено устройство" #: src/utils/drive.rs:136 msgid "NVMe Drive" msgstr "NVMe диск" #: src/utils/drive.rs:138 msgid "Software Raid" msgstr "Софтуерен RAID" #: src/utils/drive.rs:139 msgid "RAM Disk" msgstr "RAM диск" #: src/utils/drive.rs:140 msgid "Solid State Drive" msgstr "Статично дисково устройство" #: src/utils/drive.rs:141 msgid "ZFS Volume" msgstr "Том на ZFS" #: src/utils/drive.rs:142 msgid "Compressed RAM Disk (zram)" msgstr "Компресиран RAM диск (zram)" #: src/utils/drive.rs:210 msgid "{} Loop Device" msgstr "{} устройство за файлове с образи" #: src/utils/drive.rs:211 msgid "{} Mapped Device" msgstr "{} зададено устройство" #: src/utils/drive.rs:212 msgid "{} RAID" msgstr "{} RAID" #: src/utils/drive.rs:213 msgid "{} RAM Disk" msgstr "{} RAM диск" #: src/utils/drive.rs:214 msgid "{} zram Device" msgstr "{} zram устройство" #: src/utils/drive.rs:215 msgid "{} ZFS Volume" msgstr "{} том на ZFS" #: src/utils/drive.rs:216 msgid "{} Drive" msgstr "{} диск" #: src/utils/network.rs:123 msgid "Bluetooth Tether" msgstr "Точка за достъп по Bluetooth" #: src/utils/network.rs:124 msgid "Network Bridge" msgstr "Мрежов мост" #: src/utils/network.rs:125 msgid "Ethernet Connection" msgstr "Жична връзка" #: src/utils/network.rs:126 msgid "Docker Bridge" msgstr "Мост на Docker" #: src/utils/network.rs:127 msgid "InfiniBand Connection" msgstr "Връзка по InfiniBand" #: src/utils/network.rs:128 msgid "Serial Line IP Connection" msgstr "IP връзка по сериен интерфейс" #: src/utils/network.rs:129 msgid "Virtual Ethernet Device" msgstr "Виртуално Ethernet устройство" #: src/utils/network.rs:130 msgid "VM Network Bridge" msgstr "Мрежов мост" #: src/utils/network.rs:131 msgid "VPN Tunnel" msgstr "Тунел по ВЧМ" #: src/utils/network.rs:132 msgid "VPN Tunnel (WireGuard)" msgstr "Тунел по ВЧМ (WireGuard)" #: src/utils/network.rs:133 msgid "Wi-Fi Connection" msgstr "Връзка към Wi-Fi" #: src/utils/network.rs:134 msgid "WWAN Connection" msgstr "Връзка към WWAN" resources-1.9.1/po/bn.po000066400000000000000000001627341510634446000151310ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-10-19 13:51+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME aritra saha \n" "Language-Team: LANGUAGE \n" "Language: bn\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: data/net.nokyan.Resources.desktop.in.in:3 #: data/net.nokyan.Resources.metainfo.xml.in.in:4 src/application.rs:262 #: data/resources/ui/window.ui:22 msgid "Resources" msgstr "সম্পদ" #. Translators: The summary should be 35 characters or less according to Flathub appstream guidelines #: data/net.nokyan.Resources.desktop.in.in:4 #: data/net.nokyan.Resources.metainfo.xml.in.in:5 msgid "Keep an eye on system resources" msgstr "সিস্টেম সম্পদ পর্যবেক্ষণ করুন" #: data/net.nokyan.Resources.desktop.in.in:10 msgid "" "System;Resources;Monitor;Processes;Usage;Task;Manager;CPU;RAM;Memory;GPU;" msgstr "" "সিস্টেম;সম্পদ;মনিটর;প্রক্রিয়া;ব্যবহার;টাস্ক;ম্যানেজার;সিপিইউ;র‍্যাম;মেমোরি;জিপিইউ;" #: data/net.nokyan.Resources.metainfo.xml.in.in:17 msgid "" "Resources allows you to check the utilization of your system resources and " "control your running processes and apps. It’s designed to be user-friendly " "and feel right at home on a modern desktop by using GNOME’s libadwaita." msgstr "" "সম্পদ আপনাকে আপনার সিস্টেমের সম্পদ ব্যবহার পরীক্ষা করতে এবং চলমান প্রক্রিয়া এবং অ্যাপগুলি নিয়ন্ত্রণ করতে দেয়। এটি ব্যবহারকারী-বান্ধব এবং আধুনিক ডেস্কটপে GNOME-এর libadwaita ব্যবহার করে বাড়ির মতো অনুভব করার জন্য ডিজাইন করা হয়েছে।" #: data/net.nokyan.Resources.metainfo.xml.in.in:20 msgid "Resources supports monitoring the following components:" msgstr "সম্পদ নিম্নলিখিত উপাদানগুলি পর্যবেক্ষণ সমর্থন করে:" #: data/net.nokyan.Resources.metainfo.xml.in.in:24 msgid "CPU" msgstr "সিপিইউ" #: data/net.nokyan.Resources.metainfo.xml.in.in:25 #: src/ui/pages/applications/mod.rs:811 src/ui/pages/memory.rs:105 #: src/ui/pages/memory.rs:186 src/ui/pages/processes/mod.rs:1087 #: data/resources/ui/window.ui:158 data/resources/ui/window.ui:165 #: data/resources/ui/dialogs/app_dialog.ui:82 #: data/resources/ui/dialogs/process_dialog.ui:64 #: data/resources/ui/dialogs/settings_dialog.ui:133 #: data/resources/ui/dialogs/settings_dialog.ui:220 msgid "Memory" msgstr "মেমোরি" #: data/net.nokyan.Resources.metainfo.xml.in.in:26 #: src/ui/pages/applications/mod.rs:1184 src/ui/pages/gpu.rs:114 #: src/ui/pages/processes/mod.rs:1471 src/ui/window.rs:311 #: data/resources/ui/dialogs/app_dialog.ui:140 #: data/resources/ui/dialogs/process_dialog.ui:118 #: data/resources/ui/dialogs/settings_dialog.ui:163 #: data/resources/ui/dialogs/settings_dialog.ui:250 msgid "GPU" msgstr "জিপিইউ" #: data/net.nokyan.Resources.metainfo.xml.in.in:27 #: data/resources/ui/dialogs/settings_dialog.ui:314 msgid "Network Interfaces" msgstr "নেটওয়ার্ক ইন্টারফেস" #: data/net.nokyan.Resources.metainfo.xml.in.in:28 msgid "Storage Devices" msgstr "স্টোরেজ ডিভাইস" #: data/net.nokyan.Resources.metainfo.xml.in.in:29 msgid "Batteries" msgstr "ব্যাটারি" #: data/net.nokyan.Resources.metainfo.xml.in.in:51 msgid "Apps page in light theme" msgstr "হালকা থিমে অ্যাপস পৃষ্ঠা" #: data/net.nokyan.Resources.metainfo.xml.in.in:55 msgid "Processes page in dark theme" msgstr "ডার্ক থিমে প্রক্রিয়া পৃষ্ঠা" #: data/net.nokyan.Resources.metainfo.xml.in.in:59 msgid "Processor page in light theme" msgstr "হালকা থিমে প্রসেসর পৃষ্ঠা" #: data/net.nokyan.Resources.metainfo.xml.in.in:63 msgid "Memory page in dark theme" msgstr "ডার্ক থিমে মেমোরি পৃষ্ঠা" #: data/net.nokyan.Resources.metainfo.xml.in.in:67 msgid "GPU page in light theme" msgstr "হালকা থিমে জিপিইউ পৃষ্ঠা" #: data/net.nokyan.Resources.metainfo.xml.in.in:71 msgid "Drive page in dark theme" msgstr "ডার্ক থিমে ড্রাইভ পৃষ্ঠা" #: data/net.nokyan.Resources.metainfo.xml.in.in:75 msgid "Network Interface page in light theme" msgstr "হালকা থিমে নেটওয়ার্ক ইন্টারফেস পৃষ্ঠা" #: data/net.nokyan.Resources.metainfo.xml.in.in:79 msgid "Battery page in dark theme" msgstr "ডার্ক থিমে ব্যাটারি পৃষ্ঠা" #: src/application.rs:264 msgid "The Nalux Team" msgstr "নালুক্স দল" #: src/application.rs:272 msgid "Report Issues" msgstr "সমস্যা রিপোর্ট করুন" #. Translator credits. Replace "translator-credits" with your name/username, and optionally an email or URL. #. One name per line, please do not remove previous names. #: src/application.rs:278 msgid "translator-credits" msgstr "অনুবাদক-ক্রেডিট" #: src/application.rs:279 msgid "Icon by" msgstr "আইকন দ্বারা" #: src/ui/dialogs/app_dialog.rs:148 src/ui/dialogs/process_dialog.rs:127 #: src/ui/dialogs/process_dialog.rs:131 src/ui/dialogs/process_dialog.rs:140 #: src/ui/dialogs/process_dialog.rs:142 src/ui/dialogs/process_dialog.rs:163 #: src/ui/dialogs/process_dialog.rs:170 src/ui/dialogs/process_dialog.rs:177 #: src/ui/dialogs/process_dialog.rs:184 src/ui/pages/applications/mod.rs:954 #: src/ui/pages/applications/mod.rs:1078 src/ui/pages/battery.rs:196 #: src/ui/pages/battery.rs:216 src/ui/pages/battery.rs:222 #: src/ui/pages/battery.rs:225 src/ui/pages/battery.rs:251 #: src/ui/pages/battery.rs:275 src/ui/pages/battery.rs:277 #: src/ui/pages/battery.rs:287 src/ui/pages/cpu.rs:218 src/ui/pages/cpu.rs:233 #: src/ui/pages/cpu.rs:248 src/ui/pages/cpu.rs:254 src/ui/pages/cpu.rs:260 #: src/ui/pages/cpu.rs:266 src/ui/pages/cpu.rs:270 src/ui/pages/cpu.rs:273 #: src/ui/pages/cpu.rs:370 src/ui/pages/drive.rs:298 src/ui/pages/drive.rs:329 #: src/ui/pages/drive.rs:331 src/ui/pages/drive.rs:360 #: src/ui/pages/drive.rs:362 src/ui/pages/drive.rs:378 #: src/ui/pages/drive.rs:379 src/ui/pages/drive.rs:386 #: src/ui/pages/drive.rs:396 src/ui/pages/drive.rs:406 src/ui/pages/gpu.rs:227 #: src/ui/pages/gpu.rs:267 src/ui/pages/gpu.rs:292 src/ui/pages/gpu.rs:295 #: src/ui/pages/gpu.rs:306 src/ui/pages/gpu.rs:326 src/ui/pages/gpu.rs:338 #: src/ui/pages/gpu.rs:352 src/ui/pages/gpu.rs:354 src/ui/pages/gpu.rs:366 #: src/ui/pages/gpu.rs:373 src/ui/pages/gpu.rs:377 src/ui/pages/memory.rs:221 #: src/ui/pages/memory.rs:222 src/ui/pages/memory.rs:226 #: src/ui/pages/memory.rs:227 src/ui/pages/memory.rs:231 #: src/ui/pages/memory.rs:232 src/ui/pages/memory.rs:260 #: src/ui/pages/memory.rs:317 src/ui/pages/network.rs:230 #: src/ui/pages/network.rs:237 src/ui/pages/network.rs:244 #: src/ui/pages/network.rs:250 src/ui/pages/network.rs:253 #: src/ui/pages/network.rs:314 src/ui/pages/network.rs:317 #: src/ui/pages/network.rs:319 src/ui/pages/network.rs:348 #: src/ui/pages/network.rs:351 src/ui/pages/network.rs:353 #: src/ui/pages/npu.rs:201 src/ui/pages/npu.rs:230 src/ui/pages/npu.rs:248 #: src/ui/pages/npu.rs:260 src/ui/pages/npu.rs:274 src/ui/pages/npu.rs:276 #: src/ui/pages/npu.rs:288 src/ui/pages/npu.rs:295 src/ui/pages/npu.rs:299 #: src/ui/pages/processes/mod.rs:1229 src/ui/pages/processes/mod.rs:1295 #: src/ui/pages/processes/mod.rs:1361 src/ui/pages/processes/mod.rs:1427 #: src/ui/pages/processes/mod.rs:1909 src/ui/pages/processes/mod.rs:1911 #: src/utils/battery.rs:136 src/utils/drive.rs:89 src/utils/gpu/mod.rs:274 #: src/utils/gpu/mod.rs:280 src/utils/npu/mod.rs:241 src/utils/npu/mod.rs:247 msgid "N/A" msgstr "প্রযোজ্য নয়" #: src/ui/dialogs/process_options_dialog.rs:141 src/ui/pages/cpu.rs:232 #: src/ui/pages/cpu.rs:354 src/ui/pages/cpu.rs:358 msgid "CPU {}" msgstr "সিপিইউ {}" #: src/ui/pages/applications/application_entry.rs:183 src/ui/pages/drive.rs:393 #: src/ui/pages/drive.rs:403 src/ui/pages/processes/process_entry.rs:204 msgid "No" msgstr "না" #: src/ui/pages/applications/application_entry.rs:184 #: src/ui/pages/processes/process_entry.rs:205 msgid "Yes (Flatpak)" msgstr "হ্যাঁ (Flatpak)" #: src/ui/pages/applications/application_entry.rs:185 #: src/ui/pages/processes/process_entry.rs:206 msgid "Yes (Snap)" msgstr "হ্যাঁ (Snap)" #: src/ui/pages/applications/mod.rs:134 data/resources/ui/window.ui:65 #: data/resources/ui/window.ui:72 #: data/resources/ui/dialogs/settings_dialog.ui:127 msgid "Apps" msgstr "অ্যাপস" #. -1 because we don't want to count System Processes #: src/ui/pages/applications/mod.rs:668 msgid "Running Apps: {}" msgstr "চলমান অ্যাপস: {}" #: src/ui/pages/applications/mod.rs:708 src/ui/pages/processes/mod.rs:870 msgid "Cancel" msgstr "বাতিল করুন" #: src/ui/pages/applications/mod.rs:754 msgid "App" msgstr "অ্যাপ" #: src/ui/pages/applications/mod.rs:870 src/ui/pages/cpu.rs:122 #: src/ui/pages/processes/mod.rs:1145 src/ui/window.rs:403 #: data/resources/ui/window.ui:127 data/resources/ui/window.ui:134 #: data/resources/ui/dialogs/app_dialog.ui:73 #: data/resources/ui/dialogs/process_dialog.ui:55 #: data/resources/ui/dialogs/settings_dialog.ui:138 #: data/resources/ui/dialogs/settings_dialog.ui:225 msgid "Processor" msgstr "প্রসেসর" #: src/ui/pages/applications/mod.rs:933 src/ui/pages/processes/mod.rs:1208 #: data/resources/ui/dialogs/app_dialog.ui:100 #: data/resources/ui/dialogs/process_dialog.ui:78 #: data/resources/ui/dialogs/settings_dialog.ui:143 #: data/resources/ui/dialogs/settings_dialog.ui:230 msgid "Drive Read" msgstr "ড্রাইভ পড়া" #: src/ui/pages/applications/mod.rs:997 src/ui/pages/processes/mod.rs:1274 #: data/resources/ui/dialogs/app_dialog.ui:109 #: data/resources/ui/dialogs/process_dialog.ui:87 #: data/resources/ui/dialogs/settings_dialog.ui:148 #: data/resources/ui/dialogs/settings_dialog.ui:235 msgid "Drive Read Total" msgstr "ড্রাইভ পড়া মোট" #: src/ui/pages/applications/mod.rs:1057 src/ui/pages/processes/mod.rs:1340 #: data/resources/ui/dialogs/app_dialog.ui:118 #: data/resources/ui/dialogs/process_dialog.ui:96 #: data/resources/ui/dialogs/settings_dialog.ui:153 #: data/resources/ui/dialogs/settings_dialog.ui:240 msgid "Drive Write" msgstr "ড্রাইভ লেখা" #: src/ui/pages/applications/mod.rs:1123 src/ui/pages/processes/mod.rs:1406 #: data/resources/ui/dialogs/app_dialog.ui:127 #: data/resources/ui/dialogs/process_dialog.ui:105 #: data/resources/ui/dialogs/settings_dialog.ui:158 #: data/resources/ui/dialogs/settings_dialog.ui:245 msgid "Drive Write Total" msgstr "ড্রাইভ লেখা মোট" #: src/ui/pages/applications/mod.rs:1242 src/ui/pages/processes/mod.rs:1529 #: data/resources/ui/dialogs/app_dialog.ui:158 #: data/resources/ui/dialogs/process_dialog.ui:136 #: data/resources/ui/dialogs/settings_dialog.ui:173 #: data/resources/ui/dialogs/settings_dialog.ui:260 msgid "Video Encoder" msgstr "ভিডিও এনকোডার" #: src/ui/pages/applications/mod.rs:1302 src/ui/pages/processes/mod.rs:1589 #: data/resources/ui/dialogs/app_dialog.ui:167 #: data/resources/ui/dialogs/process_dialog.ui:145 #: data/resources/ui/dialogs/settings_dialog.ui:178 #: data/resources/ui/dialogs/settings_dialog.ui:265 msgid "Video Decoder" msgstr "ভিডিও ডিকোডার" #: src/ui/pages/applications/mod.rs:1361 src/ui/pages/processes/mod.rs:1649 #: data/resources/ui/dialogs/app_dialog.ui:149 #: data/resources/ui/dialogs/process_dialog.ui:127 #: data/resources/ui/dialogs/settings_dialog.ui:168 #: data/resources/ui/dialogs/settings_dialog.ui:255 msgid "Video Memory" msgstr "ভিডিও মেমোরি" #: src/ui/pages/applications/mod.rs:1419 src/ui/pages/memory.rs:192 #: src/ui/pages/processes/mod.rs:1952 #: data/resources/ui/dialogs/app_dialog.ui:91 #: data/resources/ui/dialogs/process_dialog.ui:73 #: data/resources/ui/dialogs/settings_dialog.ui:183 #: data/resources/ui/dialogs/settings_dialog.ui:290 msgid "Swap" msgstr "সোয়াপ" #: src/ui/pages/applications/mod.rs:1477 src/ui/pages/processes/mod.rs:2009 msgid "End {}?" msgstr "শেষ {}?" #: src/ui/pages/applications/mod.rs:1478 src/ui/pages/processes/mod.rs:2010 msgid "Halt {}?" msgstr "বন্ধ {}?" #: src/ui/pages/applications/mod.rs:1479 src/ui/pages/processes/mod.rs:2011 msgid "Kill {}?" msgstr "মেরে ফেলুন {}?" #: src/ui/pages/applications/mod.rs:1480 src/ui/pages/processes/mod.rs:2012 msgid "Continue {}?" msgstr "চালিয়ে যান {}?" #: src/ui/pages/applications/mod.rs:1486 src/ui/pages/processes/mod.rs:2047 msgid "Unsaved work might be lost." msgstr "সংরক্ষণ না করা কাজ হারিয়ে যেতে পারে।" #: src/ui/pages/applications/mod.rs:1487 msgid "" "Halting an app can come with serious risks such as losing data and security " "implications. Use with caution." msgstr "" "একটি অ্যাপ বন্ধ করা গুরুতর ঝুঁকি নিয়ে আসতে পারে যেমন ডেটা হারানো এবং নিরাপত্তা প্রভাব। সতর্কতার সাথে ব্যবহার করুন।" #: src/ui/pages/applications/mod.rs:1488 msgid "" "Killing an app can come with serious risks such as losing data and security " "implications. Use with caution." msgstr "" "একটি অ্যাপ মেরে ফেলা গুরুতর ঝুঁকি নিয়ে আসতে পারে যেমন ডেটা হারানো এবং নিরাপত্তা প্রভাব। সতর্কতার সাথে ব্যবহার করুন।" #: src/ui/pages/applications/mod.rs:1495 #: data/resources/ui/pages/applications.ui:22 #: data/resources/ui/pages/applications.ui:127 msgid "End App" msgstr "অ্যাপ শেষ করুন" #: src/ui/pages/applications/mod.rs:1496 #: data/resources/ui/pages/applications.ui:10 #: data/resources/ui/pages/applications.ui:30 msgid "Halt App" msgstr "অ্যাপ বন্ধ করুন" #: src/ui/pages/applications/mod.rs:1497 #: data/resources/ui/pages/applications.ui:6 #: data/resources/ui/pages/applications.ui:26 msgid "Kill App" msgstr "অ্যাপ মেরে ফেলুন" #: src/ui/pages/applications/mod.rs:1498 #: data/resources/ui/pages/applications.ui:14 #: data/resources/ui/pages/applications.ui:34 msgid "Continue App" msgstr "অ্যাপ চালিয়ে যান" #: src/ui/pages/battery.rs:101 src/ui/pages/drive.rs:122 msgid "Drive" msgstr "ড্রাইভ" #: src/ui/pages/battery.rs:201 msgid "Battery Charge" msgstr "ব্যাটারি চার্জ" #: src/ui/pages/battery.rs:208 data/resources/ui/pages/gpu.ui:55 #: data/resources/ui/pages/npu.ui:49 msgid "Power Usage" msgstr "পাওয়ার ব্যবহার" #: src/ui/pages/battery.rs:265 src/ui/pages/drive.rs:323 #: src/ui/pages/drive.rs:354 src/ui/pages/network.rs:306 #: src/ui/pages/network.rs:340 msgid "Highest:" msgstr "সর্বোচ্চ:" #: src/ui/pages/cpu.rs:217 src/ui/pages/gpu.rs:198 src/ui/pages/npu.rs:189 msgid "Total Usage" msgstr "মোট ব্যবহার" #: src/ui/pages/drive.rs:224 msgid "Drive Activity" msgstr "ড্রাইভ কার্যকলাপ" #: src/ui/pages/drive.rs:231 msgid "Read Speed" msgstr "পড়ার গতি" #: src/ui/pages/drive.rs:235 msgid "Write Speed" msgstr "লেখার গতি" #: src/ui/pages/drive.rs:391 src/ui/pages/drive.rs:401 msgid "Yes" msgstr "হ্যাঁ" #. Translators: This is an abbreviation for "Read" and "Write". This is displayed in the sidebar so your #. translation should preferably be quite short or an abbreviation #: src/ui/pages/drive.rs:413 msgid "R: {} · W: {}" msgstr "প: {} · ল: {}" #: src/ui/pages/gpu.rs:206 msgid "Video Encoder/Decoder Usage" msgstr "ভিডিও এনকোডার/ডিকোডার ব্যবহার" #: src/ui/pages/gpu.rs:212 msgid "Video Encoder Usage" msgstr "ভিডিও এনকোডার ব্যবহার" #: src/ui/pages/gpu.rs:217 msgid "Video Decoder Usage" msgstr "ভিডিও ডিকোডার ব্যবহার" #: src/ui/pages/gpu.rs:222 msgid "Video Memory Usage" msgstr "ভিডিও মেমোরি ব্যবহার" #. Translators: This will be displayed in the sidebar, please try to keep your translation as short as (or even #. shorter than) 'Memory' #: src/ui/pages/gpu.rs:385 src/ui/pages/npu.rs:307 msgid "Memory: {}" msgstr "মেমোরি: {}" #: src/ui/pages/memory.rs:256 msgid "{} of {}" msgstr "{} এর {}" #: src/ui/pages/memory.rs:259 msgid "{} MT/s" msgstr "{} MT/s" #. Translators: This will be displayed in the sidebar, so your translation for "Swap" should #. preferably be quite short or an abbreviation #: src/ui/pages/memory.rs:336 msgid "{} / {} · Swap: {} %" msgstr "{} / {} · সোয়াপ: {} %" #: src/ui/pages/network.rs:114 src/utils/network.rs:128 msgid "Network Interface" msgstr "নেটওয়ার্ক ইন্টারফেস" #: src/ui/pages/network.rs:218 msgid "Receiving" msgstr "গ্রহণ করা" #: src/ui/pages/network.rs:222 msgid "Sending" msgstr "পাঠানো" #. Translators: This is an abbreviation for "Receive" and "Send". This is displayed in the sidebar so #. your translation should preferably be quite short or an abbreviation #: src/ui/pages/network.rs:363 msgid "R: {} · S: {}" msgstr "গ: {} · প: {}" #: src/ui/pages/npu.rs:105 src/ui/window.rs:343 msgid "NPU" msgstr "NPU" #: src/ui/pages/npu.rs:196 msgid "Memory Usage" msgstr "মেমোরি ব্যবহার" #: src/ui/pages/processes/mod.rs:178 data/resources/ui/window.ui:96 #: data/resources/ui/window.ui:103 #: data/resources/ui/dialogs/settings_dialog.ui:193 msgid "Processes" msgstr "প্রক্রিয়া" #: src/ui/pages/processes/mod.rs:523 src/ui/pages/processes/mod.rs:2056 #: data/resources/ui/pages/processes.ui:38 #: data/resources/ui/pages/processes.ui:186 msgid "End Process" msgstr "প্রক্রিয়া শেষ করুন" #: src/ui/pages/processes/mod.rs:527 data/resources/ui/pages/processes.ui:70 msgid "End Processes" msgstr "প্রক্রিয়া শেষ করুন" #: src/ui/pages/processes/mod.rs:821 msgid "Running Processes: {}" msgstr "চলমান প্রক্রিয়া: {}" #: src/ui/pages/processes/mod.rs:919 msgid "Process" msgstr "প্রক্রিয়া" #: src/ui/pages/processes/mod.rs:980 #: data/resources/ui/dialogs/process_dialog.ui:186 #: data/resources/ui/dialogs/settings_dialog.ui:210 msgid "Process ID" msgstr "প্রক্রিয়া আইডি" #: src/ui/pages/processes/mod.rs:1033 #: data/resources/ui/dialogs/process_dialog.ui:213 #: data/resources/ui/dialogs/settings_dialog.ui:215 msgid "User" msgstr "ব্যবহারকারী" #: src/ui/pages/processes/mod.rs:1708 #: data/resources/ui/dialogs/process_dialog.ui:154 #: data/resources/ui/dialogs/settings_dialog.ui:270 msgid "Total CPU Time" msgstr "মোট সিপিইউ সময়" #: src/ui/pages/processes/mod.rs:1767 #: data/resources/ui/dialogs/process_dialog.ui:163 #: data/resources/ui/dialogs/settings_dialog.ui:275 msgid "User CPU Time" msgstr "ব্যবহারকারী সিপিইউ সময়" #: src/ui/pages/processes/mod.rs:1826 #: data/resources/ui/dialogs/process_dialog.ui:172 #: data/resources/ui/dialogs/settings_dialog.ui:280 msgid "System CPU Time" msgstr "সিস্টেম সিপিইউ সময়" #: src/ui/pages/processes/mod.rs:1885 #: data/resources/ui/dialogs/process_options_dialog.ui:87 #: data/resources/ui/dialogs/settings_dialog.ui:285 msgid "Priority" msgstr "অগ্রাধিকার" #: src/ui/pages/processes/mod.rs:2019 msgid "End process?" msgid_plural "End {} processes?" msgstr[0] "প্রক্রিয়া শেষ করুন?" msgstr[1] "{} প্রক্রিয়া শেষ করুন?" #: src/ui/pages/processes/mod.rs:2025 msgid "Halt process?" msgid_plural "Halt {} processes?" msgstr[0] "প্রক্রিয়া বন্ধ করুন?" msgstr[1] "{} প্রক্রিয়া বন্ধ করুন?" #: src/ui/pages/processes/mod.rs:2031 src/ui/pages/processes/mod.rs:2037 msgid "Kill process?" msgid_plural "Kill {} processes?" msgstr[0] "প্রক্রিয়া মেরে ফেলুন?" msgstr[1] "{} প্রক্রিয়া মেরে ফেলুন?" #: src/ui/pages/processes/mod.rs:2048 msgid "" "Halting a process can come with serious risks such as losing data and " "security implications. Use with caution." msgstr "" "একটি প্রক্রিয়া বন্ধ করা গুরুতর ঝুঁকি নিয়ে আসতে পারে যেমন ডেটা হারানো এবং নিরাপত্তা প্রভাব। সতর্কতার সাথে ব্যবহার করুন।" #: src/ui/pages/processes/mod.rs:2049 msgid "" "Killing a process can come with serious risks such as losing data and " "security implications. Use with caution." msgstr "" "একটি প্রক্রিয়া মেরে ফেলা গুরুতর ঝুঁকি নিয়ে আসতে পারে যেমন ডেটা হারানো এবং নিরাপত্তা প্রভাব। সতর্কতার সাথে ব্যবহার করুন।" #: src/ui/pages/processes/mod.rs:2057 data/resources/ui/pages/processes.ui:10 #: data/resources/ui/pages/processes.ui:46 msgid "Halt Process" msgstr "প্রক্রিয়া বন্ধ করুন" #: src/ui/pages/processes/mod.rs:2058 data/resources/ui/pages/processes.ui:6 #: data/resources/ui/pages/processes.ui:42 msgid "Kill Process" msgstr "প্রক্রিয়া মেরে ফেলুন" #: src/ui/pages/processes/mod.rs:2059 data/resources/ui/pages/processes.ui:14 #: data/resources/ui/pages/processes.ui:50 msgid "Continue Process" msgstr "প্রক্রিয়া চালিয়ে যান" #: src/ui/window.rs:309 msgid "GPU {}" msgstr "জিপিইউ {}" #: src/ui/window.rs:341 msgid "NPU {}" msgstr "NPU {}" #: src/ui/window.rs:1039 msgid "Successfully adjusted {}" msgstr "সফলভাবে সমন্বয় করা হয়েছে {}" #: src/ui/window.rs:1040 msgid "There was a problem adjusting {}" msgstr "{} সমন্বয় করতে সমস্যা হয়েছে" #: src/ui/window.rs:1120 msgid "Successfully ended {}" msgstr "সফলভাবে শেষ হয়েছে {}" #: src/ui/window.rs:1121 msgid "Successfully halted {}" msgstr "সফলভাবে বন্ধ হয়েছে {}" #: src/ui/window.rs:1122 msgid "Successfully killed {}" msgstr "সফলভাবে মেরে ফেলা হয়েছে {}" #: src/ui/window.rs:1123 msgid "Successfully continued {}" msgstr "সফলভাবে চালিয়ে যাওয়া হয়েছে {}" #: src/ui/window.rs:1130 msgid "Successfully ended the process" msgid_plural "Successfully ended {} processes" msgstr[0] "প্রক্রিয়া সফলভাবে শেষ হয়েছে" msgstr[1] "{} প্রক্রিয়া সফলভাবে শেষ হয়েছে" #: src/ui/window.rs:1136 msgid "Successfully halted the process" msgid_plural "Successfully halted {} processes" msgstr[0] "প্রক্রিয়া সফলভাবে বন্ধ হয়েছে" msgstr[1] "{} প্রক্রিয়া সফলভাবে বন্ধ হয়েছে" #: src/ui/window.rs:1142 msgid "Successfully killed the process" msgid_plural "Successfully killed {} processes" msgstr[0] "প্রক্রিয়া সফলভাবে মেরে ফেলা হয়েছে" msgstr[1] "{} প্রক্রিয়া সফলভাবে মেরে ফেলা হয়েছে" #: src/ui/window.rs:1148 msgid "Successfully continued the process" msgid_plural "Successfully continued {} processes" msgstr[0] "প্রক্রিয়া সফলভাবে চালিয়ে যাওয়া হয়েছে" msgstr[1] "{} প্রক্রিয়া সফলভাবে চালিয়ে যাওয়া হয়েছে" #: src/ui/window.rs:1159 msgid "There was a problem ending a process" msgid_plural "There were problems ending {} processes" msgstr[0] "একটি প্রক্রিয়া শেষ করতে সমস্যা হয়েছে" msgstr[1] "{} প্রক্রিয়া শেষ করতে সমস্যা হয়েছে" #: src/ui/window.rs:1165 msgid "There was a problem halting a process" msgid_plural "There were problems halting {} processes" msgstr[0] "একটি প্রক্রিয়া বন্ধ করতে সমস্যা হয়েছে" msgstr[1] "{} প্রক্রিয়া বন্ধ করতে সমস্যা হয়েছে" #: src/ui/window.rs:1171 msgid "There was a problem killing a process" msgid_plural "There were problems killing {} processes" msgstr[0] "একটি প্রক্রিয়া মেরে ফেলতে সমস্যা হয়েছে" msgstr[1] "{} প্রক্রিয়া মেরে ফেলতে সমস্যা হয়েছে" #: src/ui/window.rs:1177 msgid "There was a problem continuing a process" msgid_plural "There were problems continuing {} processes" msgstr[0] "একটি প্রক্রিয়া চালিয়ে যেতে সমস্যা হয়েছে" msgstr[1] "{} প্রক্রিয়া চালিয়ে যেতে সমস্যা হয়েছে" #: src/ui/window.rs:1187 msgid "There was a problem ending {}" msgstr "{} শেষ করতে সমস্যা হয়েছে" #: src/ui/window.rs:1188 msgid "There was a problem halting {}" msgstr "{} বন্ধ করতে সমস্যা হয়েছে" #: src/ui/window.rs:1189 msgid "There was a problem killing {}" msgstr "{} মেরে ফেলতে সমস্যা হয়েছে" #: src/ui/window.rs:1190 msgid "There was a problem continuing {}" msgstr "{} চালিয়ে যেতে সমস্যা হয়েছে" #: src/utils/app.rs:223 msgid "System Processes" msgstr "সিস্টেম প্রক্রিয়া" #: src/utils/battery.rs:77 msgid "Charging" msgstr "চার্জ হচ্ছে" #: src/utils/battery.rs:78 msgid "Discharging" msgstr "ডিসচার্জ হচ্ছে" #: src/utils/battery.rs:79 msgid "Empty" msgstr "খালি" #: src/utils/battery.rs:80 msgid "Full" msgstr "পূর্ণ" #: src/utils/battery.rs:81 msgid "Unknown" msgstr "অজানা" #: src/utils/battery.rs:127 msgid "Nickel-Metal Hydride" msgstr "নিকেল-মেটাল হাইড্রাইড" #: src/utils/battery.rs:128 msgid "Nickel-Cadmium" msgstr "নিকেল-ক্যাডমিয়াম" #: src/utils/battery.rs:129 msgid "Nickel-Zinc" msgstr "নিকেল-জিঙ্ক" #: src/utils/battery.rs:130 msgid "Lead-Acid" msgstr "লেড-অ্যাসিড" #: src/utils/battery.rs:131 msgid "Lithium-Ion" msgstr "লিথিয়াম-আয়ন" #: src/utils/battery.rs:132 msgid "Lithium Iron Phosphate" msgstr "লিথিয়াম আয়রন ফসফেট" #: src/utils/battery.rs:133 msgid "Lithium Polymer" msgstr "লিথিয়াম পলিমার" #: src/utils/battery.rs:135 msgid "Rechargeable Alkaline Managanese" msgstr "রিচার্জেবল অ্যালকালাইন ম্যাঙ্গানিজ" #: src/utils/battery.rs:229 msgid "{} Battery" msgstr "{} ব্যাটারি" #: src/utils/battery.rs:231 msgid "Battery" msgstr "ব্যাটারি" #: src/utils/drive.rs:81 src/utils/drive.rs:152 msgid "CD/DVD/Blu-ray Drive" msgstr "সিডি/ডিভিডি/ব্লু-রে ড্রাইভ" #: src/utils/drive.rs:82 msgid "eMMC Storage" msgstr "eMMC স্টোরেজ" #: src/utils/drive.rs:83 msgid "Flash Storage" msgstr "ফ্ল্যাশ স্টোরেজ" #: src/utils/drive.rs:84 src/utils/drive.rs:153 msgid "Floppy Drive" msgstr "ফ্লপি ড্রাইভ" #: src/utils/drive.rs:85 msgid "Hard Disk Drive" msgstr "হার্ড ডিস্ক ড্রাইভ" #: src/utils/drive.rs:86 msgid "Loop Device" msgstr "লুপ ডিভাইস" #: src/utils/drive.rs:87 msgid "Mapped Device" msgstr "ম্যাপড ডিভাইস" #: src/utils/drive.rs:88 msgid "NVMe Drive" msgstr "NVMe ড্রাইভ" #: src/utils/drive.rs:90 msgid "Software Raid" msgstr "সফটওয়্যার রেইড" #: src/utils/drive.rs:91 msgid "RAM Disk" msgstr "র্যাম ডিস্ক" #: src/utils/drive.rs:92 msgid "Solid State Drive" msgstr "সলিড স্টেট ড্রাইভ" #: src/utils/drive.rs:93 msgid "ZFS Volume" msgstr "ZFS ভলিউম" #: src/utils/drive.rs:94 msgid "Compressed RAM Disk (zram)" msgstr "কম্প্রেসড র্যাম ডিস্ক (zram)" #: src/utils/drive.rs:154 msgid "{} Loop Device" msgstr "{} লুপ ডিভাইস" #: src/utils/drive.rs:155 msgid "{} Mapped Device" msgstr "{} ম্যাপড ডিভাইস" #: src/utils/drive.rs:156 msgid "{} RAID" msgstr "{} RAID" #: src/utils/drive.rs:157 msgid "{} RAM Disk" msgstr "{} র্যাম ডিস্ক" #: src/utils/drive.rs:158 msgid "{} zram Device" msgstr "{} zram ডিভাইস" #: src/utils/drive.rs:159 msgid "{} ZFS Volume" msgstr "{} ZFS ভলিউম" #: src/utils/drive.rs:160 msgid "{} Drive" msgstr "{} ড্রাইভ" #: src/utils/network.rs:116 msgid "Bluetooth Tether" msgstr "ব্লুটুথ টেদার" #: src/utils/network.rs:117 msgid "Network Bridge" msgstr "নেটওয়ার্ক ব্রিজ" #: src/utils/network.rs:118 msgid "Ethernet Connection" msgstr "ইথারনেট সংযোগ" #: src/utils/network.rs:119 msgid "Docker Bridge" msgstr "ডকার ব্রিজ" #: src/utils/network.rs:120 msgid "InfiniBand Connection" msgstr "ইনফিনিব্যান্ড সংযোগ" #: src/utils/network.rs:121 msgid "Serial Line IP Connection" msgstr "সিরিয়াল লাইন আইপি সংযোগ" #: src/utils/network.rs:122 msgid "Virtual Ethernet Device" msgstr "ভার্চুয়াল ইথারনেট ডিভাইস" #: src/utils/network.rs:123 msgid "VM Network Bridge" msgstr "ভিএম নেটওয়ার্ক ব্রিজ" #: src/utils/network.rs:124 msgid "VPN Tunnel" msgstr "ভিপিএন টানেল" #: src/utils/network.rs:125 msgid "VPN Tunnel (WireGuard)" msgstr "ভিপিএন টানেল (ওয়্যারগার্ড)" #: src/utils/network.rs:126 msgid "Wi-Fi Connection" msgstr "ওয়াই-ফাই সংযোগ" #: src/utils/network.rs:127 msgid "WWAN Connection" msgstr "WWAN সংযোগ" #: src/utils/units.rs:59 msgid "{} K" msgstr "{} K" #: src/utils/units.rs:61 msgid "{} °C" msgstr "{} °C" #: src/utils/units.rs:63 msgid "{} °F" msgstr "{} °F" #: src/utils/units.rs:81 src/utils/units.rs:95 src/utils/units.rs:115 #: src/utils/units.rs:129 msgid "{} B" msgstr "{} B" #: src/utils/units.rs:82 src/utils/units.rs:96 msgid "{} kB" msgstr "{} kB" #: src/utils/units.rs:83 src/utils/units.rs:97 msgid "{} MB" msgstr "{} MB" #: src/utils/units.rs:84 src/utils/units.rs:98 msgid "{} GB" msgstr "{} GB" #: src/utils/units.rs:85 src/utils/units.rs:99 msgid "{} TB" msgstr "{} TB" #: src/utils/units.rs:86 src/utils/units.rs:100 msgid "{} PB" msgstr "{} PB" #: src/utils/units.rs:87 src/utils/units.rs:101 msgid "{} EB" msgstr "{} EB" #: src/utils/units.rs:88 src/utils/units.rs:102 msgid "{} ZB" msgstr "{} ZB" #: src/utils/units.rs:89 src/utils/units.rs:103 msgid "{} YB" msgstr "{} YB" #: src/utils/units.rs:90 src/utils/units.rs:104 msgid "{} RB" msgstr "{} RB" #: src/utils/units.rs:91 src/utils/units.rs:105 msgid "{} QB" msgstr "{} QB" #: src/utils/units.rs:116 src/utils/units.rs:130 msgid "{} KiB" msgstr "{} KiB" #: src/utils/units.rs:117 src/utils/units.rs:131 msgid "{} MiB" msgstr "{} MiB" #: src/utils/units.rs:118 src/utils/units.rs:132 msgid "{} GiB" msgstr "{} GiB" #: src/utils/units.rs:119 src/utils/units.rs:133 msgid "{} TiB" msgstr "{} TiB" #: src/utils/units.rs:120 src/utils/units.rs:134 msgid "{} PiB" msgstr "{} PiB" #: src/utils/units.rs:121 src/utils/units.rs:135 msgid "{} EiB" msgstr "{} EiB" #: src/utils/units.rs:122 src/utils/units.rs:136 msgid "{} ZiB" msgstr "{} ZiB" #: src/utils/units.rs:123 src/utils/units.rs:137 msgid "{} YiB" msgstr "{} YiB" #: src/utils/units.rs:124 src/utils/units.rs:138 msgid "{} RiB" msgstr "{} RiB" #: src/utils/units.rs:125 src/utils/units.rs:139 msgid "{} QiB" msgstr "{} QiB" #: src/utils/units.rs:166 src/utils/units.rs:183 msgid "{} B/s" msgstr "{} B/s" #: src/utils/units.rs:167 msgid "{} kB/s" msgstr "{} kB/s" #: src/utils/units.rs:168 msgid "{} MB/s" msgstr "{} MB/s" #: src/utils/units.rs:169 msgid "{} GB/s" msgstr "{} GB/s" #: src/utils/units.rs:170 msgid "{} TB/s" msgstr "{} TB/s" #: src/utils/units.rs:171 msgid "{} PB/s" msgstr "{} PB/s" #: src/utils/units.rs:172 msgid "{} EB/s" msgstr "{} EB/s" #: src/utils/units.rs:173 msgid "{} ZB/s" msgstr "{} ZB/s" #: src/utils/units.rs:174 msgid "{} YB/s" msgstr "{} YB/s" #: src/utils/units.rs:175 msgid "{} RB/s" msgstr "{} RB/s" #: src/utils/units.rs:176 msgid "{} QB/s" msgstr "{} QB/s" #: src/utils/units.rs:184 msgid "{} KiB/s" msgstr "{} KiB/s" #: src/utils/units.rs:185 msgid "{} MiB/s" msgstr "{} MiB/s" #: src/utils/units.rs:186 msgid "{} GiB/s" msgstr "{} GiB/s" #: src/utils/units.rs:187 msgid "{} TiB/s" msgstr "{} TiB/s" #: src/utils/units.rs:188 msgid "{} PiB/s" msgstr "{} PiB/s" #: src/utils/units.rs:189 msgid "{} EiB/s" msgstr "{} EiB/s" #: src/utils/units.rs:190 msgid "{} ZiB/s" msgstr "{} ZiB/s" #: src/utils/units.rs:191 msgid "{} YiB/s" msgstr "{} YiB/s" #: src/utils/units.rs:192 msgid "{} RiB/s" msgstr "{} RiB/s" #: src/utils/units.rs:193 msgid "{} QiB/s" msgstr "{} QiB/s" #: src/utils/units.rs:200 src/utils/units.rs:217 msgid "{} b/s" msgstr "{} b/s" #: src/utils/units.rs:201 msgid "{} kb/s" msgstr "{} kb/s" #: src/utils/units.rs:202 msgid "{} Mb/s" msgstr "{} Mb/s" #: src/utils/units.rs:203 msgid "{} Gb/s" msgstr "{} Gb/s" #: src/utils/units.rs:204 msgid "{} Tb/s" msgstr "{} Tb/s" #: src/utils/units.rs:205 msgid "{} Pb/s" msgstr "{} Pb/s" #: src/utils/units.rs:206 msgid "{} Eb/s" msgstr "{} Eb/s" #: src/utils/units.rs:207 msgid "{} Zb/s" msgstr "{} Zb/s" #: src/utils/units.rs:208 msgid "{} Yb/s" msgstr "{} Yb/s" #: src/utils/units.rs:209 msgid "{} Rb/s" msgstr "{} Rb/s" #: src/utils/units.rs:210 msgid "{} Qb/s" msgstr "{} Qb/s" #: src/utils/units.rs:218 msgid "{} Kib/s" msgstr "{} Kib/s" #: src/utils/units.rs:219 msgid "{} Mib/s" msgstr "{} Mib/s" #: src/utils/units.rs:220 msgid "{} Gib/s" msgstr "{} Gib/s" #: src/utils/units.rs:221 msgid "{} Tib/s" msgstr "{} Tib/s" #: src/utils/units.rs:222 msgid "{} Pib/s" msgstr "{} Pib/s" #: src/utils/units.rs:223 msgid "{} Eib/s" msgstr "{} Eib/s" #: src/utils/units.rs:224 msgid "{} Zib/s" msgstr "{} Zib/s" #: src/utils/units.rs:225 msgid "{} Yib/s" msgstr "{} Yib/s" #: src/utils/units.rs:226 msgid "{} Rib/s" msgstr "{} Rib/s" #: src/utils/units.rs:227 msgid "{} Qib/s" msgstr "{} Qib/s" #: src/utils/units.rs:234 msgid "{} Hz" msgstr "{} Hz" #: src/utils/units.rs:235 msgid "{} kHz" msgstr "{} kHz" #: src/utils/units.rs:236 msgid "{} MHz" msgstr "{} MHz" #: src/utils/units.rs:237 msgid "{} GHz" msgstr "{} GHz" #: src/utils/units.rs:238 msgid "{} THz" msgstr "{} THz" #: src/utils/units.rs:239 msgid "{} PHz" msgstr "{} PHz" #: src/utils/units.rs:240 msgid "{} EHz" msgstr "{} EHz" #: src/utils/units.rs:241 msgid "{} ZHz" msgstr "{} ZHz" #: src/utils/units.rs:242 msgid "{} YHz" msgstr "{} YHz" #: src/utils/units.rs:243 msgid "{} RHz" msgstr "{} RHz" #: src/utils/units.rs:244 msgid "{} QHz" msgstr "{} QHz" #: src/utils/units.rs:251 msgid "{} W" msgstr "{} W" #: src/utils/units.rs:252 msgid "{} kW" msgstr "{} kW" #: src/utils/units.rs:253 msgid "{} MW" msgstr "{} MW" #: src/utils/units.rs:254 msgid "{} GW" msgstr "{} GW" #: src/utils/units.rs:255 msgid "{} TW" msgstr "{} TW" #: src/utils/units.rs:256 msgid "{} PW" msgstr "{} PW" #: src/utils/units.rs:257 msgid "{} EW" msgstr "{} EW" #: src/utils/units.rs:258 msgid "{} ZW" msgstr "{} ZW" #: src/utils/units.rs:259 msgid "{} YW" msgstr "{} YW" #: src/utils/units.rs:260 msgid "{} RW" msgstr "{} RW" #: src/utils/units.rs:261 msgid "{} QW" msgstr "{} QW" #: src/utils/units.rs:270 src/utils/units.rs:284 msgid "{} Wh" msgstr "{} Wh" #: src/utils/units.rs:271 src/utils/units.rs:285 msgid "{} kWh" msgstr "{} kWh" #: src/utils/units.rs:272 src/utils/units.rs:286 msgid "{} MWh" msgstr "{} MWh" #: src/utils/units.rs:273 src/utils/units.rs:287 msgid "{} GWh" msgstr "{} GWh" #: src/utils/units.rs:274 src/utils/units.rs:288 msgid "{} TWh" msgstr "{} TWh" #: src/utils/units.rs:275 src/utils/units.rs:289 msgid "{} PWh" msgstr "{} PWh" #: src/utils/units.rs:276 src/utils/units.rs:290 msgid "{} EWh" msgstr "{} EWh" #: src/utils/units.rs:277 src/utils/units.rs:291 msgid "{} ZWh" msgstr "{} ZWh" #: src/utils/units.rs:278 src/utils/units.rs:292 msgid "{} YWh" msgstr "{} YWh" #: src/utils/units.rs:279 src/utils/units.rs:293 msgid "{} RWh" msgstr "{} RWh" #: src/utils/units.rs:280 src/utils/units.rs:294 msgid "{} QWh" msgstr "{} QWh" #: data/resources/ui/shortcuts.ui:11 msgctxt "shortcut window" msgid "General" msgstr "সাধারণ" #: data/resources/ui/shortcuts.ui:14 msgctxt "shortcut window" msgid "Preferences" msgstr "পছন্দসমূহ" #: data/resources/ui/shortcuts.ui:20 msgctxt "shortcut window" msgid "Show Shortcuts" msgstr "শর্টকাট দেখান" #: data/resources/ui/shortcuts.ui:26 msgctxt "shortcut window" msgid "Quit" msgstr "প্রস্থান" #: data/resources/ui/shortcuts.ui:32 msgctxt "shortcut window" msgid "Toggle Search Field" msgstr "সার্চ ফিল্ড টগল করুন" #: data/resources/ui/shortcuts.ui:38 msgctxt "shortcut window" msgid "End App/Process" msgstr "অ্যাপ/প্রসেস শেষ করুন" #: data/resources/ui/shortcuts.ui:44 msgctxt "shortcut window" msgid "Kill App/Process" msgstr "অ্যাপ/প্রসেস বন্ধ করুন" #: data/resources/ui/shortcuts.ui:50 msgctxt "shortcut window" msgid "Halt App/Process" msgstr "অ্যাপ/প্রসেস থামান" #: data/resources/ui/shortcuts.ui:56 msgctxt "shortcut window" msgid "Continue App/Process" msgstr "অ্যাপ/প্রসেস চালিয়ে যান" #: data/resources/ui/shortcuts.ui:62 msgctxt "shortcut window" msgid "Show Information for App/Process" msgstr "অ্যাপ/প্রসেসের তথ্য দেখান" #: data/resources/ui/shortcuts.ui:68 msgctxt "shortcut window" msgid "Show Process Options" msgstr "প্রসেস অপশন দেখান" #: data/resources/ui/window.ui:6 msgid "Preferences" msgstr "পছন্দসমূহ" #: data/resources/ui/window.ui:10 msgid "Keyboard Shortcuts" msgstr "কীবোর্ড শর্টকাট" #: data/resources/ui/window.ui:14 msgid "About Resources" msgstr "সম্পর্কে সম্পদ" #: data/resources/ui/dialogs/app_dialog.ui:7 msgid "App Information" msgstr "অ্যাপ তথ্য" #: data/resources/ui/dialogs/app_dialog.ui:70 #: data/resources/ui/dialogs/process_dialog.ui:48 #: data/resources/ui/pages/battery.ui:22 data/resources/ui/pages/cpu.ui:37 #: data/resources/ui/pages/cpu.ui:50 data/resources/ui/pages/drive.ui:22 #: data/resources/ui/pages/gpu.ui:22 data/resources/ui/pages/memory.ui:31 #: data/resources/ui/pages/network.ui:22 data/resources/ui/pages/npu.ui:22 msgid "Usage" msgstr "ব্যবহার" #: data/resources/ui/dialogs/app_dialog.ui:174 #: data/resources/ui/dialogs/process_dialog.ui:179 #: data/resources/ui/pages/battery.ui:33 data/resources/ui/pages/cpu.ui:89 #: data/resources/ui/pages/drive.ui:54 data/resources/ui/pages/gpu.ui:80 #: data/resources/ui/pages/memory.ui:42 data/resources/ui/pages/network.ui:51 #: data/resources/ui/pages/npu.ui:74 msgid "Properties" msgstr "বৈশিষ্ট্য" #: data/resources/ui/dialogs/app_dialog.ui:180 msgid "ID" msgstr "আইডি" #: data/resources/ui/dialogs/app_dialog.ui:190 #: data/resources/ui/dialogs/process_dialog.ui:195 msgid "Running Since" msgstr "চলছে যেহেতু" #: data/resources/ui/dialogs/app_dialog.ui:198 msgid "Running Processes" msgstr "চলমান প্রসেসসমূহ" #: data/resources/ui/dialogs/app_dialog.ui:207 #: data/resources/ui/dialogs/process_dialog.ui:231 msgid "Containerized" msgstr "কন্টেইনারাইজড" #: data/resources/ui/dialogs/process_dialog.ui:7 msgid "Process Information" msgstr "প্রসেস তথ্য" #: data/resources/ui/dialogs/process_dialog.ui:204 msgid "Commandline" msgstr "কমান্ডলাইন" #: data/resources/ui/dialogs/process_dialog.ui:222 msgid "Control Group" msgstr "নিয়ন্ত্রণ গ্রুপ" #: data/resources/ui/dialogs/process_options_dialog.ui:7 #: data/resources/ui/dialogs/process_options_dialog.ui:69 msgid "Process Options" msgstr "প্রসেস অপশন" #: data/resources/ui/dialogs/process_options_dialog.ui:29 msgid "Apply" msgstr "প্রয়োগ করুন" #: data/resources/ui/dialogs/process_options_dialog.ui:72 msgid "Niceness" msgstr "নিসেনেস" #: data/resources/ui/dialogs/process_options_dialog.ui:73 msgid "" "The priority of a process is given by its niceness. A lower niceness value " "correspond to a higher priority." msgstr "" "একটি প্রসেসের অগ্রাধিকার তার নিসেনেস দ্বারা দেওয়া হয়। একটি কম নিসেনেস মান " "একটি উচ্চ অগ্রাধিকার নির্দেশ করে।" #: data/resources/ui/dialogs/process_options_dialog.ui:91 msgctxt "process priority" msgid "Very High" msgstr "খুব উচ্চ" #: data/resources/ui/dialogs/process_options_dialog.ui:92 msgctxt "process priority" msgid "High" msgstr "উচ্চ" #: data/resources/ui/dialogs/process_options_dialog.ui:93 msgctxt "process priority" msgid "Normal" msgstr "সাধারণ" #: data/resources/ui/dialogs/process_options_dialog.ui:94 msgctxt "process priority" msgid "Low" msgstr "নিম্ন" #: data/resources/ui/dialogs/process_options_dialog.ui:95 msgctxt "process priority" msgid "Very Low" msgstr "খুব নিম্ন" #: data/resources/ui/dialogs/process_options_dialog.ui:103 msgid "Processor Affinity" msgstr "প্রসেসর অ্যাফিনিটি" #: data/resources/ui/dialogs/process_options_dialog.ui:108 msgid "Toggle All" msgstr "সব টগল করুন" #: data/resources/ui/dialogs/process_options_dialog.ui:111 msgid "Select which processor cores the process is allowed to run on" msgstr "নির্বাচন করুন কোন প্রসেসর কোরগুলিতে প্রসেস চালানো অনুমোদিত" #: data/resources/ui/dialogs/settings_dialog.ui:7 msgid "General" msgstr "সাধারণ" #: data/resources/ui/dialogs/settings_dialog.ui:10 msgid "Units" msgstr "একক" #: data/resources/ui/dialogs/settings_dialog.ui:13 msgid "Data Unit Prefix" msgstr "ডেটা ইউনিট প্রিফিক্স" #: data/resources/ui/dialogs/settings_dialog.ui:17 msgid "Decimal" msgstr "দশমিক" #: data/resources/ui/dialogs/settings_dialog.ui:18 msgid "Binary" msgstr "বাইনারি" #: data/resources/ui/dialogs/settings_dialog.ui:26 msgid "Show Network Speeds in Bits per Second" msgstr "নেটওয়ার্ক গতি বিট প্রতি সেকেন্ডে দেখান" #: data/resources/ui/dialogs/settings_dialog.ui:31 msgid "Temperature Unit" msgstr "তাপমাত্রা একক" #: data/resources/ui/dialogs/settings_dialog.ui:35 msgid "Celsius" msgstr "সেলসিয়াস" #: data/resources/ui/dialogs/settings_dialog.ui:36 msgid "Kelvin" msgstr "কেলভিন" #: data/resources/ui/dialogs/settings_dialog.ui:37 msgid "Fahrenheit" msgstr "ফারেনহাইট" #: data/resources/ui/dialogs/settings_dialog.ui:47 msgid "User Interface" msgstr "ব্যবহারকারী ইন্টারফেস" #: data/resources/ui/dialogs/settings_dialog.ui:50 msgid "Refresh Speed" msgstr "রিফ্রেশ গতি" #: data/resources/ui/dialogs/settings_dialog.ui:51 msgid "Higher refresh speeds can lead to higher processor usage" msgstr "উচ্চ রিফ্রেশ গতি উচ্চ প্রসেসর ব্যবহারের দিকে নিয়ে যেতে পারে" #: data/resources/ui/dialogs/settings_dialog.ui:55 msgctxt "UI refresh speed" msgid "Very Slow" msgstr "খুব ধীর" #: data/resources/ui/dialogs/settings_dialog.ui:56 msgctxt "UI refresh speed" msgid "Slow" msgstr "ধীর" #: data/resources/ui/dialogs/settings_dialog.ui:57 msgctxt "UI refresh speed" msgid "Normal" msgstr "সাধারণ" #: data/resources/ui/dialogs/settings_dialog.ui:58 msgctxt "UI refresh speed" msgid "Fast" msgstr "দ্রুত" #: data/resources/ui/dialogs/settings_dialog.ui:59 msgctxt "UI refresh speed" msgid "Very Fast" msgstr "খুব দ্রুত" #: data/resources/ui/dialogs/settings_dialog.ui:67 msgid "Show Graph Grids" msgstr "গ্রাফ গ্রিড দেখান" #: data/resources/ui/dialogs/settings_dialog.ui:72 msgid "Graph Data Points" msgstr "গ্রাফ ডেটা পয়েন্ট" #: data/resources/ui/dialogs/settings_dialog.ui:86 msgid "Show Search Fields on Launch" msgstr "লঞ্চে সার্চ ফিল্ড দেখান" #: data/resources/ui/dialogs/settings_dialog.ui:91 msgid "Show Usage Details in Sidebar" msgstr "সাইডবারে ব্যবহারের বিবরণ দেখান" #: data/resources/ui/dialogs/settings_dialog.ui:92 msgid "If enabled, the usage along with other information will be displayed" msgstr "যদি সক্ষম করা হয়, ব্যবহার সহ অন্যান্য তথ্য প্রদর্শিত হবে" #: data/resources/ui/dialogs/settings_dialog.ui:97 msgid "Show Device Descriptions in Sidebar" msgstr "সাইডবারে ডিভাইস বিবরণ দেখান" #: data/resources/ui/dialogs/settings_dialog.ui:98 msgid "" "If enabled, a device identifier like its name or device type will be " "displayed" msgstr "" "যদি সক্ষম করা হয়, একটি ডিভাইস আইডেন্টিফায়ার যেমন এর নাম বা ডিভাইস টাইপ " "প্রদর্শিত হবে" #: data/resources/ui/dialogs/settings_dialog.ui:103 msgid "Sidebar Meter Type" msgstr "সাইডবার মিটার টাইপ" #: data/resources/ui/dialogs/settings_dialog.ui:107 msgid "Bar" msgstr "বার" #: data/resources/ui/dialogs/settings_dialog.ui:108 msgid "Graph" msgstr "গ্রাফ" #: data/resources/ui/dialogs/settings_dialog.ui:116 msgid "Normalize Processor Usage" msgstr "প্রসেসর ব্যবহার নরমালাইজ করুন" #: data/resources/ui/dialogs/settings_dialog.ui:117 msgid "" "If enabled, the total usage of all cores will be divided by the amount of " "cores" msgstr "" "যদি সক্ষম করা হয়, সমস্ত কোরের মোট ব্যবহার কোরের সংখ্যা দ্বারা বিভক্ত হবে" #: data/resources/ui/dialogs/settings_dialog.ui:130 #: data/resources/ui/dialogs/settings_dialog.ui:207 msgid "Information Columns" msgstr "তথ্য কলাম" #: data/resources/ui/dialogs/settings_dialog.ui:196 #: data/resources/ui/pages/cpu.ui:22 data/resources/ui/pages/processes.ui:56 msgid "Options" msgstr "অপশন" #: data/resources/ui/dialogs/settings_dialog.ui:199 msgid "Show Niceness Values" msgstr "নিসেনেস মান দেখান" #: data/resources/ui/dialogs/settings_dialog.ui:200 msgid "" "Display priorities as niceness to allow for more fine-grained adjustments" msgstr "" "অগ্রাধিকারগুলি নিসেনেস হিসাবে প্রদর্শন করুন যাতে আরও সূক্ষ্ম সমন্বয় করা যায়" #: data/resources/ui/dialogs/settings_dialog.ui:300 msgid "Devices" msgstr "ডিভাইস" #: data/resources/ui/dialogs/settings_dialog.ui:303 msgid "Drives" msgstr "ড্রাইভ" #: data/resources/ui/dialogs/settings_dialog.ui:306 msgid "Show Virtual Drives" msgstr "ভার্চুয়াল ড্রাইভ দেখান" #: data/resources/ui/dialogs/settings_dialog.ui:307 msgid "Virtual drives are for example ZFS volumes or mapped devices" msgstr "ভার্চুয়াল ড্রাইভগুলি উদাহরণস্বরূপ ZFS ভলিউম বা ম্যাপড ডিভাইস" #: data/resources/ui/dialogs/settings_dialog.ui:317 msgid "Show Virtual Network Interfaces" msgstr "ভার্চুয়াল নেটওয়ার্ক ইন্টারফেস দেখান" #: data/resources/ui/dialogs/settings_dialog.ui:318 msgid "Virtual network interfaces are for example bridges or VPN tunnels" msgstr "ভার্চুয়াল নেটওয়ার্ক ইন্টারফেসগুলি উদাহরণস্বরূপ ব্রিজ বা VPN টানেল" #: data/resources/ui/pages/applications.ui:40 #: data/resources/ui/pages/processes.ui:62 msgid "Information" msgstr "তথ্য" #: data/resources/ui/pages/applications.ui:80 msgid "Search applications" msgstr "অ্যাপ্লিকেশন অনুসন্ধান করুন" #: data/resources/ui/pages/applications.ui:98 #: data/resources/ui/pages/processes.ui:144 msgid "Search" msgstr "অনুসন্ধান" #: data/resources/ui/pages/applications.ui:100 #: data/resources/ui/pages/processes.ui:146 msgid "Toggle search field" msgstr "সার্চ ফিল্ড টগল করুন" #: data/resources/ui/pages/applications.ui:116 #: data/resources/ui/pages/applications.ui:118 msgid "Show App Information" msgstr "অ্যাপ তথ্য দেখান" #: data/resources/ui/pages/battery.ui:36 msgid "Battery Health" msgstr "ব্যাটারি স্বাস্থ্য" #: data/resources/ui/pages/battery.ui:45 msgid "Design Capacity" msgstr "ডিজাইন ক্যাপাসিটি" #: data/resources/ui/pages/battery.ui:54 msgid "Charge Cycles" msgstr "চার্জ সাইকেল" #: data/resources/ui/pages/battery.ui:63 msgid "Technology" msgstr "প্রযুক্তি" #: data/resources/ui/pages/battery.ui:72 data/resources/ui/pages/gpu.ui:87 #: data/resources/ui/pages/network.ui:58 data/resources/ui/pages/npu.ui:81 msgid "Manufacturer" msgstr "প্রস্তুতকারক" #: data/resources/ui/pages/battery.ui:81 msgid "Model Name" msgstr "মডেল নাম" #: data/resources/ui/pages/battery.ui:90 data/resources/ui/pages/drive.ui:66 msgid "Device" msgstr "ডিভাইস" #: data/resources/ui/pages/cpu.ui:26 msgid "Show Usages of Logical CPUs" msgstr "লজিক্যাল সিপিইউগুলির ব্যবহার দেখান" #: data/resources/ui/pages/cpu.ui:75 data/resources/ui/pages/gpu.ui:66 #: data/resources/ui/pages/npu.ui:60 msgid "Sensors" msgstr "সেন্সর" #: data/resources/ui/pages/cpu.ui:82 data/resources/ui/pages/gpu.ui:69 #: data/resources/ui/pages/npu.ui:63 msgid "Temperature" msgstr "তাপমাত্রা" #: data/resources/ui/pages/cpu.ui:96 msgid "Max Frequency" msgstr "সর্বোচ্চ ফ্রিকোয়েন্সি" #: data/resources/ui/pages/cpu.ui:105 msgid "Logical Cores" msgstr "লজিক্যাল কোর" #: data/resources/ui/pages/cpu.ui:114 msgid "Physical Cores" msgstr "ফিজিক্যাল কোর" #: data/resources/ui/pages/cpu.ui:123 msgid "Sockets" msgstr "সকেট" #: data/resources/ui/pages/cpu.ui:132 msgid "Virtualization" msgstr "ভার্চুয়ালাইজেশন" #: data/resources/ui/pages/cpu.ui:141 msgid "Architecture" msgstr "আর্কিটেকচার" #: data/resources/ui/pages/drive.ui:38 msgid "Total Read" msgstr "মোট পড়া" #: data/resources/ui/pages/drive.ui:47 msgid "Total Written" msgstr "মোট লেখা" #: data/resources/ui/pages/drive.ui:57 data/resources/ui/pages/memory.ui:72 msgid "Type" msgstr "ধরন" #: data/resources/ui/pages/drive.ui:75 msgid "Capacity" msgstr "ক্ষমতা" #: data/resources/ui/pages/drive.ui:84 msgid "Writable" msgstr "লেখনযোগ্য" #: data/resources/ui/pages/drive.ui:93 msgid "Removable" msgstr "অপসারণযোগ্য" #: data/resources/ui/pages/gpu.ui:37 msgid "GPU Frequency" msgstr "জিপিইউ ফ্রিকোয়েন্সি" #: data/resources/ui/pages/gpu.ui:50 msgid "Video Memory Frequency" msgstr "ভিডিও মেমরি ফ্রিকোয়েন্সি" #: data/resources/ui/pages/gpu.ui:96 data/resources/ui/pages/npu.ui:90 msgid "PCI Slot" msgstr "পিসিআই স্লট" #: data/resources/ui/pages/gpu.ui:105 data/resources/ui/pages/network.ui:67 #: data/resources/ui/pages/npu.ui:99 msgid "Driver Used" msgstr "ব্যবহৃত ড্রাইভার" #: data/resources/ui/pages/gpu.ui:114 data/resources/ui/pages/npu.ui:108 msgid "Max Power Cap" msgstr "সর্বোচ্চ শক্তি ক্যাপ" #: data/resources/ui/pages/memory.ui:9 msgid "You need to authenticate to see memory properties" msgstr "মেমরি বৈশিষ্ট্য দেখতে আপনাকে প্রমাণীকরণ করতে হবে" #: data/resources/ui/pages/memory.ui:10 msgid "Authenticate" msgstr "প্রমাণীকরণ" #: data/resources/ui/pages/memory.ui:45 msgid "Slots Used" msgstr "ব্যবহৃত স্লট" #: data/resources/ui/pages/memory.ui:54 msgid "Speed" msgstr "গতি" #: data/resources/ui/pages/memory.ui:63 msgid "Form Factor" msgstr "ফর্ম ফ্যাক্টর" #: data/resources/ui/pages/memory.ui:81 msgid "Type Detail" msgstr "ধরনের বিস্তারিত" #: data/resources/ui/pages/network.ui:35 msgid "Total Received" msgstr "মোট গৃহীত" #: data/resources/ui/pages/network.ui:44 msgid "Total Sent" msgstr "মোট পাঠানো" #: data/resources/ui/pages/network.ui:76 msgid "Interface" msgstr "ইন্টারফেস" #: data/resources/ui/pages/network.ui:85 msgid "Hardware Address" msgstr "হার্ডওয়্যার ঠিকানা" #: data/resources/ui/pages/npu.ui:31 msgid "NPU Frequency" msgstr "এনপিইউ ফ্রিকোয়েন্সি" #: data/resources/ui/pages/npu.ui:44 msgid "Memory Frequency" msgstr "মেমরি ফ্রিকোয়েন্সি" #: data/resources/ui/pages/processes.ui:22 #: data/resources/ui/pages/processes.ui:74 msgid "Kill Processes" msgstr "প্রক্রিয়া মেরে ফেলুন" #: data/resources/ui/pages/processes.ui:26 #: data/resources/ui/pages/processes.ui:78 msgid "Halt Processes" msgstr "প্রক্রিয়া থামান" #: data/resources/ui/pages/processes.ui:30 #: data/resources/ui/pages/processes.ui:82 msgid "Continue Processes" msgstr "প্রক্রিয়া চালিয়ে যান" #: data/resources/ui/pages/processes.ui:126 msgid "Search processes" msgstr "প্রক্রিয়া খুঁজুন" #: data/resources/ui/pages/processes.ui:162 #: data/resources/ui/pages/processes.ui:164 msgid "Show Process Options" msgstr "প্রক্রিয়া বিকল্প দেখান" #: data/resources/ui/pages/processes.ui:175 #: data/resources/ui/pages/processes.ui:177 msgid "Show Process Information" msgstr "প্রক্রিয়া তথ্য দেখান" resources-1.9.1/po/cs.po000066400000000000000000001447151510634446000151360ustar00rootroot00000000000000# # <>, 2024. # msgid "" msgstr "" "Project-Id-Version: resources\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-03-05 18:24+0100\n" "PO-Revision-Date: 2025-04-25 12:12+0200\n" "Last-Translator: lorduskordus \n" "Language-Team: \n" "Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" "X-Generator: Poedit 3.4.4\n" #: data/net.nokyan.Resources.desktop.in.in:3 #: data/net.nokyan.Resources.metainfo.xml.in.in:4 src/application.rs:265 #: data/resources/ui/window.ui:22 msgid "Resources" msgstr "Zdroje" #. Translators: The summary should be 35 characters or less according to Flathub appstream guidelines #: data/net.nokyan.Resources.desktop.in.in:4 #: data/net.nokyan.Resources.metainfo.xml.in.in:5 msgid "Keep an eye on system resources" msgstr "Udržujte kontrolu nad systémovými zdroji" #: data/net.nokyan.Resources.desktop.in.in:10 msgid "" "System;Resources;Monitor;Processes;Usage;Task;Manager;CPU;RAM;Memory;GPU;" msgstr "" "System;Systém;Resources;Zdroje;Sledovat;Monitorovat;Procesy;Využití;Úloha;" "Manažer;CPU;RAM;Paměť;GPU;" #: data/net.nokyan.Resources.metainfo.xml.in.in:17 msgid "" "Resources allows you to check the utilization of your system resources and " "control your running processes and apps. It’s designed to be user-friendly " "and feel right at home on a modern desktop by using GNOME’s libadwaita." msgstr "" "Aplikace Zdroje umožňuje sledovat využití vašich systémových zdrojů a " "ovládat běžící procesy a aplikace. Je navržena tak, aby byla uživatelsky " "přívětivá a zapadala do prostředí moderního desktopu, s využitím libadwaita " "od GNOME." #: data/net.nokyan.Resources.metainfo.xml.in.in:20 msgid "Resources supports monitoring the following components:" msgstr "Aplikace Zdroje podporuje sledování následujících komponent:" #: data/net.nokyan.Resources.metainfo.xml.in.in:24 msgid "CPU" msgstr "CPU" #: data/net.nokyan.Resources.metainfo.xml.in.in:25 #: src/ui/pages/applications/mod.rs:802 src/ui/pages/memory.rs:106 #: src/ui/pages/memory.rs:191 src/ui/pages/processes/mod.rs:1078 #: data/resources/ui/window.ui:176 data/resources/ui/window.ui:183 #: data/resources/ui/dialogs/app_dialog.ui:82 #: data/resources/ui/dialogs/process_dialog.ui:64 #: data/resources/ui/dialogs/settings_dialog.ui:128 #: data/resources/ui/dialogs/settings_dialog.ui:220 msgid "Memory" msgstr "Paměť" #: data/net.nokyan.Resources.metainfo.xml.in.in:26 #: src/ui/pages/applications/mod.rs:1175 src/ui/pages/gpu.rs:118 #: src/ui/pages/processes/mod.rs:1462 src/ui/window.rs:454 #: data/resources/ui/dialogs/app_dialog.ui:140 #: data/resources/ui/dialogs/process_dialog.ui:118 #: data/resources/ui/dialogs/settings_dialog.ui:158 #: data/resources/ui/dialogs/settings_dialog.ui:250 msgid "GPU" msgstr "GPU" #: data/net.nokyan.Resources.metainfo.xml.in.in:27 #: data/resources/ui/dialogs/settings_dialog.ui:319 msgid "Network Interfaces" msgstr "Síťová rozhraní" #: data/net.nokyan.Resources.metainfo.xml.in.in:28 msgid "Storage Devices" msgstr "Úložiště" #: data/net.nokyan.Resources.metainfo.xml.in.in:29 msgid "Batteries" msgstr "Baterie" #: data/net.nokyan.Resources.metainfo.xml.in.in:51 msgid "Apps page in light theme" msgstr "Stránka Aplikace ve světlém režimu" #: data/net.nokyan.Resources.metainfo.xml.in.in:55 msgid "Processes page in dark theme" msgstr "Stránka Procesy v tmavém režimu" #: data/net.nokyan.Resources.metainfo.xml.in.in:59 msgid "Processor page in light theme" msgstr "Stránka Procesor ve světlém režimu" #: data/net.nokyan.Resources.metainfo.xml.in.in:63 msgid "Memory page in dark theme" msgstr "Stránka Paměť v tmavém režimu" #: data/net.nokyan.Resources.metainfo.xml.in.in:67 msgid "GPU page in light theme" msgstr "Stránka GPU ve světlém režimu" #: data/net.nokyan.Resources.metainfo.xml.in.in:71 msgid "Drive page in dark theme" msgstr "Stránka Úložiště v tmavém režimu" #: data/net.nokyan.Resources.metainfo.xml.in.in:75 msgid "Network Interface page in light theme" msgstr "Stránka Síťové rozhraní ve světlém režimu" #: data/net.nokyan.Resources.metainfo.xml.in.in:79 msgid "Battery page in dark theme" msgstr "Stránka Baterie v tmavém režimu" #: src/application.rs:267 msgid "The Nalux Team" msgstr "Tým Nalux" #: src/application.rs:275 msgid "Report Issues" msgstr "Oznámit chyby" #. Translator credits. Replace "translator-credits" with your name/username, and optionally an email or URL. #. One name per line, please do not remove previous names. #: src/application.rs:281 msgid "translator-credits" msgstr "" "lorduskordus \n" "Jonáš Loskot " #: src/application.rs:282 msgid "Icon by" msgstr "Ikonu vytvořil" #: src/ui/dialogs/app_dialog.rs:153 src/ui/dialogs/process_dialog.rs:131 #: src/ui/dialogs/process_dialog.rs:135 src/ui/dialogs/process_dialog.rs:144 #: src/ui/dialogs/process_dialog.rs:146 src/ui/dialogs/process_dialog.rs:169 #: src/ui/dialogs/process_dialog.rs:176 src/ui/dialogs/process_dialog.rs:183 #: src/ui/dialogs/process_dialog.rs:190 src/ui/pages/applications/mod.rs:945 #: src/ui/pages/applications/mod.rs:1069 src/ui/pages/battery.rs:204 #: src/ui/pages/battery.rs:224 src/ui/pages/battery.rs:230 #: src/ui/pages/battery.rs:233 src/ui/pages/battery.rs:264 #: src/ui/pages/battery.rs:288 src/ui/pages/battery.rs:290 #: src/ui/pages/battery.rs:300 src/ui/pages/cpu.rs:237 src/ui/pages/cpu.rs:252 #: src/ui/pages/cpu.rs:271 src/ui/pages/cpu.rs:277 src/ui/pages/cpu.rs:283 #: src/ui/pages/cpu.rs:289 src/ui/pages/cpu.rs:293 src/ui/pages/cpu.rs:296 #: src/ui/pages/cpu.rs:420 src/ui/pages/drive.rs:315 src/ui/pages/drive.rs:346 #: src/ui/pages/drive.rs:348 src/ui/pages/drive.rs:377 #: src/ui/pages/drive.rs:379 src/ui/pages/drive.rs:395 #: src/ui/pages/drive.rs:396 src/ui/pages/drive.rs:403 #: src/ui/pages/drive.rs:413 src/ui/pages/drive.rs:423 #: src/ui/pages/drive.rs:429 src/ui/pages/gpu.rs:243 src/ui/pages/gpu.rs:250 #: src/ui/pages/gpu.rs:295 src/ui/pages/gpu.rs:320 src/ui/pages/gpu.rs:323 #: src/ui/pages/gpu.rs:334 src/ui/pages/gpu.rs:354 src/ui/pages/gpu.rs:366 #: src/ui/pages/gpu.rs:377 src/ui/pages/gpu.rs:389 src/ui/pages/gpu.rs:396 #: src/ui/pages/gpu.rs:400 src/ui/pages/gpu.rs:430 src/ui/pages/gpu.rs:436 #: src/ui/pages/memory.rs:226 src/ui/pages/memory.rs:227 #: src/ui/pages/memory.rs:231 src/ui/pages/memory.rs:232 #: src/ui/pages/memory.rs:236 src/ui/pages/memory.rs:237 #: src/ui/pages/memory.rs:265 src/ui/pages/memory.rs:326 #: src/ui/pages/network.rs:240 src/ui/pages/network.rs:247 #: src/ui/pages/network.rs:254 src/ui/pages/network.rs:260 #: src/ui/pages/network.rs:263 src/ui/pages/network.rs:270 #: src/ui/pages/network.rs:335 src/ui/pages/network.rs:338 #: src/ui/pages/network.rs:340 src/ui/pages/network.rs:369 #: src/ui/pages/network.rs:372 src/ui/pages/network.rs:374 #: src/ui/pages/npu.rs:217 src/ui/pages/npu.rs:253 src/ui/pages/npu.rs:308 #: src/ui/pages/npu.rs:317 src/ui/pages/npu.rs:329 src/ui/pages/npu.rs:336 #: src/ui/pages/npu.rs:340 src/ui/pages/npu.rs:361 src/ui/pages/npu.rs:367 #: src/ui/pages/processes/mod.rs:1220 src/ui/pages/processes/mod.rs:1286 #: src/ui/pages/processes/mod.rs:1352 src/ui/pages/processes/mod.rs:1418 #: src/ui/pages/processes/mod.rs:1900 src/ui/pages/processes/mod.rs:1902 #: src/utils/battery.rs:149 src/utils/drive.rs:136 src/utils/gpu/mod.rs:284 #: src/utils/gpu/mod.rs:296 src/utils/link.rs:314 src/utils/npu/mod.rs:260 #: src/utils/npu/mod.rs:266 msgid "N/A" msgstr "N/A" #: src/ui/dialogs/process_options_dialog.rs:145 src/ui/pages/cpu.rs:251 #: src/ui/pages/cpu.rs:389 src/ui/pages/cpu.rs:393 msgid "CPU {}" msgstr "CPU {}" #: src/ui/pages/applications/application_entry.rs:190 src/ui/pages/drive.rs:410 #: src/ui/pages/drive.rs:420 src/ui/pages/processes/process_entry.rs:211 msgid "No" msgstr "Ne" #: src/ui/pages/applications/application_entry.rs:191 #: src/ui/pages/processes/process_entry.rs:212 msgid "Yes (Flatpak)" msgstr "Ano (Flatpak)" #: src/ui/pages/applications/application_entry.rs:192 #: src/ui/pages/processes/process_entry.rs:213 msgid "Yes (Snap)" msgstr "Ano (Snap)" #: src/ui/pages/applications/mod.rs:131 data/resources/ui/window.ui:65 #: data/resources/ui/window.ui:72 #: data/resources/ui/dialogs/settings_dialog.ui:122 msgid "Apps" msgstr "Aplikace" #. -1 because we don't want to count System Processes #: src/ui/pages/applications/mod.rs:659 msgid "Running Apps: {}" msgstr "Běžící aplikace: {}" #: src/ui/pages/applications/mod.rs:699 src/ui/pages/processes/mod.rs:861 msgid "Cancel" msgstr "Zrušit" #: src/ui/pages/applications/mod.rs:745 msgid "App" msgstr "Aplikace" #: src/ui/pages/applications/mod.rs:861 src/ui/pages/cpu.rs:123 #: src/ui/pages/processes/mod.rs:1136 src/ui/window.rs:289 #: data/resources/ui/window.ui:145 data/resources/ui/window.ui:152 #: data/resources/ui/dialogs/app_dialog.ui:73 #: data/resources/ui/dialogs/process_dialog.ui:55 #: data/resources/ui/dialogs/settings_dialog.ui:133 #: data/resources/ui/dialogs/settings_dialog.ui:225 msgid "Processor" msgstr "Procesor" #: src/ui/pages/applications/mod.rs:924 src/ui/pages/processes/mod.rs:1199 #: data/resources/ui/dialogs/app_dialog.ui:100 #: data/resources/ui/dialogs/process_dialog.ui:78 #: data/resources/ui/dialogs/settings_dialog.ui:138 #: data/resources/ui/dialogs/settings_dialog.ui:230 msgid "Drive Read" msgstr "Diskové čtení" #: src/ui/pages/applications/mod.rs:988 src/ui/pages/processes/mod.rs:1265 #: data/resources/ui/dialogs/app_dialog.ui:109 #: data/resources/ui/dialogs/process_dialog.ui:87 #: data/resources/ui/dialogs/settings_dialog.ui:143 #: data/resources/ui/dialogs/settings_dialog.ui:235 msgid "Drive Read Total" msgstr "Diskové čtení celkem" #: src/ui/pages/applications/mod.rs:1048 src/ui/pages/processes/mod.rs:1331 #: data/resources/ui/dialogs/app_dialog.ui:118 #: data/resources/ui/dialogs/process_dialog.ui:96 #: data/resources/ui/dialogs/settings_dialog.ui:148 #: data/resources/ui/dialogs/settings_dialog.ui:240 msgid "Drive Write" msgstr "Diskový zápis" #: src/ui/pages/applications/mod.rs:1114 src/ui/pages/processes/mod.rs:1397 #: data/resources/ui/dialogs/app_dialog.ui:127 #: data/resources/ui/dialogs/process_dialog.ui:105 #: data/resources/ui/dialogs/settings_dialog.ui:153 #: data/resources/ui/dialogs/settings_dialog.ui:245 msgid "Drive Write Total" msgstr "Diskový zápis celkem" #: src/ui/pages/applications/mod.rs:1233 src/ui/pages/processes/mod.rs:1520 #: data/resources/ui/dialogs/app_dialog.ui:158 #: data/resources/ui/dialogs/process_dialog.ui:136 #: data/resources/ui/dialogs/settings_dialog.ui:168 #: data/resources/ui/dialogs/settings_dialog.ui:260 msgid "Video Encoder" msgstr "Video enkodér" #: src/ui/pages/applications/mod.rs:1293 src/ui/pages/processes/mod.rs:1580 #: data/resources/ui/dialogs/app_dialog.ui:167 #: data/resources/ui/dialogs/process_dialog.ui:145 #: data/resources/ui/dialogs/settings_dialog.ui:173 #: data/resources/ui/dialogs/settings_dialog.ui:265 msgid "Video Decoder" msgstr "Video dekodér" #: src/ui/pages/applications/mod.rs:1352 src/ui/pages/processes/mod.rs:1640 #: data/resources/ui/dialogs/app_dialog.ui:149 #: data/resources/ui/dialogs/process_dialog.ui:127 #: data/resources/ui/dialogs/settings_dialog.ui:163 #: data/resources/ui/dialogs/settings_dialog.ui:255 msgid "Video Memory" msgstr "Videopaměť" #: src/ui/pages/applications/mod.rs:1410 src/ui/pages/memory.rs:197 #: src/ui/pages/processes/mod.rs:1943 #: data/resources/ui/dialogs/app_dialog.ui:91 #: data/resources/ui/dialogs/process_dialog.ui:73 #: data/resources/ui/dialogs/settings_dialog.ui:178 #: data/resources/ui/dialogs/settings_dialog.ui:290 msgid "Swap" msgstr "Swap" #: src/ui/pages/applications/mod.rs:1469 src/ui/pages/processes/mod.rs:2001 #: data/resources/ui/dialogs/settings_dialog.ui:183 #: data/resources/ui/dialogs/settings_dialog.ui:295 msgid "Combined Memory" msgstr "Kombinovaná paměť" #: src/ui/pages/applications/mod.rs:1528 src/ui/pages/processes/mod.rs:2060 msgid "End {}?" msgstr "Ukončit {}?" #: src/ui/pages/applications/mod.rs:1529 src/ui/pages/processes/mod.rs:2061 msgid "Halt {}?" msgstr "Zastavit {}?" #: src/ui/pages/applications/mod.rs:1530 src/ui/pages/processes/mod.rs:2062 msgid "Kill {}?" msgstr "Vynuceně ukončit {}?" #: src/ui/pages/applications/mod.rs:1531 src/ui/pages/processes/mod.rs:2063 msgid "Continue {}?" msgstr "Obnovit {}?" #: src/ui/pages/applications/mod.rs:1537 src/ui/pages/processes/mod.rs:2098 msgid "Unsaved work might be lost." msgstr "Neuložená práce může být ztracena." #: src/ui/pages/applications/mod.rs:1539 msgid "" "Halting an app can come with serious risks such as losing data and security " "implications. Use with caution." msgstr "" "Zastavení aplikace může mít za následek vážná rizika, jako je ztráta dat a " "ovlivnění bezpečnosti. Používejte s opatrností." #: src/ui/pages/applications/mod.rs:1542 msgid "" "Killing an app can come with serious risks such as losing data and security " "implications. Use with caution." msgstr "" "Vynucené ukončen aplikace může mít za následek vážná rizika, jako je ztráta " "dat a ovlivnění bezpečnosti. Používejte s opatrností." #: src/ui/pages/applications/mod.rs:1550 #: data/resources/ui/pages/applications.ui:22 #: data/resources/ui/pages/applications.ui:98 msgid "End App" msgstr "Ukončit aplikaci" #: src/ui/pages/applications/mod.rs:1551 #: data/resources/ui/pages/applications.ui:10 #: data/resources/ui/pages/applications.ui:30 msgid "Halt App" msgstr "Zastavit aplikaci" #: src/ui/pages/applications/mod.rs:1552 #: data/resources/ui/pages/applications.ui:6 #: data/resources/ui/pages/applications.ui:26 msgid "Kill App" msgstr "Vynuceně ukončit aplikaci" #: src/ui/pages/applications/mod.rs:1553 #: data/resources/ui/pages/applications.ui:14 #: data/resources/ui/pages/applications.ui:34 msgid "Continue App" msgstr "Obnovit aplikaci" #: src/ui/pages/battery.rs:102 src/ui/pages/drive.rs:126 msgid "Drive" msgstr "Disk" #: src/ui/pages/battery.rs:209 msgid "Battery Charge" msgstr "Nabití baterie" #: src/ui/pages/battery.rs:216 data/resources/ui/pages/gpu.ui:55 #: data/resources/ui/pages/npu.ui:49 msgid "Power Usage" msgstr "Spotřeba energie" #: src/ui/pages/battery.rs:278 src/ui/pages/cpu.rs:410 #: src/ui/pages/drive.rs:340 src/ui/pages/drive.rs:371 src/ui/pages/gpu.rs:422 #: src/ui/pages/network.rs:327 src/ui/pages/network.rs:361 #: src/ui/pages/npu.rs:304 src/ui/pages/npu.rs:353 msgid "Highest:" msgstr "Nejvyšší:" #: src/ui/pages/cpu.rs:236 src/ui/pages/gpu.rs:210 src/ui/pages/npu.rs:201 msgid "Total Usage" msgstr "Celkové využití" #: src/ui/pages/cpu.rs:264 src/ui/pages/gpu.rs:237 src/ui/pages/npu.rs:211 msgid "Temperature" msgstr "Teplota" #: src/ui/pages/drive.rs:235 msgid "Drive Activity" msgstr "Aktivita disku" #: src/ui/pages/drive.rs:242 msgid "Read Speed" msgstr "Rychlost čtení" #: src/ui/pages/drive.rs:246 msgid "Write Speed" msgstr "Rychlost zápisu" #: src/ui/pages/drive.rs:408 src/ui/pages/drive.rs:418 msgid "Yes" msgstr "Ano" #. Translators: This is an abbreviation for "Read" and "Write". This is displayed in the sidebar so your #. translation should preferably be quite short or an abbreviation #: src/ui/pages/drive.rs:436 msgid "R: {} · W: {}" msgstr "Č: {} · Z: {}" #: src/ui/pages/gpu.rs:218 msgid "Video Encoder/Decoder Usage" msgstr "Využití video enkodéru/dekodéru" #: src/ui/pages/gpu.rs:224 msgid "Video Encoder Usage" msgstr "Využití video enkodéru" #: src/ui/pages/gpu.rs:229 msgid "Video Decoder Usage" msgstr "Využití video dekodéru" #: src/ui/pages/gpu.rs:234 msgid "Video Memory Usage" msgstr "Využití videopaměti" #. Translators: This will be displayed in the sidebar, please try to keep your translation as short as (or even #. shorter than) 'Memory' #: src/ui/pages/gpu.rs:408 src/ui/pages/npu.rs:278 src/ui/pages/npu.rs:299 msgid "Memory: {}" msgstr "Paměť: {}" #: src/ui/pages/memory.rs:261 msgid "{} of {}" msgstr "{} z {}" #: src/ui/pages/memory.rs:264 msgid "{} MT/s" msgstr "{} MT/s" #. Translators: This will be displayed in the sidebar, so your translation for "Swap" should #. preferably be quite short or an abbreviation #: src/ui/pages/memory.rs:345 msgid "{} / {} · Swap: {} %" msgstr "{} / {} · Swap: {} %" #: src/ui/pages/network.rs:118 src/utils/network.rs:136 msgid "Network Interface" msgstr "Síťové rozhraní" #: src/ui/pages/network.rs:229 msgid "Receiving" msgstr "Přijímání" #: src/ui/pages/network.rs:233 msgid "Sending" msgstr "Odesílání" #. Translators: This is an abbreviation for "Receive" and "Send". This is displayed in the sidebar so #. your translation should preferably be quite short or an abbreviation #: src/ui/pages/network.rs:384 msgid "R: {} · S: {}" msgstr "P: {} · O: {}" #: src/ui/pages/npu.rs:109 src/ui/window.rs:484 msgid "NPU" msgstr "NPU" #: src/ui/pages/npu.rs:208 msgid "Memory Usage" msgstr "Využití paměti" #: src/ui/pages/processes/mod.rs:175 data/resources/ui/window.ui:105 #: data/resources/ui/window.ui:112 #: data/resources/ui/dialogs/settings_dialog.ui:193 msgid "Processes" msgstr "Procesy" #: src/ui/pages/processes/mod.rs:522 src/ui/pages/processes/mod.rs:2111 #: data/resources/ui/pages/processes.ui:38 #: data/resources/ui/pages/processes.ui:157 msgid "End Process" msgstr "Ukončit proces" #: src/ui/pages/processes/mod.rs:526 data/resources/ui/pages/processes.ui:70 msgid "End Processes" msgstr "Ukončit procesy" #: src/ui/pages/processes/mod.rs:812 msgid "Running Processes: {}" msgstr "Běžící procesy: {}" #: src/ui/pages/processes/mod.rs:910 msgid "Process" msgstr "Proces" #: src/ui/pages/processes/mod.rs:971 #: data/resources/ui/dialogs/process_dialog.ui:186 #: data/resources/ui/dialogs/settings_dialog.ui:210 msgid "Process ID" msgstr "ID procesu" #: src/ui/pages/processes/mod.rs:1024 #: data/resources/ui/dialogs/process_dialog.ui:213 #: data/resources/ui/dialogs/settings_dialog.ui:215 msgid "User" msgstr "Uživatel" #: src/ui/pages/processes/mod.rs:1699 #: data/resources/ui/dialogs/process_dialog.ui:154 #: data/resources/ui/dialogs/settings_dialog.ui:270 msgid "Total CPU Time" msgstr "Celkový čas" #: src/ui/pages/processes/mod.rs:1758 #: data/resources/ui/dialogs/process_dialog.ui:163 #: data/resources/ui/dialogs/settings_dialog.ui:275 msgid "User CPU Time" msgstr "Uživatelský čas CPU" #: src/ui/pages/processes/mod.rs:1817 #: data/resources/ui/dialogs/process_dialog.ui:172 #: data/resources/ui/dialogs/settings_dialog.ui:280 msgid "System CPU Time" msgstr "Systémový čas CPU" #: src/ui/pages/processes/mod.rs:1876 #: data/resources/ui/dialogs/process_options_dialog.ui:87 #: data/resources/ui/dialogs/settings_dialog.ui:285 msgid "Priority" msgstr "Priorita" #: src/ui/pages/processes/mod.rs:2070 msgid "End process?" msgid_plural "End {} processes?" msgstr[0] "Ukončit proces?" msgstr[1] "Ukončit {} procesy?" msgstr[2] "Ukončit {} procesů?" #: src/ui/pages/processes/mod.rs:2076 msgid "Halt process?" msgid_plural "Halt {} processes?" msgstr[0] "Zastavit proces?" msgstr[1] "Zastavit {} procesy?" msgstr[2] "Zastavit {} procesů?" #: src/ui/pages/processes/mod.rs:2082 src/ui/pages/processes/mod.rs:2088 msgid "Kill process?" msgid_plural "Kill {} processes?" msgstr[0] "Vynutit ukončení procesu?" msgstr[1] "Vynutit ukončení {} procesů?" msgstr[2] "Vynutit ukončení {} procesů?" #: src/ui/pages/processes/mod.rs:2100 msgid "" "Halting a process can come with serious risks such as losing data and " "security implications. Use with caution." msgstr "" "Zastavení procesu může mít za následek vážná rizika, jako je ztráta dat a " "ovlivnění bezpečnosti. Používejte s opatrností." #: src/ui/pages/processes/mod.rs:2103 msgid "" "Killing a process can come with serious risks such as losing data and " "security implications. Use with caution." msgstr "" "Vynucené ukončení procesu může mít za následek vážná rizika, jako je ztráta " "dat a ovlivnění bezpečnosti. Používejte s opatrností." #: src/ui/pages/processes/mod.rs:2112 data/resources/ui/pages/processes.ui:10 #: data/resources/ui/pages/processes.ui:46 msgid "Halt Process" msgstr "Zastavit proces" #: src/ui/pages/processes/mod.rs:2113 data/resources/ui/pages/processes.ui:6 #: data/resources/ui/pages/processes.ui:42 msgid "Kill Process" msgstr "Vynutit zastavení procesu" #: src/ui/pages/processes/mod.rs:2114 data/resources/ui/pages/processes.ui:14 #: data/resources/ui/pages/processes.ui:50 msgid "Continue Process" msgstr "Obnovit proces" #: src/ui/window.rs:452 msgid "GPU {}" msgstr "GPU {}" #: src/ui/window.rs:482 msgid "NPU {}" msgstr "NPU {}" #: src/ui/window.rs:1158 msgid "Successfully adjusted {}" msgstr "Aplikace {} úspěšně upravena" #: src/ui/window.rs:1159 msgid "There was a problem adjusting {}" msgstr "Při upravování aplikace {} došlo k chybě" #: src/ui/window.rs:1241 msgid "Successfully ended {}" msgstr "Aplikace {} úspěšně ukončena" #: src/ui/window.rs:1242 msgid "Successfully halted {}" msgstr "Aplikace {} úspěšně zastavena" #: src/ui/window.rs:1243 msgid "Successfully killed {}" msgstr "Aplikace {} úspěšně vynuceně ukončena" #: src/ui/window.rs:1244 msgid "Successfully continued {}" msgstr "Aplikace {} úspěšně obnovena" #: src/ui/window.rs:1251 msgid "Successfully ended the process" msgid_plural "Successfully ended {} processes" msgstr[0] "Proces úspěšně ukončen" msgstr[1] "Úspěšně ukončeny {} procesy" msgstr[2] "Úspěšně ukončeno {} procesů" #: src/ui/window.rs:1257 msgid "Successfully halted the process" msgid_plural "Successfully halted {} processes" msgstr[0] "Proces úspěšně zastaven" msgstr[1] "Úspěšně zastaveny {} procesy" msgstr[2] "Úspěšně zastaveno {} procesů" #: src/ui/window.rs:1263 msgid "Successfully killed the process" msgid_plural "Successfully killed {} processes" msgstr[0] "Proces úspěšně vynuceně ukončen" msgstr[1] "Úspěšně vynuceně ukončeny {} procesy" msgstr[2] "Úspěšně vynuceně ukončeno {} procesů" #: src/ui/window.rs:1269 msgid "Successfully continued the process" msgid_plural "Successfully continued {} processes" msgstr[0] "Proces úspěšně obnoven" msgstr[1] "Úspěšně obnoveny {} procesy" msgstr[2] "Úspěšně obnoveno {} procesů" #: src/ui/window.rs:1280 msgid "There was a problem ending a process" msgid_plural "There were problems ending {} processes" msgstr[0] "Při ukončování procesu došlo k chybě" msgstr[1] "Při ukončování {} procesů došlo k chybě" msgstr[2] "Při ukončování {} procesů došlo k chybě" #: src/ui/window.rs:1286 msgid "There was a problem halting a process" msgid_plural "There were problems halting {} processes" msgstr[0] "Při zastavování procesu došlo k chybě" msgstr[1] "Při zastavování {} procesů došlo k chybě" msgstr[2] "Při zastavování {} procesů došlo k chybě" #: src/ui/window.rs:1292 msgid "There was a problem killing a process" msgid_plural "There were problems killing {} processes" msgstr[0] "Při vynuceném ukončování procesu došlo k chybě" msgstr[1] "Při vynuceném ukončování {} procesů došlo k chybě" msgstr[2] "Při vynuceném ukončování {} procesů došlo k chybě" #: src/ui/window.rs:1298 msgid "There was a problem continuing a process" msgid_plural "There were problems continuing {} processes" msgstr[0] "Při obnovování procesu došlo k chybě" msgstr[1] "Při obnovování {} procesů došlo k chybě" msgstr[2] "Při obnovování {} procesů došlo k chybě" #: src/ui/window.rs:1308 msgid "There was a problem ending {}" msgstr "Při ukončování aplikace {} došlo k chybě" #: src/ui/window.rs:1309 msgid "There was a problem halting {}" msgstr "Při zastavování aplikace {} došlo k chybě" #: src/ui/window.rs:1310 msgid "There was a problem killing {}" msgstr "Při vynuceném ukončování aplikace {} došlo k chybě" #: src/ui/window.rs:1311 msgid "There was a problem continuing {}" msgstr "Při obnovování aplikace {} došlo k chybě" #: src/utils/app.rs:222 msgid "System Processes" msgstr "Systémové procesy" #: src/utils/battery.rs:90 msgid "Charging" msgstr "Nabíjení" #: src/utils/battery.rs:91 msgid "Discharging" msgstr "Vybíjení" #: src/utils/battery.rs:92 msgid "Empty" msgstr "Prázdná" #: src/utils/battery.rs:93 msgid "Full" msgstr "Plná" #: src/utils/battery.rs:94 msgid "Unknown" msgstr "Neznámé" #: src/utils/battery.rs:140 msgid "Nickel-Metal Hydride" msgstr "Nikl-metal hydridová" #: src/utils/battery.rs:141 msgid "Nickel-Cadmium" msgstr "Nikl-kadmiová" #: src/utils/battery.rs:142 msgid "Nickel-Zinc" msgstr "Nikl-zinková" #: src/utils/battery.rs:143 msgid "Lead-Acid" msgstr "Olověná" #: src/utils/battery.rs:144 msgid "Lithium-Ion" msgstr "Lithium-iontová" #: src/utils/battery.rs:145 msgid "Lithium Iron Phosphate" msgstr "Lithium železo fosfátová" #: src/utils/battery.rs:146 msgid "Lithium Polymer" msgstr "Lithium polymerová" #: src/utils/battery.rs:148 msgid "Rechargeable Alkaline Managanese" msgstr "Dobíjecí alkalicko manganová" #: src/utils/battery.rs:259 msgid "{} Battery" msgstr "{} baterie" #: src/utils/battery.rs:261 msgid "Battery" msgstr "Baterie" #: src/utils/drive.rs:128 src/utils/drive.rs:207 msgid "CD/DVD/Blu-ray Drive" msgstr "CD/DVD/Blu-ray disk" #: src/utils/drive.rs:129 msgid "eMMC Storage" msgstr "eMMC úložiště" #: src/utils/drive.rs:130 msgid "Flash Storage" msgstr "Flash úložiště" #: src/utils/drive.rs:131 src/utils/drive.rs:208 msgid "Floppy Drive" msgstr "Disketa" #: src/utils/drive.rs:132 msgid "Hard Disk Drive" msgstr "Pevný pisk" #: src/utils/drive.rs:133 msgid "Loop Device" msgstr "Loop zařízení" #: src/utils/drive.rs:134 msgid "Mapped Device" msgstr "Namapované zařízení" #: src/utils/drive.rs:135 msgid "NVMe Drive" msgstr "NVMe disk" #: src/utils/drive.rs:137 msgid "Software Raid" msgstr "Softwarový raid" #: src/utils/drive.rs:138 msgid "RAM Disk" msgstr "RAM disk" #: src/utils/drive.rs:139 msgid "Solid State Drive" msgstr "Solid-state drive" #: src/utils/drive.rs:140 msgid "ZFS Volume" msgstr "ZFS svazek" #: src/utils/drive.rs:141 msgid "Compressed RAM Disk (zram)" msgstr "Komprimovaný RAM disk (zram)" #: src/utils/drive.rs:209 msgid "{} Loop Device" msgstr "{} loop zařízení" #: src/utils/drive.rs:210 msgid "{} Mapped Device" msgstr "{} namapované zařízení" #: src/utils/drive.rs:211 msgid "{} RAID" msgstr "{} RAID" #: src/utils/drive.rs:212 msgid "{} RAM Disk" msgstr "{} RAM disk" #: src/utils/drive.rs:213 msgid "{} zram Device" msgstr "{} zram zařízení" #: src/utils/drive.rs:214 msgid "{} ZFS Volume" msgstr "{} svazek ZFS" #: src/utils/drive.rs:215 msgid "{} Drive" msgstr "{} disk" #: src/utils/network.rs:124 msgid "Bluetooth Tether" msgstr "Bluetooth tether" #: src/utils/network.rs:125 msgid "Network Bridge" msgstr "Síťový most" #: src/utils/network.rs:126 msgid "Ethernet Connection" msgstr "Ethernetové připojení" #: src/utils/network.rs:127 msgid "Docker Bridge" msgstr "Dockerový most" #: src/utils/network.rs:128 msgid "InfiniBand Connection" msgstr "Připojení InfiniBand" #: src/utils/network.rs:129 msgid "Serial Line IP Connection" msgstr "Připojení Serial Line IP" #: src/utils/network.rs:130 msgid "Virtual Ethernet Device" msgstr "Virtuální ethernetové zařízení" #: src/utils/network.rs:131 msgid "VM Network Bridge" msgstr "Síťový most VM" #: src/utils/network.rs:132 msgid "VPN Tunnel" msgstr "VPN tunel" #: src/utils/network.rs:133 msgid "VPN Tunnel (WireGuard)" msgstr "VPN tunel (WireGuard)" #: src/utils/network.rs:134 msgid "Wi-Fi Connection" msgstr "Wi-Fi připojení" #: src/utils/network.rs:135 msgid "WWAN Connection" msgstr "WWAN připojení" #: src/utils/units.rs:76 msgid "{} K" msgstr "{} K" #: src/utils/units.rs:78 msgid "{} °C" msgstr "{} °C" #: src/utils/units.rs:80 msgid "{} °F" msgstr "{} °F" #: src/utils/units.rs:98 src/utils/units.rs:112 src/utils/units.rs:132 #: src/utils/units.rs:146 msgid "{} B" msgstr "{} B" #: src/utils/units.rs:99 src/utils/units.rs:113 msgid "{} kB" msgstr "{} kB" #: src/utils/units.rs:100 src/utils/units.rs:114 msgid "{} MB" msgstr "{} MB" #: src/utils/units.rs:101 src/utils/units.rs:115 msgid "{} GB" msgstr "{} GB" #: src/utils/units.rs:102 src/utils/units.rs:116 msgid "{} TB" msgstr "{} TB" #: src/utils/units.rs:103 src/utils/units.rs:117 msgid "{} PB" msgstr "{} PB" #: src/utils/units.rs:104 src/utils/units.rs:118 msgid "{} EB" msgstr "{} EB" #: src/utils/units.rs:105 src/utils/units.rs:119 msgid "{} ZB" msgstr "{} ZB" #: src/utils/units.rs:106 src/utils/units.rs:120 msgid "{} YB" msgstr "{} YB" #: src/utils/units.rs:107 src/utils/units.rs:121 msgid "{} RB" msgstr "{} RB" #: src/utils/units.rs:108 src/utils/units.rs:122 msgid "{} QB" msgstr "{} QB" #: src/utils/units.rs:133 src/utils/units.rs:147 msgid "{} KiB" msgstr "{} KiB" #: src/utils/units.rs:134 src/utils/units.rs:148 msgid "{} MiB" msgstr "{} MiB" #: src/utils/units.rs:135 src/utils/units.rs:149 msgid "{} GiB" msgstr "{} GiB" #: src/utils/units.rs:136 src/utils/units.rs:150 msgid "{} TiB" msgstr "{} TiB" #: src/utils/units.rs:137 src/utils/units.rs:151 msgid "{} PiB" msgstr "{} PiB" #: src/utils/units.rs:138 src/utils/units.rs:152 msgid "{} EiB" msgstr "{} EiB" #: src/utils/units.rs:139 src/utils/units.rs:153 msgid "{} ZiB" msgstr "{} ZiB" #: src/utils/units.rs:140 src/utils/units.rs:154 msgid "{} YiB" msgstr "{} YiB" #: src/utils/units.rs:141 src/utils/units.rs:155 msgid "{} RiB" msgstr "{} RiB" #: src/utils/units.rs:142 src/utils/units.rs:156 msgid "{} QiB" msgstr "{} QiB" #: src/utils/units.rs:183 src/utils/units.rs:200 msgid "{} B/s" msgstr "{} B/s" #: src/utils/units.rs:184 msgid "{} kB/s" msgstr "{} kB/s" #: src/utils/units.rs:185 msgid "{} MB/s" msgstr "{} MB/s" #: src/utils/units.rs:186 msgid "{} GB/s" msgstr "{} GB/s" #: src/utils/units.rs:187 msgid "{} TB/s" msgstr "{} TB/s" #: src/utils/units.rs:188 msgid "{} PB/s" msgstr "{} PB/s" #: src/utils/units.rs:189 msgid "{} EB/s" msgstr "{} EB/s" #: src/utils/units.rs:190 msgid "{} ZB/s" msgstr "{} ZB/s" #: src/utils/units.rs:191 msgid "{} YB/s" msgstr "{} YB/s" #: src/utils/units.rs:192 msgid "{} RB/s" msgstr "{} RB/s" #: src/utils/units.rs:193 msgid "{} QB/s" msgstr "{} QB/s" #: src/utils/units.rs:201 msgid "{} KiB/s" msgstr "{} KiB/s" #: src/utils/units.rs:202 msgid "{} MiB/s" msgstr "{} MiB/s" #: src/utils/units.rs:203 msgid "{} GiB/s" msgstr "{} GiB/s" #: src/utils/units.rs:204 msgid "{} TiB/s" msgstr "{} TiB/s" #: src/utils/units.rs:205 msgid "{} PiB/s" msgstr "{} PiB/s" #: src/utils/units.rs:206 msgid "{} EiB/s" msgstr "{} EiB/s" #: src/utils/units.rs:207 msgid "{} ZiB/s" msgstr "{} ZiB/s" #: src/utils/units.rs:208 msgid "{} YiB/s" msgstr "{} YiB/s" #: src/utils/units.rs:209 msgid "{} RiB/s" msgstr "{} RiB/s" #: src/utils/units.rs:210 msgid "{} QiB/s" msgstr "{} QiB/s" #: src/utils/units.rs:224 src/utils/units.rs:241 msgid "{} b/s" msgstr "{} b/s" #: src/utils/units.rs:225 msgid "{} kb/s" msgstr "{} kb/s" #: src/utils/units.rs:226 msgid "{} Mb/s" msgstr "{} Mb/s" #: src/utils/units.rs:227 msgid "{} Gb/s" msgstr "{} Gb/s" #: src/utils/units.rs:228 msgid "{} Tb/s" msgstr "{} Tb/s" #: src/utils/units.rs:229 msgid "{} Pb/s" msgstr "{} Pb/s" #: src/utils/units.rs:230 msgid "{} Eb/s" msgstr "{} Eb/s" #: src/utils/units.rs:231 msgid "{} Zb/s" msgstr "{} Zb/s" #: src/utils/units.rs:232 msgid "{} Yb/s" msgstr "{} Yb/s" #: src/utils/units.rs:233 msgid "{} Rb/s" msgstr "{} Rb/s" #: src/utils/units.rs:234 msgid "{} Qb/s" msgstr "{} Qb/s" #: src/utils/units.rs:242 msgid "{} Kib/s" msgstr "{} Kib/s" #: src/utils/units.rs:243 msgid "{} Mib/s" msgstr "{} Mib/s" #: src/utils/units.rs:244 msgid "{} Gib/s" msgstr "{} Gib/s" #: src/utils/units.rs:245 msgid "{} Tib/s" msgstr "{} Tib/s" #: src/utils/units.rs:246 msgid "{} Pib/s" msgstr "{} Pib/s" #: src/utils/units.rs:247 msgid "{} Eib/s" msgstr "{} Eib/s" #: src/utils/units.rs:248 msgid "{} Zib/s" msgstr "{} Zib/s" #: src/utils/units.rs:249 msgid "{} Yib/s" msgstr "{} Yib/s" #: src/utils/units.rs:250 msgid "{} Rib/s" msgstr "{} Rib/s" #: src/utils/units.rs:251 msgid "{} Qib/s" msgstr "{} Qib/s" #: src/utils/units.rs:258 msgid "{} Hz" msgstr "{} Hz" #: src/utils/units.rs:259 msgid "{} kHz" msgstr "{} kHz" #: src/utils/units.rs:260 msgid "{} MHz" msgstr "{} MHz" #: src/utils/units.rs:261 msgid "{} GHz" msgstr "{} GHz" #: src/utils/units.rs:262 msgid "{} THz" msgstr "{} THz" #: src/utils/units.rs:263 msgid "{} PHz" msgstr "{} PHz" #: src/utils/units.rs:264 msgid "{} EHz" msgstr "{} EHz" #: src/utils/units.rs:265 msgid "{} ZHz" msgstr "{} ZHz" #: src/utils/units.rs:266 msgid "{} YHz" msgstr "{} YHz" #: src/utils/units.rs:267 msgid "{} RHz" msgstr "{} RHz" #: src/utils/units.rs:268 msgid "{} QHz" msgstr "{} QHz" #: src/utils/units.rs:275 msgid "{} W" msgstr "{} W" #: src/utils/units.rs:276 msgid "{} kW" msgstr "{} kW" #: src/utils/units.rs:277 msgid "{} MW" msgstr "{} MW" #: src/utils/units.rs:278 msgid "{} GW" msgstr "{} GW" #: src/utils/units.rs:279 msgid "{} TW" msgstr "{} TW" #: src/utils/units.rs:280 msgid "{} PW" msgstr "{} PW" #: src/utils/units.rs:281 msgid "{} EW" msgstr "{} EW" #: src/utils/units.rs:282 msgid "{} ZW" msgstr "{} ZW" #: src/utils/units.rs:283 msgid "{} YW" msgstr "{} YW" #: src/utils/units.rs:284 msgid "{} RW" msgstr "{} RW" #: src/utils/units.rs:285 msgid "{} QW" msgstr "{} QW" #: src/utils/units.rs:294 src/utils/units.rs:308 msgid "{} Wh" msgstr "{} Wh" #: src/utils/units.rs:295 src/utils/units.rs:309 msgid "{} kWh" msgstr "{} kWh" #: src/utils/units.rs:296 src/utils/units.rs:310 msgid "{} MWh" msgstr "{} MWh" #: src/utils/units.rs:297 src/utils/units.rs:311 msgid "{} GWh" msgstr "{} GWh" #: src/utils/units.rs:298 src/utils/units.rs:312 msgid "{} TWh" msgstr "{} TWh" #: src/utils/units.rs:299 src/utils/units.rs:313 msgid "{} PWh" msgstr "{} PWh" #: src/utils/units.rs:300 src/utils/units.rs:314 msgid "{} EWh" msgstr "{} EWh" #: src/utils/units.rs:301 src/utils/units.rs:315 msgid "{} ZWh" msgstr "{} ZWh" #: src/utils/units.rs:302 src/utils/units.rs:316 msgid "{} YWh" msgstr "{} YWh" #: src/utils/units.rs:303 src/utils/units.rs:317 msgid "{} RWh" msgstr "{} RWh" #: src/utils/units.rs:304 src/utils/units.rs:318 msgid "{} QWh" msgstr "{} QWh" #: data/resources/ui/shortcuts.ui:11 msgctxt "shortcut window" msgid "General" msgstr "Obecné" #: data/resources/ui/shortcuts.ui:14 msgctxt "shortcut window" msgid "Preferences" msgstr "Předvolby" #: data/resources/ui/shortcuts.ui:20 msgctxt "shortcut window" msgid "Show Shortcuts" msgstr "Zobrazit zkratky" #: data/resources/ui/shortcuts.ui:26 msgctxt "shortcut window" msgid "Quit" msgstr "Ukončit" #: data/resources/ui/shortcuts.ui:32 msgctxt "shortcut window" msgid "Toggle Search Field" msgstr "Přepnout vyhledávací pole" #: data/resources/ui/shortcuts.ui:38 msgctxt "shortcut window" msgid "End App/Process" msgstr "Ukončit aplikaci/proces" #: data/resources/ui/shortcuts.ui:44 msgctxt "shortcut window" msgid "Kill App/Process" msgstr "Vynuceně ukončit aplikaci/proces" #: data/resources/ui/shortcuts.ui:50 msgctxt "shortcut window" msgid "Halt App/Process" msgstr "Zastavit aplikaci/proces" #: data/resources/ui/shortcuts.ui:56 msgctxt "shortcut window" msgid "Continue App/Process" msgstr "Obnovit aplikaci/proces" #: data/resources/ui/shortcuts.ui:62 msgctxt "shortcut window" msgid "Show Information for App/Process" msgstr "Zobrazit informace o aplikaci/procesu" #: data/resources/ui/shortcuts.ui:68 msgctxt "shortcut window" msgid "Show Process Options" msgstr "Zobrazit možnosti procesu" #: data/resources/ui/window.ui:6 msgid "Preferences" msgstr "Předvolby" #: data/resources/ui/window.ui:10 msgid "Keyboard Shortcuts" msgstr "Klávesové zkratky" #: data/resources/ui/window.ui:14 msgid "About Resources" msgstr "O aplikaci Zdroje" #: data/resources/ui/window.ui:88 data/resources/ui/window.ui:128 msgid "Search" msgstr "Hledat" #: data/resources/ui/window.ui:90 data/resources/ui/window.ui:130 msgid "Toggle search field" msgstr "Přepnout vyhledávací pole" #: data/resources/ui/dialogs/app_dialog.ui:7 msgid "App Information" msgstr "Informace o aplikaci" #: data/resources/ui/dialogs/app_dialog.ui:70 #: data/resources/ui/dialogs/process_dialog.ui:48 #: data/resources/ui/pages/battery.ui:22 data/resources/ui/pages/cpu.ui:37 #: data/resources/ui/pages/cpu.ui:50 data/resources/ui/pages/drive.ui:22 #: data/resources/ui/pages/gpu.ui:22 data/resources/ui/pages/memory.ui:31 #: data/resources/ui/pages/network.ui:22 data/resources/ui/pages/npu.ui:22 msgid "Usage" msgstr "Využití" #: data/resources/ui/dialogs/app_dialog.ui:174 #: data/resources/ui/dialogs/process_dialog.ui:179 #: data/resources/ui/pages/battery.ui:33 data/resources/ui/pages/cpu.ui:83 #: data/resources/ui/pages/drive.ui:54 data/resources/ui/pages/gpu.ui:74 #: data/resources/ui/pages/memory.ui:42 data/resources/ui/pages/network.ui:51 #: data/resources/ui/pages/npu.ui:68 msgid "Properties" msgstr "Vlastnosti" #: data/resources/ui/dialogs/app_dialog.ui:180 msgid "ID" msgstr "ID" #: data/resources/ui/dialogs/app_dialog.ui:190 #: data/resources/ui/dialogs/process_dialog.ui:195 msgid "Running Since" msgstr "Běží od" #: data/resources/ui/dialogs/app_dialog.ui:198 msgid "Running Processes" msgstr "Běžící procesy" #: data/resources/ui/dialogs/app_dialog.ui:207 #: data/resources/ui/dialogs/process_dialog.ui:231 msgid "Containerized" msgstr "Kontejnerizováno" #: data/resources/ui/dialogs/process_dialog.ui:7 msgid "Process Information" msgstr "Informace o procesu" #: data/resources/ui/dialogs/process_dialog.ui:204 msgid "Commandline" msgstr "Příkazový řádek" #: data/resources/ui/dialogs/process_dialog.ui:222 msgid "Control Group" msgstr "Kontrolní skupina" #: data/resources/ui/dialogs/process_options_dialog.ui:7 #: data/resources/ui/dialogs/process_options_dialog.ui:69 msgid "Process Options" msgstr "Možnosti procesu" #: data/resources/ui/dialogs/process_options_dialog.ui:29 msgid "Apply" msgstr "Použít" #: data/resources/ui/dialogs/process_options_dialog.ui:72 msgid "Niceness" msgstr "Nice" #: data/resources/ui/dialogs/process_options_dialog.ui:73 msgid "" "The priority of a process is given by its niceness. A lower niceness value " "correspond to a higher priority." msgstr "" "Priorita procesu je dána hodnotou „nice“. Nižší hodnota „nice“ odpovídá " "vyšší prioritě." #: data/resources/ui/dialogs/process_options_dialog.ui:91 msgctxt "process priority" msgid "Very High" msgstr "Velmi vysoká" #: data/resources/ui/dialogs/process_options_dialog.ui:92 msgctxt "process priority" msgid "High" msgstr "Vysoká" #: data/resources/ui/dialogs/process_options_dialog.ui:93 msgctxt "process priority" msgid "Normal" msgstr "Normální" #: data/resources/ui/dialogs/process_options_dialog.ui:94 msgctxt "process priority" msgid "Low" msgstr "Nízká" #: data/resources/ui/dialogs/process_options_dialog.ui:95 msgctxt "process priority" msgid "Very Low" msgstr "Velmi nízká" #: data/resources/ui/dialogs/process_options_dialog.ui:103 msgid "Processor Affinity" msgstr "Afinita procesoru" #: data/resources/ui/dialogs/process_options_dialog.ui:108 msgid "Toggle All" msgstr "Přepnout vše" #: data/resources/ui/dialogs/process_options_dialog.ui:111 msgid "Select which processor cores the process is allowed to run on" msgstr "Vyberte, na kterých jádrech procesoru může proces běžet" #: data/resources/ui/dialogs/settings_dialog.ui:7 msgid "General" msgstr "Obecné" #: data/resources/ui/dialogs/settings_dialog.ui:10 msgid "Units" msgstr "Jednotky" #: data/resources/ui/dialogs/settings_dialog.ui:13 msgid "Data Unit Prefix" msgstr "Předpona datové jednotky" #: data/resources/ui/dialogs/settings_dialog.ui:17 msgid "Decimal" msgstr "Decimální" #: data/resources/ui/dialogs/settings_dialog.ui:18 msgid "Binary" msgstr "Binární" #: data/resources/ui/dialogs/settings_dialog.ui:26 msgid "Show Network Speeds in Bits per Second" msgstr "Zobrazit rychlost sítě v bitech za sekundu" #: data/resources/ui/dialogs/settings_dialog.ui:31 msgid "Temperature Unit" msgstr "Jednotka teploty" #: data/resources/ui/dialogs/settings_dialog.ui:35 msgid "Celsius" msgstr "Celsius" #: data/resources/ui/dialogs/settings_dialog.ui:36 msgid "Kelvin" msgstr "Kelvin" #: data/resources/ui/dialogs/settings_dialog.ui:37 msgid "Fahrenheit" msgstr "Fahrenheit" #: data/resources/ui/dialogs/settings_dialog.ui:47 msgid "User Interface" msgstr "Uživatelské rozhraní" #: data/resources/ui/dialogs/settings_dialog.ui:50 msgid "Refresh Speed" msgstr "Rychlost obnovování" #: data/resources/ui/dialogs/settings_dialog.ui:51 msgid "Higher refresh speeds can lead to higher processor usage" msgstr "" "Vyšší obnovovací rychlosti mohou mít za následek větší využití procesoru" #: data/resources/ui/dialogs/settings_dialog.ui:55 msgctxt "UI refresh speed" msgid "Very Slow" msgstr "Velmi pomalá" #: data/resources/ui/dialogs/settings_dialog.ui:56 msgctxt "UI refresh speed" msgid "Slow" msgstr "Pomalá" #: data/resources/ui/dialogs/settings_dialog.ui:57 msgctxt "UI refresh speed" msgid "Normal" msgstr "Normální" #: data/resources/ui/dialogs/settings_dialog.ui:58 msgctxt "UI refresh speed" msgid "Fast" msgstr "Rychlá" #: data/resources/ui/dialogs/settings_dialog.ui:59 msgctxt "UI refresh speed" msgid "Very Fast" msgstr "Velmi rychlá" #: data/resources/ui/dialogs/settings_dialog.ui:67 msgid "Show Graph Grids" msgstr "Zobrazit mřížky grafů" #: data/resources/ui/dialogs/settings_dialog.ui:72 msgid "Graph Data Points" msgstr "Body dat grafu" #: data/resources/ui/dialogs/settings_dialog.ui:86 msgid "Show Usage Details in Sidebar" msgstr "Zobrazit podrobnosti o využití v bočním panelu" #: data/resources/ui/dialogs/settings_dialog.ui:87 msgid "If enabled, the usage along with other information will be displayed" msgstr "" "Pokud je zapnuto, bude zobrazeno využití společně s dalšími informacemi" #: data/resources/ui/dialogs/settings_dialog.ui:92 msgid "Show Device Descriptions in Sidebar" msgstr "Zobrazit popisky zařízení v bočním panelu" #: data/resources/ui/dialogs/settings_dialog.ui:93 msgid "" "If enabled, a device identifier like its name or device type will be " "displayed" msgstr "" "Pokud je zapnuto, bude zobrazen identifikátor zařízení, jako jeho jméno nebo " "typ" #: data/resources/ui/dialogs/settings_dialog.ui:98 msgid "Sidebar Meter Type" msgstr "Typ měřidla v bočním panelu" #: data/resources/ui/dialogs/settings_dialog.ui:102 msgid "Bar" msgstr "Pruh" #: data/resources/ui/dialogs/settings_dialog.ui:103 msgid "Graph" msgstr "Graf" #: data/resources/ui/dialogs/settings_dialog.ui:111 msgid "Normalize Processor Usage" msgstr "Normalizovat využití procesoru" #: data/resources/ui/dialogs/settings_dialog.ui:112 msgid "" "If enabled, the total usage of all cores will be divided by the amount of " "cores" msgstr "" "Pokud je zapnuto, celkové využití všech jader se vydělí množstvím jader" #: data/resources/ui/dialogs/settings_dialog.ui:125 #: data/resources/ui/dialogs/settings_dialog.ui:207 msgid "Information Columns" msgstr "Informační sloupce" #: data/resources/ui/dialogs/settings_dialog.ui:196 #: data/resources/ui/pages/cpu.ui:22 data/resources/ui/pages/processes.ui:56 msgid "Options" msgstr "Možnosti" #: data/resources/ui/dialogs/settings_dialog.ui:199 msgid "Show Niceness Values" msgstr "Zobrazit hodnoty „nice“" #: data/resources/ui/dialogs/settings_dialog.ui:200 msgid "" "Display priorities as niceness to allow for more fine-grained adjustments" msgstr "Zobrazit priority jako hodnoty „nice“, umožňující jemnější úpravy" #: data/resources/ui/dialogs/settings_dialog.ui:305 msgid "Devices" msgstr "Zařízení" #: data/resources/ui/dialogs/settings_dialog.ui:308 msgid "Drives" msgstr "Disky" #: data/resources/ui/dialogs/settings_dialog.ui:311 msgid "Show Virtual Drives" msgstr "Zobrazit virtuální disky" #: data/resources/ui/dialogs/settings_dialog.ui:312 msgid "Virtual drives are for example ZFS volumes or mapped devices" msgstr "Virtuální disky jsou například svazky ZFS nebo namapovaná zařízení" #: data/resources/ui/dialogs/settings_dialog.ui:322 msgid "Show Virtual Network Interfaces" msgstr "Zobrazit virtuální síťová rozhraní" #: data/resources/ui/dialogs/settings_dialog.ui:323 msgid "Virtual network interfaces are for example bridges or VPN tunnels" msgstr "Virtuální síťová rozhraní jsou například mosty nebo VPN tunely" #: data/resources/ui/pages/applications.ui:40 #: data/resources/ui/pages/processes.ui:62 msgid "Information" msgstr "Informace" #: data/resources/ui/pages/applications.ui:57 msgid "Search applications" msgstr "Hledat aplikace" #: data/resources/ui/pages/applications.ui:87 #: data/resources/ui/pages/applications.ui:89 msgid "Show App Information" msgstr "Zobrazit informace o aplikaci" #: data/resources/ui/pages/battery.ui:36 msgid "Battery Health" msgstr "Zdraví baterie" #: data/resources/ui/pages/battery.ui:45 msgid "Design Capacity" msgstr "Nominální kapacita" #: data/resources/ui/pages/battery.ui:54 msgid "Charge Cycles" msgstr "Nabíjecí cykly" #: data/resources/ui/pages/battery.ui:63 msgid "Technology" msgstr "Technologie" #: data/resources/ui/pages/battery.ui:72 data/resources/ui/pages/gpu.ui:81 #: data/resources/ui/pages/network.ui:58 data/resources/ui/pages/npu.ui:75 msgid "Manufacturer" msgstr "Výrobce" #: data/resources/ui/pages/battery.ui:81 msgid "Model Name" msgstr "Název modelu" #: data/resources/ui/pages/battery.ui:90 data/resources/ui/pages/drive.ui:66 msgid "Device" msgstr "Zařízení" #: data/resources/ui/pages/cpu.ui:26 msgid "Show Usages of Logical CPUs" msgstr "Zobrazit využití logických CPU" #: data/resources/ui/pages/cpu.ui:75 data/resources/ui/pages/gpu.ui:66 #: data/resources/ui/pages/npu.ui:60 msgid "Sensors" msgstr "Senzory" #: data/resources/ui/pages/cpu.ui:90 msgid "Max Frequency" msgstr "Maximální frekvence" #: data/resources/ui/pages/cpu.ui:99 msgid "Logical Cores" msgstr "Logická jádra" #: data/resources/ui/pages/cpu.ui:108 msgid "Physical Cores" msgstr "Fyzická jádra" #: data/resources/ui/pages/cpu.ui:117 msgid "Sockets" msgstr "Patice" #: data/resources/ui/pages/cpu.ui:126 msgid "Virtualization" msgstr "Virtualizace" #: data/resources/ui/pages/cpu.ui:135 msgid "Architecture" msgstr "Architektura" #: data/resources/ui/pages/drive.ui:38 msgid "Total Read" msgstr "Celkem přečteno" #: data/resources/ui/pages/drive.ui:47 msgid "Total Written" msgstr "Celkem zapsáno" #: data/resources/ui/pages/drive.ui:57 data/resources/ui/pages/memory.ui:72 msgid "Type" msgstr "Typ" #: data/resources/ui/pages/drive.ui:75 msgid "Capacity" msgstr "Kapacita" #: data/resources/ui/pages/drive.ui:84 msgid "Writable" msgstr "Zapisovatelné" #: data/resources/ui/pages/drive.ui:93 msgid "Removable" msgstr "Odstranitelné" #. Translators: "Link" refers to something like "PCIe 4.0 ×16" #: data/resources/ui/pages/drive.ui:102 data/resources/ui/pages/gpu.ui:113 #: data/resources/ui/pages/npu.ui:107 msgid "Link" msgstr "Spojení" #: data/resources/ui/pages/gpu.ui:37 msgid "GPU Frequency" msgstr "Frekvence GPU" #: data/resources/ui/pages/gpu.ui:50 msgid "Video Memory Frequency" msgstr "Frekvence videopaměti" #: data/resources/ui/pages/gpu.ui:90 data/resources/ui/pages/npu.ui:84 msgid "PCI Slot" msgstr "Slot PCI" #: data/resources/ui/pages/gpu.ui:99 data/resources/ui/pages/network.ui:67 #: data/resources/ui/pages/npu.ui:93 msgid "Driver Used" msgstr "Použitý ovladač" #: data/resources/ui/pages/gpu.ui:108 data/resources/ui/pages/npu.ui:102 msgid "Max Power Cap" msgstr "Maximální limit spotřeby" #: data/resources/ui/pages/memory.ui:9 msgid "You need to authenticate to see memory properties" msgstr "Pro zobrazení vlastností paměti se musíte přihlásit" #: data/resources/ui/pages/memory.ui:10 msgid "Authenticate" msgstr "Přihlásit" #: data/resources/ui/pages/memory.ui:45 msgid "Slots Used" msgstr "Použité sloty" #: data/resources/ui/pages/memory.ui:54 msgid "Speed" msgstr "Rychlost" #: data/resources/ui/pages/memory.ui:63 msgid "Form Factor" msgstr "Formát" #: data/resources/ui/pages/memory.ui:81 msgid "Type Detail" msgstr "Podrobnosti o typu" #: data/resources/ui/pages/network.ui:35 msgid "Total Received" msgstr "Celkem přijato" #: data/resources/ui/pages/network.ui:44 msgid "Total Sent" msgstr "Celkem odesláno" #: data/resources/ui/pages/network.ui:76 msgid "Interface" msgstr "Rozhraní" #: data/resources/ui/pages/network.ui:85 msgid "Hardware Address" msgstr "Hardwarová adresa" #: data/resources/ui/pages/network.ui:94 msgid "Link Speed" msgstr "Rychlost spojení" #: data/resources/ui/pages/npu.ui:31 msgid "NPU Frequency" msgstr "Frekvence NPU" #: data/resources/ui/pages/npu.ui:44 msgid "Memory Frequency" msgstr "Frekvence faměti" #: data/resources/ui/pages/processes.ui:22 #: data/resources/ui/pages/processes.ui:74 msgid "Kill Processes" msgstr "Vynuceně ukončit procesy" #: data/resources/ui/pages/processes.ui:26 #: data/resources/ui/pages/processes.ui:78 msgid "Halt Processes" msgstr "Zastavit procesy" #: data/resources/ui/pages/processes.ui:30 #: data/resources/ui/pages/processes.ui:82 msgid "Continue Processes" msgstr "Obnovit procesy" #: data/resources/ui/pages/processes.ui:103 msgid "Search processes" msgstr "Hledat procesy" #: data/resources/ui/pages/processes.ui:133 #: data/resources/ui/pages/processes.ui:135 msgid "Show Process Options" msgstr "Zobrazit možnosti procesu" #: data/resources/ui/pages/processes.ui:146 #: data/resources/ui/pages/processes.ui:148 msgid "Show Process Information" msgstr "Zobrazit informace o procesu" #~ msgid "Show Search Fields on Launch" #~ msgstr "Zobrazit vyhledávací pole po spuštění" #~ msgid "VRAM: {}" #~ msgstr "VRAM: {}" #, fuzzy #~ msgid "Very High" #~ msgstr "Velmi Vysoká" #, fuzzy #~ msgid "High" #~ msgstr "Vysoká" #~ msgid "Normal" #~ msgstr "Normální" #, fuzzy #~ msgid "Low" #~ msgstr "Nízká" #, fuzzy #~ msgid "Very Low" #~ msgstr "Velmi Nízká" #~ msgid "End app" #~ msgstr "Ukončit aplikaci" #~ msgid "Halt app" #~ msgstr "Zastavit aplikaci" #~ msgid "Kill app" #~ msgstr "Zabít aplikaci" #~ msgid "Continue app" #~ msgstr "Obnovit aplikaci" #~ msgid "Continue process" #~ msgstr "Obnovit proces" #~ msgid "Application" #~ msgstr "Aplikace" #~ msgctxt "shortcut window" #~ msgid "End Application/Process" #~ msgstr "Ukončit Aplikaci/Proces" #~ msgctxt "shortcut window" #~ msgid "Kill Application/Process" #~ msgstr "Zabít Aplikaci/Proces" #~ msgctxt "shortcut window" #~ msgid "Halt Application/Process" #~ msgstr "Zastavit Aplikaci/Proces" #~ msgctxt "shortcut window" #~ msgid "Continue Application/Process" #~ msgstr "Obnovit Aplikaci/Proces" #~ msgid "root" #~ msgstr "root" resources-1.9.1/po/de.po000066400000000000000000001623531510634446000151170ustar00rootroot00000000000000# # piekay <>, 2024. # nokyan , 2022-2025. # msgid "" msgstr "" "Project-Id-Version: resources\n" "Report-Msgid-Bugs-To: https://github.com/nokyan/resources/issues/\n" "POT-Creation-Date: 2025-10-04 15:36+0000\n" "PO-Revision-Date: 2025-10-04 21:21+0200\n" "Last-Translator: Froschi \n" "Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.0.1\n" #: data/net.nokyan.Resources.desktop.in.in:2 data/net.nokyan.Resources.metainfo.xml.in.in:4 #: data/resources/ui/window.ui:22 src/application.rs:272 msgid "Resources" msgstr "Ressourcen" #. Translators: The summary should be 35 characters or less according to Flathub appstream guidelines #: data/net.nokyan.Resources.desktop.in.in:3 data/net.nokyan.Resources.metainfo.xml.in.in:5 msgid "Keep an eye on system resources" msgstr "Systemressourcen im Auge behalten" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/net.nokyan.Resources.desktop.in.in:9 msgid "System;Resources;Monitor;Processes;Usage;Task;Manager;CPU;RAM;Memory;GPU;" msgstr "System;Ressourcen;Monitor;Überwachung;Prozesse;Benutzung;Auslastung;Task;Manager;CPU;RAM;Speicher;GPU;" #: data/net.nokyan.Resources.metainfo.xml.in.in:17 msgid "" "Resources allows you to check the utilization of your system resources and control your running processes " "and apps. It’s designed to be user-friendly and feel right at home on a modern desktop by using GNOME’s " "libadwaita." msgstr "" "Ressourcen ermöglicht es Ihnen, die Auslastung Ihrer Systemressourcen zu überwachen und Ihre laufenden " "Prozesse und Anwendungen zu kontrollieren. Dank GNOMEs libadwaita ist Ressourcen einfach verständlich und " "passt somit perfekt in einen modernen Desktop." #: data/net.nokyan.Resources.metainfo.xml.in.in:20 msgid "Resources supports monitoring the following components:" msgstr "Ressourcen unterstützt das Überwachen folgender Komponenten:" #: data/net.nokyan.Resources.metainfo.xml.in.in:24 msgid "CPU" msgstr "CPU" #: data/net.nokyan.Resources.metainfo.xml.in.in:25 data/resources/ui/dialogs/app_dialog.ui:82 #: data/resources/ui/dialogs/process_dialog.ui:64 data/resources/ui/dialogs/settings_dialog.ui:128 #: data/resources/ui/dialogs/settings_dialog.ui:220 data/resources/ui/window.ui:176 #: data/resources/ui/window.ui:183 src/ui/pages/applications/mod.rs:803 src/ui/pages/memory.rs:106 #: src/ui/pages/memory.rs:192 src/ui/pages/processes/mod.rs:1079 msgid "Memory" msgstr "Arbeitsspeicher" #: data/net.nokyan.Resources.metainfo.xml.in.in:26 data/resources/ui/dialogs/app_dialog.ui:140 #: data/resources/ui/dialogs/process_dialog.ui:118 data/resources/ui/dialogs/settings_dialog.ui:158 #: data/resources/ui/dialogs/settings_dialog.ui:250 src/ui/pages/applications/mod.rs:1181 #: src/ui/pages/gpu.rs:119 src/ui/pages/processes/mod.rs:1469 src/ui/window.rs:468 msgid "GPU" msgstr "GPU" #: data/net.nokyan.Resources.metainfo.xml.in.in:27 data/resources/ui/dialogs/settings_dialog.ui:319 msgid "Network Interfaces" msgstr "Netzwerkschnittstellen" #: data/net.nokyan.Resources.metainfo.xml.in.in:28 msgid "Storage Devices" msgstr "Datenträger" #: data/net.nokyan.Resources.metainfo.xml.in.in:29 msgid "Batteries" msgstr "Akkus" #: data/net.nokyan.Resources.metainfo.xml.in.in:51 msgid "Apps page in light theme" msgstr "„Anwendungen“ im hellen Design" #: data/net.nokyan.Resources.metainfo.xml.in.in:55 msgid "Processes page in dark theme" msgstr "„Prozesse“ im dunklen Design" #: data/net.nokyan.Resources.metainfo.xml.in.in:59 msgid "Processor page in light theme" msgstr "„Prozessor“ im hellen Design" #: data/net.nokyan.Resources.metainfo.xml.in.in:63 msgid "Memory page in dark theme" msgstr "„Arbeitsspeicher“ im dunklen Design" #: data/net.nokyan.Resources.metainfo.xml.in.in:67 msgid "GPU page in light theme" msgstr "„GPU“ im hellen Design" #: data/net.nokyan.Resources.metainfo.xml.in.in:71 msgid "Drive page in dark theme" msgstr "„Datenträger“ im dunklen Design" #: data/net.nokyan.Resources.metainfo.xml.in.in:75 msgid "Network Interface page in light theme" msgstr "„Netzwerkschnittstelle“ im hellen Design" #: data/net.nokyan.Resources.metainfo.xml.in.in:79 msgid "Battery page in dark theme" msgstr "„Akku“ im dunklen Design" #: data/net.nokyan.Resources.policy.in.in:9 msgid "Control Process" msgstr "Prozess steuern" #: data/net.nokyan.Resources.policy.in.in:10 msgid "Authentication is required to control superuser’s or other users’ processes" msgstr "" "Authentifizierung ist erforderlich, um die Prozesse des Superusers oder anderer Benutzer zu kontrollieren" #: data/resources/ui/dialogs/app_dialog.ui:7 msgid "App Information" msgstr "Anwendungsinformationen" #: data/resources/ui/dialogs/app_dialog.ui:70 data/resources/ui/dialogs/process_dialog.ui:48 #: data/resources/ui/pages/battery.ui:22 data/resources/ui/pages/cpu.ui:37 data/resources/ui/pages/cpu.ui:50 #: data/resources/ui/pages/drive.ui:22 data/resources/ui/pages/gpu.ui:22 data/resources/ui/pages/memory.ui:31 #: data/resources/ui/pages/network.ui:22 data/resources/ui/pages/npu.ui:22 msgid "Usage" msgstr "Auslastung" #: data/resources/ui/dialogs/app_dialog.ui:73 data/resources/ui/dialogs/process_dialog.ui:55 #: data/resources/ui/dialogs/settings_dialog.ui:133 data/resources/ui/dialogs/settings_dialog.ui:225 #: data/resources/ui/window.ui:145 data/resources/ui/window.ui:152 src/ui/pages/applications/mod.rs:862 #: src/ui/pages/cpu.rs:128 src/ui/pages/processes/mod.rs:1138 src/ui/window.rs:290 msgid "Processor" msgstr "Prozessor" #: data/resources/ui/dialogs/app_dialog.ui:91 data/resources/ui/dialogs/process_dialog.ui:73 #: data/resources/ui/dialogs/settings_dialog.ui:178 data/resources/ui/dialogs/settings_dialog.ui:290 #: src/ui/pages/applications/mod.rs:1420 src/ui/pages/memory.rs:198 src/ui/pages/processes/mod.rs:1954 msgid "Swap" msgstr "Auslagerungsspeicher" #: data/resources/ui/dialogs/app_dialog.ui:100 data/resources/ui/dialogs/process_dialog.ui:78 #: data/resources/ui/dialogs/settings_dialog.ui:138 data/resources/ui/dialogs/settings_dialog.ui:230 #: src/ui/pages/applications/mod.rs:926 src/ui/pages/processes/mod.rs:1202 msgid "Drive Read" msgstr "Lesevorgänge" #: data/resources/ui/dialogs/app_dialog.ui:109 data/resources/ui/dialogs/process_dialog.ui:87 #: data/resources/ui/dialogs/settings_dialog.ui:143 data/resources/ui/dialogs/settings_dialog.ui:235 #: src/ui/pages/applications/mod.rs:991 src/ui/pages/processes/mod.rs:1269 msgid "Drive Read Total" msgstr "Lesevorgänge insgesamt" #: data/resources/ui/dialogs/app_dialog.ui:118 data/resources/ui/dialogs/process_dialog.ui:96 #: data/resources/ui/dialogs/settings_dialog.ui:148 data/resources/ui/dialogs/settings_dialog.ui:240 #: src/ui/pages/applications/mod.rs:1052 src/ui/pages/processes/mod.rs:1336 msgid "Drive Write" msgstr "Schreibvorgänge" #: data/resources/ui/dialogs/app_dialog.ui:127 data/resources/ui/dialogs/process_dialog.ui:105 #: data/resources/ui/dialogs/settings_dialog.ui:153 data/resources/ui/dialogs/settings_dialog.ui:245 #: src/ui/pages/applications/mod.rs:1119 src/ui/pages/processes/mod.rs:1403 msgid "Drive Write Total" msgstr "Schreibvorgänge insgesamt" #: data/resources/ui/dialogs/app_dialog.ui:149 data/resources/ui/dialogs/process_dialog.ui:127 #: data/resources/ui/dialogs/settings_dialog.ui:163 data/resources/ui/dialogs/settings_dialog.ui:255 #: src/ui/pages/applications/mod.rs:1361 src/ui/pages/processes/mod.rs:1650 msgid "Video Memory" msgstr "Grafikspeicher" #: data/resources/ui/dialogs/app_dialog.ui:158 data/resources/ui/dialogs/process_dialog.ui:136 #: data/resources/ui/dialogs/settings_dialog.ui:168 data/resources/ui/dialogs/settings_dialog.ui:260 #: src/ui/pages/applications/mod.rs:1240 src/ui/pages/processes/mod.rs:1528 msgid "Video Encoder" msgstr "Videokodierer" #: data/resources/ui/dialogs/app_dialog.ui:167 data/resources/ui/dialogs/process_dialog.ui:145 #: data/resources/ui/dialogs/settings_dialog.ui:173 data/resources/ui/dialogs/settings_dialog.ui:265 #: src/ui/pages/applications/mod.rs:1301 src/ui/pages/processes/mod.rs:1589 msgid "Video Decoder" msgstr "Videodekodierer" #: data/resources/ui/dialogs/app_dialog.ui:174 data/resources/ui/dialogs/process_dialog.ui:179 #: data/resources/ui/pages/battery.ui:33 data/resources/ui/pages/cpu.ui:83 data/resources/ui/pages/drive.ui:54 #: data/resources/ui/pages/gpu.ui:74 data/resources/ui/pages/memory.ui:42 data/resources/ui/pages/network.ui:51 #: data/resources/ui/pages/npu.ui:68 msgid "Properties" msgstr "Eigenschaften" #: data/resources/ui/dialogs/app_dialog.ui:180 msgid "ID" msgstr "ID" #: data/resources/ui/dialogs/app_dialog.ui:190 data/resources/ui/dialogs/process_dialog.ui:195 msgid "Running Since" msgstr "Läuft seit" #: data/resources/ui/dialogs/app_dialog.ui:198 msgid "Running Processes" msgstr "Laufende Prozesse" #: data/resources/ui/dialogs/app_dialog.ui:207 data/resources/ui/dialogs/process_dialog.ui:231 msgid "Containerized" msgstr "Benutzt Container" #: data/resources/ui/dialogs/process_dialog.ui:7 msgid "Process Information" msgstr "Prozessinformationen" #: data/resources/ui/dialogs/process_dialog.ui:154 data/resources/ui/dialogs/settings_dialog.ui:270 #: src/ui/pages/processes/mod.rs:1710 msgid "Total CPU Time" msgstr "Gesamte Prozessorzeit" #: data/resources/ui/dialogs/process_dialog.ui:163 data/resources/ui/dialogs/settings_dialog.ui:275 #: src/ui/pages/processes/mod.rs:1769 msgid "User CPU Time" msgstr "Benutzerprozessorzeit" #: data/resources/ui/dialogs/process_dialog.ui:172 data/resources/ui/dialogs/settings_dialog.ui:280 #: src/ui/pages/processes/mod.rs:1828 msgid "System CPU Time" msgstr "Systemprozessorzeit" #: data/resources/ui/dialogs/process_dialog.ui:186 data/resources/ui/dialogs/settings_dialog.ui:210 #: src/ui/pages/processes/mod.rs:972 msgid "Process ID" msgstr "Prozess-ID" #: data/resources/ui/dialogs/process_dialog.ui:204 msgid "Commandline" msgstr "Befehlszeile" #: data/resources/ui/dialogs/process_dialog.ui:213 data/resources/ui/dialogs/settings_dialog.ui:215 #: src/ui/pages/processes/mod.rs:1025 msgid "User" msgstr "Benutzer" #: data/resources/ui/dialogs/process_dialog.ui:222 msgid "Control Group" msgstr "Kontrollgruppe" #: data/resources/ui/dialogs/process_options_dialog.ui:7 data/resources/ui/dialogs/process_options_dialog.ui:69 msgid "Process Options" msgstr "Prozessoptionen" #: data/resources/ui/dialogs/process_options_dialog.ui:29 msgid "Apply" msgstr "Anwenden" #: data/resources/ui/dialogs/process_options_dialog.ui:72 msgid "Niceness" msgstr "Nice-Wert" #: data/resources/ui/dialogs/process_options_dialog.ui:73 msgid "" "The priority of a process is given by its niceness. A lower niceness value correspond to a higher priority." msgstr "" "Der Nice-Wert eines Prozesses legt dessen Priorität fest. Ein niedrigerer Nice-Wert entspricht einer höheren " "Priorität." #: data/resources/ui/dialogs/process_options_dialog.ui:87 data/resources/ui/dialogs/settings_dialog.ui:285 #: src/ui/pages/processes/mod.rs:1887 msgid "Priority" msgstr "Priorität" #: data/resources/ui/dialogs/process_options_dialog.ui:91 msgctxt "process priority" msgid "Very High" msgstr "Sehr hoch" #: data/resources/ui/dialogs/process_options_dialog.ui:92 msgctxt "process priority" msgid "High" msgstr "Hoch" #: data/resources/ui/dialogs/process_options_dialog.ui:93 msgctxt "process priority" msgid "Normal" msgstr "Normal" #: data/resources/ui/dialogs/process_options_dialog.ui:94 msgctxt "process priority" msgid "Low" msgstr "Niedrig" #: data/resources/ui/dialogs/process_options_dialog.ui:95 msgctxt "process priority" msgid "Very Low" msgstr "Sehr niedrig" #: data/resources/ui/dialogs/process_options_dialog.ui:103 msgid "Processor Affinity" msgstr "Prozessoraffinität" #: data/resources/ui/dialogs/process_options_dialog.ui:108 msgid "Toggle All" msgstr "Alle umschalten" #: data/resources/ui/dialogs/process_options_dialog.ui:111 msgid "Select which processor cores the process is allowed to run on" msgstr "Auswählen, auf welchen Prozessorkernen der Prozess ausgeführt werden darf" #: data/resources/ui/dialogs/settings_dialog.ui:7 msgid "General" msgstr "Allgemein" #: data/resources/ui/dialogs/settings_dialog.ui:10 msgid "Units" msgstr "Einheiten" #: data/resources/ui/dialogs/settings_dialog.ui:13 msgid "Data Unit Prefix" msgstr "Dezimalsystem" #: data/resources/ui/dialogs/settings_dialog.ui:17 msgid "Decimal" msgstr "Dezimal" #: data/resources/ui/dialogs/settings_dialog.ui:18 msgid "Binary" msgstr "Binär" #: data/resources/ui/dialogs/settings_dialog.ui:26 msgid "Show Network Speeds in Bits per Second" msgstr "Netzwerkgeschwindigkeiten in Bits pro Sekunde anzeigen" #: data/resources/ui/dialogs/settings_dialog.ui:31 msgid "Temperature Unit" msgstr "Temperatureinheit" #: data/resources/ui/dialogs/settings_dialog.ui:35 msgid "Celsius" msgstr "Celsius" #: data/resources/ui/dialogs/settings_dialog.ui:36 msgid "Kelvin" msgstr "Kelvin" #: data/resources/ui/dialogs/settings_dialog.ui:37 msgid "Fahrenheit" msgstr "Fahrenheit" #: data/resources/ui/dialogs/settings_dialog.ui:47 msgid "User Interface" msgstr "Nutzeroberfläche" #: data/resources/ui/dialogs/settings_dialog.ui:50 msgid "Refresh Speed" msgstr "Aktualisierungsgeschwindigkeit" #: data/resources/ui/dialogs/settings_dialog.ui:51 msgid "Higher refresh speeds can lead to higher processor usage" msgstr "Höhere Geschwindigkeiten können zu höherer Prozessorauslastung führen" #: data/resources/ui/dialogs/settings_dialog.ui:55 msgctxt "UI refresh speed" msgid "Very Slow" msgstr "Sehr langsam" #: data/resources/ui/dialogs/settings_dialog.ui:56 msgctxt "UI refresh speed" msgid "Slow" msgstr "Langsam" #: data/resources/ui/dialogs/settings_dialog.ui:57 msgctxt "UI refresh speed" msgid "Normal" msgstr "Normal" #: data/resources/ui/dialogs/settings_dialog.ui:58 msgctxt "UI refresh speed" msgid "Fast" msgstr "Schnell" #: data/resources/ui/dialogs/settings_dialog.ui:59 msgctxt "UI refresh speed" msgid "Very Fast" msgstr "Sehr schnell" #: data/resources/ui/dialogs/settings_dialog.ui:67 msgid "Show Graph Grids" msgstr "Raster in Graphen anzeigen" #: data/resources/ui/dialogs/settings_dialog.ui:72 msgid "Graph Data Points" msgstr "Datenpunkte in Graphen" #: data/resources/ui/dialogs/settings_dialog.ui:86 msgid "Show Usage Details in Sidebar" msgstr "Auslastungsdetails in der Seitenleiste anzeigen" #: data/resources/ui/dialogs/settings_dialog.ui:87 msgid "If enabled, the usage along with other information will be displayed" msgstr "Falls aktiv, werden die Auslastung und andere Informationen angezeigt" #: data/resources/ui/dialogs/settings_dialog.ui:92 msgid "Show Device Descriptions in Sidebar" msgstr "Gerätebeschreibungen in der Seitenleiste anzeigen" #: data/resources/ui/dialogs/settings_dialog.ui:93 msgid "If enabled, a device identifier like its name or device type will be displayed" msgstr "Falls aktiv, wird ein Bezeichner wie der Name oder Gerätetyp des Geräts angezeigt" #: data/resources/ui/dialogs/settings_dialog.ui:98 msgid "Sidebar Meter Type" msgstr "Auslastungsdarstellung in der Seitenleiste" #: data/resources/ui/dialogs/settings_dialog.ui:102 msgid "Bar" msgstr "Leiste" #: data/resources/ui/dialogs/settings_dialog.ui:103 msgid "Graph" msgstr "Graph" #: data/resources/ui/dialogs/settings_dialog.ui:111 msgid "Normalize Processor Usage" msgstr "Prozessorauslastung normalisieren" #: data/resources/ui/dialogs/settings_dialog.ui:112 msgid "If enabled, the total usage of all cores will be divided by the amount of cores" msgstr "Falls aktiv, wird die summierte Auslastung aller Kerne durch die Anzahl dividiert" #: data/resources/ui/dialogs/settings_dialog.ui:122 data/resources/ui/window.ui:65 #: data/resources/ui/window.ui:72 src/ui/pages/applications/mod.rs:131 msgid "Apps" msgstr "Anwendungen" #: data/resources/ui/dialogs/settings_dialog.ui:125 data/resources/ui/dialogs/settings_dialog.ui:207 msgid "Information Columns" msgstr "Informationsspalten" #: data/resources/ui/dialogs/settings_dialog.ui:183 data/resources/ui/dialogs/settings_dialog.ui:295 #: src/ui/pages/applications/mod.rs:1479 src/ui/pages/processes/mod.rs:2013 msgid "Combined Memory" msgstr "Kombinierter Speicher" #: data/resources/ui/dialogs/settings_dialog.ui:193 data/resources/ui/window.ui:105 #: data/resources/ui/window.ui:112 src/ui/pages/processes/mod.rs:175 msgid "Processes" msgstr "Prozesse" #: data/resources/ui/dialogs/settings_dialog.ui:196 data/resources/ui/pages/cpu.ui:22 #: data/resources/ui/pages/processes.ui:56 msgid "Options" msgstr "Optionen" #: data/resources/ui/dialogs/settings_dialog.ui:199 msgid "Show Niceness Values" msgstr "Nice-Werte anzeigen" #: data/resources/ui/dialogs/settings_dialog.ui:200 msgid "Display priorities as niceness to allow for more fine-grained adjustments" msgstr "Prioritäten als Nice-Wert um feinere Anpassungen zu ermöglichen" #: data/resources/ui/dialogs/settings_dialog.ui:305 msgid "Devices" msgstr "Geräte" #: data/resources/ui/dialogs/settings_dialog.ui:308 msgid "Drives" msgstr "Datenträger" #: data/resources/ui/dialogs/settings_dialog.ui:311 msgid "Show Virtual Drives" msgstr "Virtuelle Laufwerke anzeigen" #: data/resources/ui/dialogs/settings_dialog.ui:312 msgid "Virtual drives are for example ZFS volumes or mapped devices" msgstr "Als virtuelle Laufwerke zählen zum Beispiel ZFS-Volumen oder RAM-Disks" #: data/resources/ui/dialogs/settings_dialog.ui:322 msgid "Show Virtual Network Interfaces" msgstr "Virtuelle Netzwerkschnittstellen anzeigen" #: data/resources/ui/dialogs/settings_dialog.ui:323 msgid "Virtual network interfaces are for example bridges or VPN tunnels" msgstr "Als virtuelle Netzwerkschnittstellen zählen zum Beispiel Bridges oder Tunnel" #: data/resources/ui/pages/applications.ui:6 data/resources/ui/pages/applications.ui:26 #: src/ui/pages/applications/mod.rs:1563 msgid "Kill App" msgstr "Anwendung abwürgen" #: data/resources/ui/pages/applications.ui:10 data/resources/ui/pages/applications.ui:30 #: src/ui/pages/applications/mod.rs:1562 msgid "Halt App" msgstr "Anwendung anhalten" #: data/resources/ui/pages/applications.ui:14 data/resources/ui/pages/applications.ui:34 #: src/ui/pages/applications/mod.rs:1564 msgid "Continue App" msgstr "Anwendung fortsetzen" #: data/resources/ui/pages/applications.ui:22 data/resources/ui/pages/applications.ui:98 #: src/ui/pages/applications/mod.rs:1561 msgid "End App" msgstr "Anwendung beenden" #: data/resources/ui/pages/applications.ui:40 data/resources/ui/pages/processes.ui:62 msgid "Information" msgstr "Informationen" #: data/resources/ui/pages/applications.ui:57 msgid "Search applications" msgstr "Anwendungen suchen" #: data/resources/ui/pages/applications.ui:87 data/resources/ui/pages/applications.ui:89 msgid "Show App Information" msgstr "Anwendungsinformationen anzeigen" #: data/resources/ui/pages/battery.ui:36 msgid "Battery Health" msgstr "Batteriezustand" #: data/resources/ui/pages/battery.ui:45 msgid "Design Capacity" msgstr "Nennkapazität" #: data/resources/ui/pages/battery.ui:54 msgid "Charge Cycles" msgstr "Ladezyklen" #: data/resources/ui/pages/battery.ui:63 msgid "Technology" msgstr "Technologie" #: data/resources/ui/pages/battery.ui:72 data/resources/ui/pages/gpu.ui:81 #: data/resources/ui/pages/network.ui:58 data/resources/ui/pages/npu.ui:75 msgid "Manufacturer" msgstr "Hersteller" #: data/resources/ui/pages/battery.ui:81 msgid "Model Name" msgstr "Modellname" #: data/resources/ui/pages/battery.ui:90 data/resources/ui/pages/drive.ui:66 msgid "Device" msgstr "Gerät" #: data/resources/ui/pages/cpu.ui:26 msgid "Show Usages of Logical CPUs" msgstr "Auslastung der logischen Prozessoren anzeigen" #: data/resources/ui/pages/cpu.ui:75 data/resources/ui/pages/gpu.ui:66 data/resources/ui/pages/npu.ui:60 msgid "Sensors" msgstr "Sensoren" #: data/resources/ui/pages/cpu.ui:90 msgid "Max Frequency" msgstr "Maximale Taktfrequenz" #: data/resources/ui/pages/cpu.ui:99 msgid "Logical Cores" msgstr "Logische Kerne" #: data/resources/ui/pages/cpu.ui:108 msgid "Physical Cores" msgstr "Physische Kerne" #: data/resources/ui/pages/cpu.ui:117 msgid "Sockets" msgstr "Sockel" #: data/resources/ui/pages/cpu.ui:126 msgid "Uptime" msgstr "Betriebszeit" #: data/resources/ui/pages/cpu.ui:135 msgid "Virtualization" msgstr "Virtualisierung" #: data/resources/ui/pages/cpu.ui:144 msgid "Architecture" msgstr "Architektur" #: data/resources/ui/pages/drive.ui:38 msgid "Total Read" msgstr "Insgesamt gelesen" #: data/resources/ui/pages/drive.ui:47 msgid "Total Written" msgstr "Insgesamt geschrieben" #: data/resources/ui/pages/drive.ui:57 data/resources/ui/pages/memory.ui:72 msgid "Type" msgstr "Typ" #: data/resources/ui/pages/drive.ui:75 msgid "Capacity" msgstr "Kapazität" #: data/resources/ui/pages/drive.ui:84 msgid "Writable" msgstr "Beschreibbar" #: data/resources/ui/pages/drive.ui:93 msgid "Removable" msgstr "Wechselspeicher" #. Translators: "Link" refers to something like "PCIe 4.0 ×16" #: data/resources/ui/pages/drive.ui:102 data/resources/ui/pages/gpu.ui:113 #: data/resources/ui/pages/network.ui:103 data/resources/ui/pages/npu.ui:107 msgid "Link" msgstr "Anbindung" #: data/resources/ui/pages/gpu.ui:37 msgid "GPU Frequency" msgstr "GPU-Frequenz" #: data/resources/ui/pages/gpu.ui:50 msgid "Video Memory Frequency" msgstr "Grafikspeichertaktfrequenz" #: data/resources/ui/pages/gpu.ui:55 data/resources/ui/pages/npu.ui:49 src/ui/pages/battery.rs:217 msgid "Power Usage" msgstr "Leistungsaufnahme" #: data/resources/ui/pages/gpu.ui:90 data/resources/ui/pages/npu.ui:84 msgid "PCI Slot" msgstr "PCI-Slot" #: data/resources/ui/pages/gpu.ui:99 data/resources/ui/pages/network.ui:67 data/resources/ui/pages/npu.ui:93 msgid "Driver Used" msgstr "Benutzter Treiber" #: data/resources/ui/pages/gpu.ui:108 data/resources/ui/pages/npu.ui:102 msgid "Max Power Cap" msgstr "Maximale Leistungsbegrenzung" #: data/resources/ui/pages/memory.ui:9 msgid "You need to authenticate to see memory properties" msgstr "Sie müssen sich authentifizieren um Speichereigenschaften zu sehen" #: data/resources/ui/pages/memory.ui:10 msgid "Authenticate" msgstr "Authentifizieren" #: data/resources/ui/pages/memory.ui:45 msgid "Slots Used" msgstr "Benutzte Slots" #: data/resources/ui/pages/memory.ui:54 msgid "Speed" msgstr "Geschwindigkeit" #: data/resources/ui/pages/memory.ui:63 msgid "Form Factor" msgstr "Formfaktor" #: data/resources/ui/pages/memory.ui:81 msgid "Type Detail" msgstr "Typdetails" #: data/resources/ui/pages/network.ui:35 msgid "Total Received" msgstr "Insgesamt empfangen" #: data/resources/ui/pages/network.ui:44 msgid "Total Sent" msgstr "Insgesamt gesendet" #: data/resources/ui/pages/network.ui:76 msgid "Interface" msgstr "Schnittstelle" #: data/resources/ui/pages/network.ui:85 msgid "Hardware Address" msgstr "Geräteadresse" #: data/resources/ui/pages/network.ui:94 msgid "Network Name" msgstr "Netzwerk-Name" #: data/resources/ui/pages/network.ui:112 msgid "Link Speed" msgstr "Verbindungsgeschwindigkeit" #: data/resources/ui/pages/npu.ui:31 msgid "NPU Frequency" msgstr "NPU-Frequenz" #: data/resources/ui/pages/npu.ui:44 msgid "Memory Frequency" msgstr "Speicherfrequenz" #: data/resources/ui/pages/processes.ui:6 data/resources/ui/pages/processes.ui:42 #: src/ui/pages/processes/mod.rs:2126 msgid "Kill Process" msgstr "Prozess abwürgen" #: data/resources/ui/pages/processes.ui:10 data/resources/ui/pages/processes.ui:46 #: src/ui/pages/processes/mod.rs:2125 msgid "Halt Process" msgstr "Prozess anhalten" #: data/resources/ui/pages/processes.ui:14 data/resources/ui/pages/processes.ui:50 #: src/ui/pages/processes/mod.rs:2127 msgid "Continue Process" msgstr "Prozess fortsetzen" #: data/resources/ui/pages/processes.ui:22 data/resources/ui/pages/processes.ui:74 msgid "Kill Processes" msgstr "Prozesse abwürgen" #: data/resources/ui/pages/processes.ui:26 data/resources/ui/pages/processes.ui:78 msgid "Halt Processes" msgstr "Prozesse anhalten" #: data/resources/ui/pages/processes.ui:30 data/resources/ui/pages/processes.ui:82 msgid "Continue Processes" msgstr "Prozesse fortsetzen" #: data/resources/ui/pages/processes.ui:38 data/resources/ui/pages/processes.ui:157 #: src/ui/pages/processes/mod.rs:523 src/ui/pages/processes/mod.rs:2124 msgid "End Process" msgstr "Prozess beenden" #: data/resources/ui/pages/processes.ui:70 src/ui/pages/processes/mod.rs:527 msgid "End Processes" msgstr "Prozesse beenden" #: data/resources/ui/pages/processes.ui:103 msgid "Search processes" msgstr "Prozesse suchen" #: data/resources/ui/pages/processes.ui:133 data/resources/ui/pages/processes.ui:135 msgid "Show Process Options" msgstr "Prozessoptionen anzeigen" #: data/resources/ui/pages/processes.ui:146 data/resources/ui/pages/processes.ui:148 msgid "Show Process Information" msgstr "Prozessinformationen anzeigen" #: data/resources/ui/shortcuts.ui:6 msgctxt "shortcut window" msgid "General" msgstr "Allgemein" #: data/resources/ui/shortcuts.ui:9 msgctxt "shortcut window" msgid "Preferences" msgstr "Einstellungen" #: data/resources/ui/shortcuts.ui:15 msgctxt "shortcut window" msgid "Show Shortcuts" msgstr "Tastenkombinationen" #: data/resources/ui/shortcuts.ui:21 msgctxt "shortcut window" msgid "Quit" msgstr "Beenden" #: data/resources/ui/shortcuts.ui:29 msgctxt "shortcut window" msgid "Apps/Processes" msgstr "Apps/Prozesse" #: data/resources/ui/shortcuts.ui:32 msgctxt "shortcut window" msgid "Toggle Search Field" msgstr "Suchfeld anzeigen/ausblenden" #: data/resources/ui/shortcuts.ui:38 msgctxt "shortcut window" msgid "End App/Process" msgstr "Anwendung/Prozess beenden" #: data/resources/ui/shortcuts.ui:44 msgctxt "shortcut window" msgid "Kill App/Process" msgstr "Anwendung/Prozess abwürgen" #: data/resources/ui/shortcuts.ui:50 msgctxt "shortcut window" msgid "Halt App/Process" msgstr "Anwendung/Prozess anhalten" #: data/resources/ui/shortcuts.ui:56 msgctxt "shortcut window" msgid "Continue App/Process" msgstr "Anwendung/Prozess fortsetzen" #: data/resources/ui/shortcuts.ui:62 msgctxt "shortcut window" msgid "Show Information for App/Process" msgstr "Informationen für Anwendung/Prozess anzeigen" #: data/resources/ui/shortcuts.ui:68 msgctxt "shortcut window" msgid "Show Process Options" msgstr "Prozessoptionen anzeigen" #: data/resources/ui/window.ui:6 msgid "Preferences" msgstr "Einstellungen" #: data/resources/ui/window.ui:10 msgid "Keyboard Shortcuts" msgstr "Tastenkombinationen" #: data/resources/ui/window.ui:14 msgid "About Resources" msgstr "Über Ressourcen" #: data/resources/ui/window.ui:88 data/resources/ui/window.ui:128 msgid "Search" msgstr "Suchen" #: data/resources/ui/window.ui:90 data/resources/ui/window.ui:130 msgid "Toggle search field" msgstr "Suchfeld umschalten" #: src/application.rs:274 msgid "The Nalux Team" msgstr "Das Nalux-Team" #: src/application.rs:282 msgid "Report Issues" msgstr "Probleme melden" #. Translator credits. Replace "translator-credits" with your name/username, and optionally an email or URL. #. One name per line, please do not remove previous names. #: src/application.rs:288 msgid "translator-credits" msgstr "" "nokyan piekay\n" "Froschi " #: src/application.rs:289 msgid "Icon by" msgstr "Icon von" #: src/ui/dialogs/app_dialog.rs:155 src/ui/dialogs/process_dialog.rs:133 src/ui/dialogs/process_dialog.rs:137 #: src/ui/dialogs/process_dialog.rs:146 src/ui/dialogs/process_dialog.rs:148 #: src/ui/dialogs/process_dialog.rs:171 src/ui/dialogs/process_dialog.rs:178 #: src/ui/dialogs/process_dialog.rs:185 src/ui/dialogs/process_dialog.rs:192 #: src/ui/pages/applications/mod.rs:948 src/ui/pages/applications/mod.rs:1074 src/ui/pages/battery.rs:205 #: src/ui/pages/battery.rs:225 src/ui/pages/battery.rs:231 src/ui/pages/battery.rs:234 #: src/ui/pages/battery.rs:265 src/ui/pages/battery.rs:289 src/ui/pages/battery.rs:291 #: src/ui/pages/battery.rs:301 src/ui/pages/cpu.rs:243 src/ui/pages/cpu.rs:258 src/ui/pages/cpu.rs:278 #: src/ui/pages/cpu.rs:284 src/ui/pages/cpu.rs:290 src/ui/pages/cpu.rs:296 src/ui/pages/cpu.rs:300 #: src/ui/pages/cpu.rs:303 src/ui/pages/cpu.rs:341 src/ui/pages/cpu.rs:448 src/ui/pages/drive.rs:319 #: src/ui/pages/drive.rs:350 src/ui/pages/drive.rs:352 src/ui/pages/drive.rs:381 src/ui/pages/drive.rs:383 #: src/ui/pages/drive.rs:399 src/ui/pages/drive.rs:400 src/ui/pages/drive.rs:407 src/ui/pages/drive.rs:417 #: src/ui/pages/drive.rs:427 src/ui/pages/drive.rs:433 src/ui/pages/gpu.rs:245 src/ui/pages/gpu.rs:252 #: src/ui/pages/gpu.rs:297 src/ui/pages/gpu.rs:322 src/ui/pages/gpu.rs:325 src/ui/pages/gpu.rs:336 #: src/ui/pages/gpu.rs:377 src/ui/pages/gpu.rs:384 src/ui/pages/gpu.rs:396 src/ui/pages/gpu.rs:403 #: src/ui/pages/gpu.rs:407 src/ui/pages/gpu.rs:437 src/ui/pages/gpu.rs:443 src/ui/pages/memory.rs:227 #: src/ui/pages/memory.rs:228 src/ui/pages/memory.rs:232 src/ui/pages/memory.rs:233 src/ui/pages/memory.rs:237 #: src/ui/pages/memory.rs:238 src/ui/pages/memory.rs:266 src/ui/pages/memory.rs:327 src/ui/pages/network.rs:252 #: src/ui/pages/network.rs:259 src/ui/pages/network.rs:266 src/ui/pages/network.rs:272 #: src/ui/pages/network.rs:275 src/ui/pages/network.rs:285 src/ui/pages/network.rs:292 #: src/ui/pages/network.rs:302 src/ui/pages/network.rs:370 src/ui/pages/network.rs:373 #: src/ui/pages/network.rs:375 src/ui/pages/network.rs:404 src/ui/pages/network.rs:407 #: src/ui/pages/network.rs:409 src/ui/pages/network.rs:417 src/ui/pages/network.rs:424 #: src/ui/pages/network.rs:434 src/ui/pages/processes/mod.rs:1224 src/ui/pages/processes/mod.rs:1291 #: src/ui/pages/processes/mod.rs:1358 src/ui/pages/processes/mod.rs:1425 src/ui/pages/processes/mod.rs:1911 #: src/ui/pages/processes/mod.rs:1913 src/utils/battery.rs:152 src/utils/drive.rs:137 src/utils/gpu/mod.rs:279 #: src/utils/gpu/mod.rs:291 src/utils/link/mod.rs:61 src/utils/npu/mod.rs:244 src/utils/npu/mod.rs:250 msgid "N/A" msgstr "n. v." #: src/ui/dialogs/process_options_dialog.rs:147 src/ui/pages/cpu.rs:257 src/ui/pages/cpu.rs:417 #: src/ui/pages/cpu.rs:421 msgid "CPU {}" msgstr "CPU {}" #: src/ui/pages/applications/application_entry.rs:190 src/ui/pages/drive.rs:414 src/ui/pages/drive.rs:424 #: src/ui/pages/processes/process_entry.rs:211 msgid "No" msgstr "Nein" #: src/ui/pages/applications/application_entry.rs:191 src/ui/pages/processes/process_entry.rs:212 msgid "Yes (Flatpak)" msgstr "Ja (Flatpak)" #: src/ui/pages/applications/application_entry.rs:192 src/ui/pages/processes/process_entry.rs:213 msgid "Yes (Snap)" msgstr "Ja (Snap)" #: src/ui/pages/applications/mod.rs:660 msgid "Running Apps: {}" msgstr "Laufende Anwendungen: {}" #: src/ui/pages/applications/mod.rs:700 src/ui/pages/processes/mod.rs:862 msgid "Cancel" msgstr "Abbrechen" #: src/ui/pages/applications/mod.rs:746 msgid "App" msgstr "Anwendung" #: src/ui/pages/applications/mod.rs:1539 src/ui/pages/processes/mod.rs:2073 msgid "End {}?" msgstr "{} beenden?" #: src/ui/pages/applications/mod.rs:1540 src/ui/pages/processes/mod.rs:2074 msgid "Halt {}?" msgstr "{} anhalten?" #: src/ui/pages/applications/mod.rs:1541 src/ui/pages/processes/mod.rs:2075 msgid "Kill {}?" msgstr "{} abwürgen?" #: src/ui/pages/applications/mod.rs:1542 src/ui/pages/processes/mod.rs:2076 msgid "Continue {}?" msgstr "{} fortsetzen?" #: src/ui/pages/applications/mod.rs:1548 src/ui/pages/processes/mod.rs:2111 msgid "Unsaved work might be lost." msgstr "Ungespeicherte Daten könnten verloren gehen." #: src/ui/pages/applications/mod.rs:1550 msgid "" "Halting an app can come with serious risks such as losing data and security implications. Use with caution." msgstr "" "Das Anhalten einer Anwendung ist mit Risiken wie dem Verlust von Daten sowie Sicherheitsproblemen verbunden. " "Sie sollten vorsichtig sein." #: src/ui/pages/applications/mod.rs:1553 msgid "" "Killing an app can come with serious risks such as losing data and security implications. Use with caution." msgstr "" "Das Abwürgen einer Anwendung ist mit Risiken wie dem Verlust von Daten sowie Sicherheitsproblemen verbunden. " "Sie sollten vorsichtig sein." #: src/ui/pages/battery.rs:102 src/utils/battery.rs:258 msgid "Battery" msgstr "Akku" #: src/ui/pages/battery.rs:210 msgid "Battery Charge" msgstr "Akkuladung" #: src/ui/pages/battery.rs:279 src/ui/pages/cpu.rs:438 src/ui/pages/drive.rs:344 src/ui/pages/drive.rs:375 #: src/ui/pages/gpu.rs:429 src/ui/pages/network.rs:362 src/ui/pages/network.rs:396 msgid "Highest:" msgstr "Höchste:" #: src/ui/pages/cpu.rs:242 src/ui/pages/gpu.rs:212 msgid "Total Usage" msgstr "Gesamtauslastung" #: src/ui/pages/cpu.rs:271 src/ui/pages/gpu.rs:239 msgid "Temperature" msgstr "Temperatur" #: src/ui/pages/drive.rs:126 msgid "Drive" msgstr "Speicher" #: src/ui/pages/drive.rs:236 msgid "Drive Activity" msgstr "Speicheraktivität" #: src/ui/pages/drive.rs:243 msgid "Read Speed" msgstr "Lesegeschwindigkeit" #: src/ui/pages/drive.rs:247 msgid "Write Speed" msgstr "Schreibgeschwindigkeit" #: src/ui/pages/drive.rs:412 src/ui/pages/drive.rs:422 msgid "Yes" msgstr "Ja" #. Translators: This is an abbreviation for "Read" and "Write". This is displayed in the sidebar so your #. translation should preferably be quite short or an abbreviation #: src/ui/pages/drive.rs:440 msgid "R: {} · W: {}" msgstr "L: {} · S: {}" #: src/ui/pages/gpu.rs:220 msgid "Video Encoder/Decoder Usage" msgstr "Videokodierer/Videodekodierer" #: src/ui/pages/gpu.rs:226 msgid "Video Encoder Usage" msgstr "Videokodiererauslastung" #: src/ui/pages/gpu.rs:231 msgid "Video Decoder Usage" msgstr "Videodekodiererauslastung" #: src/ui/pages/gpu.rs:236 msgid "Video Memory Usage" msgstr "Grafikspeicherauslastung" #. Translators: This will be displayed in the sidebar, please try to keep your translation as short as (or even #. shorter than) 'Memory' #: src/ui/pages/gpu.rs:415 msgid "Memory: {}" msgstr "Speicher: {}" #: src/ui/pages/memory.rs:262 msgid "{} of {}" msgstr "{} von {}" #: src/ui/pages/memory.rs:265 msgid "{} MT/s" msgstr "{} MT/s" #. Translators: This will be displayed in the sidebar, so your translation for "Swap" should #. preferably be quite short or an abbreviation #: src/ui/pages/memory.rs:346 msgid "{} / {} · Swap: {} %" msgstr "{} / {} · Ausl.: {} %" #: src/ui/pages/network.rs:127 src/utils/network.rs:135 msgid "Network Interface" msgstr "Netzwerkschnittstelle" #: src/ui/pages/network.rs:241 msgid "Receiving" msgstr "Empfangen" #: src/ui/pages/network.rs:245 msgid "Sending" msgstr "Senden" #. Translators: This is an abbreviation for "Receive" and "Send". This is displayed in the sidebar so #. your translation should preferably be quite short or an abbreviation #: src/ui/pages/network.rs:445 msgid "R: {} · S: {}" msgstr "E: {} · S: {}" #: src/ui/pages/processes/mod.rs:813 msgid "Running Processes: {}" msgstr "Laufende Prozesse: {}" #: src/ui/pages/processes/mod.rs:911 msgid "Process" msgstr "Prozess" #: src/ui/pages/processes/mod.rs:2083 msgid "End process?" msgid_plural "End {} processes?" msgstr[0] "Prozess beenden?" msgstr[1] "{} Prozesse beenden?" #: src/ui/pages/processes/mod.rs:2089 msgid "Halt process?" msgid_plural "Halt {} processes?" msgstr[0] "Prozess anhalten?" msgstr[1] "{} Prozesse anhalten?" #: src/ui/pages/processes/mod.rs:2095 src/ui/pages/processes/mod.rs:2101 msgid "Kill process?" msgid_plural "Kill {} processes?" msgstr[0] "Prozess abwürgen?" msgstr[1] "{} Prozesse abwürgen?" #: src/ui/pages/processes/mod.rs:2113 msgid "" "Halting a process can come with serious risks such as losing data and security implications. Use with " "caution." msgstr "" "Das Anhalten eines Prozesses ist mit Risiken wie dem Verlust von Daten sowie Sicherheitsproblemen verbunden. " "Sie sollten vorsichtig sein." #: src/ui/pages/processes/mod.rs:2116 msgid "" "Killing a process can come with serious risks such as losing data and security implications. Use with " "caution." msgstr "" "Das Abwürgen eines Prozesses ist mit Risiken wie dem Verlust von Daten sowie Sicherheitsproblemen verbunden. " "Sie sollten vorsichtig sein." #: src/ui/window.rs:466 msgid "GPU {}" msgstr "GPU {}" #: src/ui/window.rs:496 msgid "NPU {}" msgstr "NPU {}" #: src/ui/window.rs:498 msgid "NPU" msgstr "NPU" #: src/ui/window.rs:1174 msgid "Successfully adjusted {}" msgstr "{} wurde erfolgreich angepasst" #: src/ui/window.rs:1175 msgid "There was a problem adjusting {}" msgstr "Es gab ein Problem beim Anpassen von {}" #: src/ui/window.rs:1257 msgid "Successfully ended {}" msgstr "{} wurde erfolgreich beendet" #: src/ui/window.rs:1258 msgid "Successfully halted {}" msgstr "{} wurde erfolgreich angehalten" #: src/ui/window.rs:1259 msgid "Successfully killed {}" msgstr "{} wurde erfolgreich abgewürgt" #: src/ui/window.rs:1260 msgid "Successfully continued {}" msgstr "{} wurde erfolgreich fortgesetzt" #: src/ui/window.rs:1267 msgid "Successfully ended the process" msgid_plural "Successfully ended {} processes" msgstr[0] "Prozess wurde erfolgreich beendet" msgstr[1] "{} Prozesse wurden erfolgreich beendet" #: src/ui/window.rs:1273 msgid "Successfully halted the process" msgid_plural "Successfully halted {} processes" msgstr[0] "Prozess wurde erfolgreich angehalten" msgstr[1] "{} Prozesse wurden erfolgreich angehalten" #: src/ui/window.rs:1279 msgid "Successfully killed the process" msgid_plural "Successfully killed {} processes" msgstr[0] "Prozess wurde erfolgreich abgewürgt" msgstr[1] "{} Prozesse wurden erfolgreich abgewürgt" #: src/ui/window.rs:1285 msgid "Successfully continued the process" msgid_plural "Successfully continued {} processes" msgstr[0] "Prozess wurde erfolgreich fortgesetzt" msgstr[1] "{} Prozesse wurden erfolgreich fortgesetzt" #: src/ui/window.rs:1296 msgid "There was a problem ending a process" msgid_plural "There were problems ending {} processes" msgstr[0] "Es gab ein Problem beim Beenden von {} Prozessen" msgstr[1] "Es gab ein Problem beim Beenden eines Prozesses" #: src/ui/window.rs:1302 msgid "There was a problem halting a process" msgid_plural "There were problems halting {} processes" msgstr[0] "Es gab ein Problem beim Anhalten von {} Prozessen" msgstr[1] "Es gab ein Problem beim Anhalten eines Prozesses" #: src/ui/window.rs:1308 msgid "There was a problem killing a process" msgid_plural "There were problems killing {} processes" msgstr[0] "Es gab ein Problem beim Abwürgen von {} Prozessen" msgstr[1] "Es gab ein Problem beim Abwürgen eines Prozesses" #: src/ui/window.rs:1314 msgid "There was a problem continuing a process" msgid_plural "There were problems continuing {} processes" msgstr[0] "Es gab ein Problem beim Fortsetzen von {} Prozessen" msgstr[1] "Es gab ein Problem beim Fortsetzen eines Prozesses" #: src/ui/window.rs:1324 msgid "There was a problem ending {}" msgstr "Es gab ein Problem beim Beenden von {}" #: src/ui/window.rs:1325 msgid "There was a problem halting {}" msgstr "Es gab ein Problem beim Anhalten von {}" #: src/ui/window.rs:1326 msgid "There was a problem killing {}" msgstr "Es gab ein Problem beim Abwürgen von {}" #: src/ui/window.rs:1327 msgid "There was a problem continuing {}" msgstr "Es gab ein Problem beim Fortsetzen von {}" #: src/utils/app.rs:222 msgid "System Processes" msgstr "Systemprozesse" #: src/utils/battery.rs:93 msgid "Charging" msgstr "Lädt" #: src/utils/battery.rs:94 msgid "Discharging" msgstr "Entlädt" #: src/utils/battery.rs:95 msgid "Empty" msgstr "Leer" #: src/utils/battery.rs:96 msgid "Full" msgstr "Voll" #: src/utils/battery.rs:97 msgid "Unknown" msgstr "Unbekannt" #: src/utils/battery.rs:143 msgid "Nickel-Metal Hydride" msgstr "Nickel-Metallhydrid" #: src/utils/battery.rs:144 msgid "Nickel-Cadmium" msgstr "Nickel-Cadmium" #: src/utils/battery.rs:145 msgid "Nickel-Zinc" msgstr "Nickel-Zink" #: src/utils/battery.rs:146 msgid "Lead-Acid" msgstr "Blei" #: src/utils/battery.rs:147 msgid "Lithium-Ion" msgstr "Lithium-Ionen" #: src/utils/battery.rs:148 msgid "Lithium Iron Phosphate" msgstr "Lithium-Eisenphosphat" #: src/utils/battery.rs:149 msgid "Lithium Polymer" msgstr "Lithium-Polymer" #: src/utils/battery.rs:151 msgid "Rechargeable Alkaline Managanese" msgstr "Wiederaufladbares Alkali-Mangan" #: src/utils/battery.rs:256 msgid "{} Battery" msgstr "{}-Akku" #: src/utils/units.rs:91 msgid "{} K" msgstr "{} K" #: src/utils/units.rs:93 msgid "{} °C" msgstr "{} °C" #: src/utils/units.rs:95 msgid "{} °F" msgstr "{} °F" #: src/utils/units.rs:113 src/utils/units.rs:127 src/utils/units.rs:147 src/utils/units.rs:161 msgid "{} B" msgstr "{} B" #: src/utils/units.rs:114 src/utils/units.rs:128 msgid "{} kB" msgstr "{} kB" #: src/utils/units.rs:115 src/utils/units.rs:129 msgid "{} MB" msgstr "{} MB" #: src/utils/units.rs:116 src/utils/units.rs:130 msgid "{} GB" msgstr "{} GB" #: src/utils/units.rs:117 src/utils/units.rs:131 msgid "{} TB" msgstr "{} TB" #: src/utils/units.rs:118 src/utils/units.rs:132 msgid "{} PB" msgstr "{} PB" #: src/utils/units.rs:119 src/utils/units.rs:133 msgid "{} EB" msgstr "{} EB" #: src/utils/units.rs:120 src/utils/units.rs:134 msgid "{} ZB" msgstr "{} ZB" #: src/utils/units.rs:121 src/utils/units.rs:135 msgid "{} YB" msgstr "{} YB" #: src/utils/units.rs:122 src/utils/units.rs:136 msgid "{} RB" msgstr "{} RB" #: src/utils/units.rs:123 src/utils/units.rs:137 msgid "{} QB" msgstr "{} QB" #: src/utils/units.rs:148 src/utils/units.rs:162 msgid "{} KiB" msgstr "{} KiB" #: src/utils/units.rs:149 src/utils/units.rs:163 msgid "{} MiB" msgstr "{} MiB" #: src/utils/units.rs:150 src/utils/units.rs:164 msgid "{} GiB" msgstr "{} GiB" #: src/utils/units.rs:151 src/utils/units.rs:165 msgid "{} TiB" msgstr "{} TiB" #: src/utils/units.rs:152 src/utils/units.rs:166 msgid "{} PiB" msgstr "{} PiB" #: src/utils/units.rs:153 src/utils/units.rs:167 msgid "{} EiB" msgstr "{} EiB" #: src/utils/units.rs:154 src/utils/units.rs:168 msgid "{} ZiB" msgstr "{} ZiB" #: src/utils/units.rs:155 src/utils/units.rs:169 msgid "{} YiB" msgstr "{} YiB" #: src/utils/units.rs:156 src/utils/units.rs:170 msgid "{} RiB" msgstr "{} RiB" #: src/utils/units.rs:157 src/utils/units.rs:171 msgid "{} QiB" msgstr "{} QiB" #: src/utils/units.rs:198 src/utils/units.rs:215 msgid "{} B/s" msgstr "{} B/s" #: src/utils/units.rs:199 msgid "{} kB/s" msgstr "{} kB/s" #: src/utils/units.rs:200 msgid "{} MB/s" msgstr "{} MB/s" #: src/utils/units.rs:201 msgid "{} GB/s" msgstr "{} GB/s" #: src/utils/units.rs:202 msgid "{} TB/s" msgstr "{} TB/s" #: src/utils/units.rs:203 msgid "{} PB/s" msgstr "{} PB/s" #: src/utils/units.rs:204 msgid "{} EB/s" msgstr "{} EB/s" #: src/utils/units.rs:205 msgid "{} ZB/s" msgstr "{} ZB/s" #: src/utils/units.rs:206 msgid "{} YB/s" msgstr "{} YB/s" #: src/utils/units.rs:207 msgid "{} RB/s" msgstr "{} RB/s" #: src/utils/units.rs:208 msgid "{} QB/s" msgstr "{} QB/s" #: src/utils/units.rs:216 msgid "{} KiB/s" msgstr "{} KiB/s" #: src/utils/units.rs:217 msgid "{} MiB/s" msgstr "{} MiB/s" #: src/utils/units.rs:218 msgid "{} GiB/s" msgstr "{} GiB/s" #: src/utils/units.rs:219 msgid "{} TiB/s" msgstr "{} TiB/s" #: src/utils/units.rs:220 msgid "{} PiB/s" msgstr "{} PiB/s" #: src/utils/units.rs:221 msgid "{} EiB/s" msgstr "{} EiB/s" #: src/utils/units.rs:222 msgid "{} ZiB/s" msgstr "{} ZiB/s" #: src/utils/units.rs:223 msgid "{} YiB/s" msgstr "{} YiB/s" #: src/utils/units.rs:224 msgid "{} RiB/s" msgstr "{} RiB/s" #: src/utils/units.rs:225 msgid "{} QiB/s" msgstr "{} QiB/s" #: src/utils/units.rs:239 src/utils/units.rs:256 msgid "{} b/s" msgstr "{} b/s" #: src/utils/units.rs:240 msgid "{} kb/s" msgstr "{} kb/s" #: src/utils/units.rs:241 msgid "{} Mb/s" msgstr "{} Mb/s" #: src/utils/units.rs:242 msgid "{} Gb/s" msgstr "{} Gb/s" #: src/utils/units.rs:243 msgid "{} Tb/s" msgstr "{} Tb/s" #: src/utils/units.rs:244 msgid "{} Pb/s" msgstr "{} Pb/s" #: src/utils/units.rs:245 msgid "{} Eb/s" msgstr "{} Eb/s" #: src/utils/units.rs:246 msgid "{} Zb/s" msgstr "{} Zb/s" #: src/utils/units.rs:247 msgid "{} Yb/s" msgstr "{} Yb/s" #: src/utils/units.rs:248 msgid "{} Rb/s" msgstr "{} Rb/s" #: src/utils/units.rs:249 msgid "{} Qb/s" msgstr "{} Qb/s" #: src/utils/units.rs:257 msgid "{} Kib/s" msgstr "{} Kib/s" #: src/utils/units.rs:258 msgid "{} Mib/s" msgstr "{} Mib/s" #: src/utils/units.rs:259 msgid "{} Gib/s" msgstr "{} Gib/s" #: src/utils/units.rs:260 msgid "{} Tib/s" msgstr "{} Tib/s" #: src/utils/units.rs:261 msgid "{} Pib/s" msgstr "{} Pib/s" #: src/utils/units.rs:262 msgid "{} Eib/s" msgstr "{} Eib/s" #: src/utils/units.rs:263 msgid "{} Zib/s" msgstr "{} Zib/s" #: src/utils/units.rs:264 msgid "{} Yib/s" msgstr "{} Yib/s" #: src/utils/units.rs:265 msgid "{} Rib/s" msgstr "{} Rib/s" #: src/utils/units.rs:266 msgid "{} Qib/s" msgstr "{} Qib/s" #: src/utils/units.rs:273 msgid "{} Hz" msgstr "{} Hz" #: src/utils/units.rs:274 msgid "{} kHz" msgstr "{} kHz" #: src/utils/units.rs:275 msgid "{} MHz" msgstr "{} MHz" #: src/utils/units.rs:276 msgid "{} GHz" msgstr "{} GHz" #: src/utils/units.rs:277 msgid "{} THz" msgstr "{} THz" #: src/utils/units.rs:278 msgid "{} PHz" msgstr "{} PHz" #: src/utils/units.rs:279 msgid "{} EHz" msgstr "{} EHz" #: src/utils/units.rs:280 msgid "{} ZHz" msgstr "{} ZHz" #: src/utils/units.rs:281 msgid "{} YHz" msgstr "{} YHz" #: src/utils/units.rs:282 msgid "{} RHz" msgstr "{} RHz" #: src/utils/units.rs:283 msgid "{} QHz" msgstr "{} QHz" #: src/utils/units.rs:290 msgid "{} W" msgstr "{} W" #: src/utils/units.rs:291 msgid "{} kW" msgstr "{} kW" #: src/utils/units.rs:292 msgid "{} MW" msgstr "{} MW" #: src/utils/units.rs:293 msgid "{} GW" msgstr "{} GW" #: src/utils/units.rs:294 msgid "{} TW" msgstr "{} TW" #: src/utils/units.rs:295 msgid "{} PW" msgstr "{} PW" #: src/utils/units.rs:296 msgid "{} EW" msgstr "{} EW" #: src/utils/units.rs:297 msgid "{} ZW" msgstr "{} ZW" #: src/utils/units.rs:298 msgid "{} YW" msgstr "{} YW" #: src/utils/units.rs:299 msgid "{} RW" msgstr "{} RW" #: src/utils/units.rs:300 msgid "{} QW" msgstr "{} QW" #: src/utils/units.rs:309 src/utils/units.rs:323 msgid "{} Wh" msgstr "{} Wh" #: src/utils/units.rs:310 src/utils/units.rs:324 msgid "{} kWh" msgstr "{} kWh" #: src/utils/units.rs:311 src/utils/units.rs:325 msgid "{} MWh" msgstr "{} MWh" #: src/utils/units.rs:312 src/utils/units.rs:326 msgid "{} GWh" msgstr "{} GWh" #: src/utils/units.rs:313 src/utils/units.rs:327 msgid "{} TWh" msgstr "{} TWh" #: src/utils/units.rs:314 src/utils/units.rs:328 msgid "{} PWh" msgstr "{} PWh" #: src/utils/units.rs:315 src/utils/units.rs:329 msgid "{} EWh" msgstr "{} EWh" #: src/utils/units.rs:316 src/utils/units.rs:330 msgid "{} ZWh" msgstr "{} ZWh" #: src/utils/units.rs:317 src/utils/units.rs:331 msgid "{} YWh" msgstr "{} YWh" #: src/utils/units.rs:318 src/utils/units.rs:332 msgid "{} RWh" msgstr "{} RWh" #: src/utils/units.rs:319 src/utils/units.rs:333 msgid "{} QWh" msgstr "{} QWh" #: src/utils/drive.rs:129 src/utils/drive.rs:208 msgid "CD/DVD/Blu-ray Drive" msgstr "CD/DVD/Blu-ray-Laufwerk" #: src/utils/drive.rs:130 msgid "eMMC Storage" msgstr "eMMC-Speicher" #: src/utils/drive.rs:131 msgid "Flash Storage" msgstr "Flash-Speicher" #: src/utils/drive.rs:132 src/utils/drive.rs:209 msgid "Floppy Drive" msgstr "Diskettenlaufwerk" #: src/utils/drive.rs:133 msgid "Hard Disk Drive" msgstr "Festplatte" #: src/utils/drive.rs:134 msgid "Loop Device" msgstr "Loop Device" #: src/utils/drive.rs:135 msgid "Mapped Device" msgstr "Mapped Device" #: src/utils/drive.rs:136 msgid "NVMe Drive" msgstr "NVMe-Speicher" #: src/utils/drive.rs:138 msgid "Software Raid" msgstr "Software-RAID" #: src/utils/drive.rs:139 msgid "RAM Disk" msgstr "RAM-Disk" #: src/utils/drive.rs:140 msgid "Solid State Drive" msgstr "Solid-State-Drive" #: src/utils/drive.rs:141 msgid "ZFS Volume" msgstr "ZFS-Datenträger" #: src/utils/drive.rs:142 msgid "Compressed RAM Disk (zram)" msgstr "Komprimierte RAM-Disk (zram)" #: src/utils/drive.rs:210 msgid "{} Loop Device" msgstr "{} Loop Device" #: src/utils/drive.rs:211 msgid "{} Mapped Device" msgstr "{} Mapped Device" #: src/utils/drive.rs:212 msgid "{} RAID" msgstr "{}-RAID" #: src/utils/drive.rs:213 msgid "{} RAM Disk" msgstr "{}-RAM-Disk" #: src/utils/drive.rs:214 msgid "{} zram Device" msgstr "{}-zram-Speicher" #: src/utils/drive.rs:215 msgid "{} ZFS Volume" msgstr "{}-ZFS-Volumen" #: src/utils/drive.rs:216 msgid "{} Drive" msgstr "{}-Datenträger" #: src/utils/network.rs:123 msgid "Bluetooth Tether" msgstr "Bluetooth-Tether" #: src/utils/network.rs:124 msgid "Network Bridge" msgstr "Netzwerk-Bridge" #: src/utils/network.rs:125 msgid "Ethernet Connection" msgstr "Ethernet-Verbindung" #: src/utils/network.rs:126 msgid "Docker Bridge" msgstr "Docker-Bridge" #: src/utils/network.rs:127 msgid "InfiniBand Connection" msgstr "InfiniBand-Verbindung" #: src/utils/network.rs:128 msgid "Serial Line IP Connection" msgstr "Serial-Line-IP-Verbindung" #: src/utils/network.rs:129 msgid "Virtual Ethernet Device" msgstr "Virtuelles Ethernet-Gerät" #: src/utils/network.rs:130 msgid "VM Network Bridge" msgstr "VM-Netzwerk-Bridge" #: src/utils/network.rs:131 msgid "VPN Tunnel" msgstr "VPN-Tunnel" #: src/utils/network.rs:132 msgid "VPN Tunnel (WireGuard)" msgstr "VPN-Tunnel (WireGuard)" #: src/utils/network.rs:133 msgid "Wi-Fi Connection" msgstr "WLAN-Verbindung" #: src/utils/network.rs:134 msgid "WWAN Connection" msgstr "WWAN-Verbindung" #~ msgid "Memory Usage" #~ msgstr "Speicherauslastung" #~ msgid "Show Search Fields on Launch" #~ msgstr "Alle Suchfelder beim Start anzeigen" #~ msgid "VRAM: {}" #~ msgstr "VRAM: {}" #~ msgid "Very High" #~ msgstr "Sehr hoch" #~ msgid "High" #~ msgstr "Hoch" #~ msgid "Normal" #~ msgstr "Normal" #~ msgid "Low" #~ msgstr "Niedrig" #~ msgid "Very Low" #~ msgstr "Sehr niedrig" #~ msgid "Very Slow" #~ msgstr "Sehr langsam" #~ msgid "Slow" #~ msgstr "Langsam" #~ msgid "Fast" #~ msgstr "Schnell" #~ msgid "Very Fast" #~ msgstr "Sehr schnell" #~ msgid "Unable to Apply Adjustment" #~ msgstr "Anpassung konnte nicht vorgenommen werden" #~ msgid "Please ensure that at least one CPU is enabled in the processor affinity." #~ msgstr "Bitte stellen Sie sicher, dass mindestens eine CPU in der Prozessoraffinität aktiviert ist." #~ msgid "Select All" #~ msgstr "Alle auswählen" #~ msgid "End app" #~ msgstr "Anwendung beenden" #~ msgid "Halt app" #~ msgstr "Anwendung anhalten" #~ msgid "Kill app" #~ msgstr "Anwendung abwürgen" #~ msgid "Continue app" #~ msgstr "Anwendung fortfahren" #~ msgid "End process" #~ msgstr "Prozess beenden" #~ msgid "Halt process" #~ msgstr "Prozess anhalten" #~ msgid "Kill process" #~ msgstr "Prozess abwürgen" #~ msgid "Continue process" #~ msgstr "Prozess fortsetzen" #~ msgid "Application" #~ msgstr "Anwendung" #~ msgid "Running Applications: {}" #~ msgstr "Laufende Anwendungen: {}" #~ msgid "" #~ "Resources allows you to check the utilization of your system resources and control your running processes " #~ "and applications. It’s designed to be user-friendly and feel right at home on a modern desktop by using " #~ "GNOME’s libadwaita." #~ msgstr "" #~ "Ressourcen ermöglicht es Ihnen, die Auslastung Ihrer Systemressourcen zu überwachen und Ihre laufenden " #~ "Prozesse und Anwendungen zu kontrollieren. Dank GNOMEs libadwaita ist Ressourcen einfach verständlich und " #~ "passt somit perfekt in einen modernen Desktop." #~ msgid "Applications" #~ msgstr "Anwendungen" #~ msgid "" #~ "Halting an application can come with serious risks such as losing data and security implications. Use " #~ "with caution." #~ msgstr "" #~ "Das Anhalten einer Anwendung ist mit Risiken wie dem Verlust von Daten sowie Sicherheitsproblemen " #~ "verbunden. Sie sollten vorsichtig sein." #~ msgid "" #~ "Killing an application can come with serious risks such as losing data and security implications. Use " #~ "with caution." #~ msgstr "" #~ "Das Abwürgen einer Anwendung ist mit Risiken wie dem Verlust von Daten sowie Sicherheitsproblemen " #~ "verbunden. Sie sollten vorsichtig sein." #~ msgid "End application" #~ msgstr "Anwendung beenden" #~ msgid "Halt application" #~ msgstr "Anwendung anhalten" #~ msgid "Kill application" #~ msgstr "Anwendung abwürgen" #~ msgid "Continue application" #~ msgstr "Anwendung fortfahren" #~ msgctxt "shortcut window" #~ msgid "End Application/Process" #~ msgstr "Anwendung/Prozess beenden" #~ msgctxt "shortcut window" #~ msgid "Kill Application/Process" #~ msgstr "Anwendung/Prozess abwürgen" #~ msgctxt "shortcut window" #~ msgid "Halt Application/Process" #~ msgstr "Anwendung/Prozess anhalten" #~ msgctxt "shortcut window" #~ msgid "Continue Application/Process" #~ msgstr "Anwendung/Prozess fortsetzen" #~ msgctxt "shortcut window" #~ msgid "Show Information for Application/Process" #~ msgstr "Informationen für Anwendung/Prozess anzeigen" #~ msgid "Application Information" #~ msgstr "Anwendungsinformationen" #~ msgid "Kill Application" #~ msgstr "Anwendung abwürgen" #~ msgid "Halt Application" #~ msgstr "Anwendung anhalten" #~ msgid "Continue Application" #~ msgstr "Anwendung fortsetzen" #~ msgid "End Application" #~ msgstr "Anwendung beenden" #~ msgid "root" #~ msgstr "root" #~ msgid "Current Power Cap" #~ msgstr "Derzeitige Leistungsbegrenzung" #~ msgid "Window width" #~ msgstr "Fensterbreite" #~ msgid "Window height" #~ msgstr "Fensterhöhe" #~ msgid "Window maximized state" #~ msgstr "Fenstermaximierung" #~ msgid "Temperature unit" #~ msgstr "Temperatureinheit" #~ msgid "Unit Prefix Base" #~ msgstr "Basiseinheit" #~ msgid "Show search field for Processes and Applications on launch" #~ msgstr "Suchfeld für Prozesse und Anwendungen beim Start anzeigen" #~ msgid "Show virtual block devices such as LVM containers" #~ msgstr "Virtuelle Datenträger, wie z.B. LVM-Container anzeigen" #~ msgid "Show virtual network interfaces such as Docker interfaces" #~ msgstr "Virtuelle Netzwerkschnittstellen, wie z.B. Docker-Schnittstellen anzeigen" #~ msgid "Show usage details in the sidebar" #~ msgstr "Auslastungsdetails in der Seitenleiste anzeigen" #~ msgid "Show device description in the sidebar" #~ msgstr "Gerätebeschreibungen in der Seitenleiste anzeigen" #~ msgid "Display network speeds in bits per second" #~ msgstr "Netzwerkgeschwindigkeiten in Bits pro Sekunde anzeigen" #~ msgid "Display memory usage in Applications view" #~ msgstr "Arbeitsspeichernutzung bei Anwendungen anzeigen" #~ msgid "Display CPU usage in Applications view" #~ msgstr "Prozessornutzung bei Anwendungen anzeigen" #~ msgid "Display drive read speed in Applications view" #~ msgstr "Lesegeschwindigkeit auf den Datenträgern bei Anwendungen anzeigen" #~ msgid "Display drive read total in Applications view" #~ msgstr "Insgesamt gelesene Datenmenge bei Anwendungen anzeigen" #~ msgid "Display drive write speed in Applications view" #~ msgstr "Schreibgeschwindigkeit auf den Datenträgern bei Anwendungen anzeigen" #~ msgid "Display drive write total in Applications view" #~ msgstr "Insgesamt geschriebene Datenmenge bei Anwendungen anzeigen" #~ msgid "Display GPU usage in Applications view" #~ msgstr "GPU-Auslastung bei Anwendungen anzeigen" #~ msgid "Display video encoder usage in Applications view" #~ msgstr "Videokodiererauslastung bei Anwendungen anzeigen" #~ msgid "Display video decoder usage in Applications view" #~ msgstr "Videodekodiererauslastung bei Anwendungen anzeigen" #~ msgid "Display GPU memory usage in Applications view" #~ msgstr "Grafikspeicherauslastung bei Anwendungen anzeigen" #~ msgid "Display process ID in Processes view" #~ msgstr "Prozess-ID bei Prozessen anzeigen" #~ msgid "Display user name in Processes view" #~ msgstr "Benutzernamen bei Prozessen anzeigen" #~ msgid "Display memory usage in Processes view" #~ msgstr "Arbeitsspeichernutzung bei Prozessen anzeigen" #~ msgid "Display CPU usage in Processes view" #~ msgstr "Prozessornutzung bei Prozessen anzeigen" #~ msgid "Display drive read speed in Processes view" #~ msgstr "Lesegeschwindigkeit auf den Datenträgern bei Prozessen anzeigen" #~ msgid "Display drive read total in Processes view" #~ msgstr "Insgesamt gelesene Datenmenge bei Prozessen anzeigen" #~ msgid "Display drive write speed in Processes view" #~ msgstr "Schreibgeschwindigkeit auf den Datenträgern bei Prozessen anzeigen" #~ msgid "Display drive write total in Processes view" #~ msgstr "Insgesamt geschriebene Datenmenge bei Prozessen anzeigen" #~ msgid "Display GPU usage in Processes view" #~ msgstr "GPU-Auslastung bei Prozessen anzeigen" #~ msgid "Display video encoder usage in Processes view" #~ msgstr "Videokodiererauslastung bei Prozessen anzeigen" #~ msgid "Display video decoder usage in Processes view" #~ msgstr "Videodekodiererauslastung bei Prozessen anzeigen" #~ msgid "Display GPU memory usage in Processes view" #~ msgstr "Grafikspeicherauslastung bei Prozessen anzeigen" #~ msgid "Display logical CPU graphs in Processor view" #~ msgstr "Nutzung der logischen CPUs auf der Prozessor-Seite anzeigen" #~ msgid "Show grids in graphs" #~ msgstr "Graphen in einem Raster anzeigen" #~ msgid "Amount of data points that should be shown in a graph" #~ msgstr "Menge an Datenpunkten, die in Graphen angezeigt werden" #~ msgid "GPU Usage" #~ msgstr "GPU-Auslastung" #~ msgid "Monitor your system resources and processes" #~ msgstr "Systemressourcen und Prozesse überwachen" #~ msgid "Show Network Speeds in Bits" #~ msgstr "Netzwerkgeschwindigkeiten in Bits pro Sekunde anzeigen" #~ msgid "Monitor your Resources and Processes" #~ msgstr "Ressourcen und Prozesse überwachen" #~ msgid "A simple yet powerful monitor for your system resources and processes." #~ msgstr "Ein einfacher und zugleich mächtiger Monitor für Systemressourcen und Prozesse." #~ msgid "{} {}B Drive" #~ msgstr "{}-{}B-Datenträger" resources-1.9.1/po/el.po000066400000000000000000001577121510634446000151320ustar00rootroot00000000000000# Greek translation for resources. # Copyright (C) 2025 resources's COPYRIGHT HOLDER # This file is distributed under the same license as the resources package. # Efstathios Iosifidis , 2025. # msgid "" msgstr "" "Project-Id-Version: resources main\n" "Report-Msgid-Bugs-To: https://github.com/nokyan/resources/issues/\n" "POT-Creation-Date: 2025-10-18 15:38+0000\n" "PO-Revision-Date: 2025-10-18 15:38+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Greek \n" "Language: el\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: data/net.nokyan.Resources.desktop.in.in:2 #: data/net.nokyan.Resources.metainfo.xml.in.in:4 #: data/resources/ui/window.ui:22 src/application.rs:272 msgid "Resources" msgstr "Πόροι" #. Translators: The summary should be 35 characters or less according to Flathub appstream guidelines #: data/net.nokyan.Resources.desktop.in.in:3 #: data/net.nokyan.Resources.metainfo.xml.in.in:5 msgid "Keep an eye on system resources" msgstr "Παρακολουθήστε τους πόρους του συστήματος" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/net.nokyan.Resources.desktop.in.in:9 msgid "System;Resources;Monitor;Processes;Usage;Task;Manager;CPU;RAM;Memory;GPU;" msgstr "System;Resources;Monitor;Processes;Usage;Task;Manager;CPU;RAM;Memory;GPU;" #: data/net.nokyan.Resources.metainfo.xml.in.in:17 msgid "" "Resources allows you to check the utilization of your system resources and " "control your running processes and apps. It’s designed to be user-friendly " "and feel right at home on a modern desktop by using GNOME’s libadwaita." msgstr "Το «Πόροι» σάς επιτρέπει να ελέγχετε τη χρήση των πόρων του συστήματός σας και να διαχειρίζεστε τις εκτελούμενες διεργασίες και εφαρμογές. Είναι σχεδιασμένο να είναι φιλικό προς το χρήστη και να ταιριάζει απόλυτα σε μια σύγχρονη επιφάνεια εργασίας χρησιμοποιώντας το libadwaita του GNOME." #: data/net.nokyan.Resources.metainfo.xml.in.in:20 msgid "Resources supports monitoring the following components:" msgstr "Το «Πόροι» υποστηρίζει την παρακολούθηση των ακόλουθων στοιχείων:" #: data/net.nokyan.Resources.metainfo.xml.in.in:24 msgid "CPU" msgstr "CPU" #: data/net.nokyan.Resources.metainfo.xml.in.in:25 #: data/resources/ui/dialogs/app_dialog.ui:82 #: data/resources/ui/dialogs/process_dialog.ui:64 #: data/resources/ui/dialogs/settings_dialog.ui:128 #: data/resources/ui/dialogs/settings_dialog.ui:220 #: data/resources/ui/window.ui:176 data/resources/ui/window.ui:183 #: src/ui/pages/applications/mod.rs:803 src/ui/pages/memory.rs:106 #: src/ui/pages/memory.rs:192 src/ui/pages/processes/mod.rs:1080 msgid "Memory" msgstr "Μνήμη" #: data/net.nokyan.Resources.metainfo.xml.in.in:26 #: data/resources/ui/dialogs/app_dialog.ui:140 #: data/resources/ui/dialogs/process_dialog.ui:118 #: data/resources/ui/dialogs/settings_dialog.ui:158 #: data/resources/ui/dialogs/settings_dialog.ui:250 #: src/ui/pages/applications/mod.rs:1181 src/ui/pages/gpu.rs:119 #: src/ui/pages/processes/mod.rs:1470 src/ui/window.rs:468 msgid "GPU" msgstr "GPU" #: data/net.nokyan.Resources.metainfo.xml.in.in:27 #: data/resources/ui/dialogs/settings_dialog.ui:324 msgid "Network Interfaces" msgstr "Διασυνδέσεις Δικτύου" #: data/net.nokyan.Resources.metainfo.xml.in.in:28 msgid "Storage Devices" msgstr "Συσκευές Αποθήκευσης" #: data/net.nokyan.Resources.metainfo.xml.in.in:29 msgid "Batteries" msgstr "Μπαταρίες" #: data/net.nokyan.Resources.metainfo.xml.in.in:51 msgid "Apps page in light theme" msgstr "Σελίδα εφαρμογών σε φωτεινό θέμα" #: data/net.nokyan.Resources.metainfo.xml.in.in:55 msgid "Processes page in dark theme" msgstr "Σελίδα διεργασιών σε σκούρο θέμα" #: data/net.nokyan.Resources.metainfo.xml.in.in:59 msgid "Processor page in light theme" msgstr "Σελίδα επεξεργαστή σε φωτεινό θέμα" #: data/net.nokyan.Resources.metainfo.xml.in.in:63 msgid "Memory page in dark theme" msgstr "Σελίδα μνήμης σε σκούρο θέμα" #: data/net.nokyan.Resources.metainfo.xml.in.in:67 msgid "GPU page in light theme" msgstr "Σελίδα GPU σε φωτεινό θέμα" #: data/net.nokyan.Resources.metainfo.xml.in.in:71 msgid "Drive page in dark theme" msgstr "Σελίδα δίσκου σε σκούρο θέμα" #: data/net.nokyan.Resources.metainfo.xml.in.in:75 msgid "Network Interface page in light theme" msgstr "Σελίδα διασύνδεσης δικτύου σε φωτεινό θέμα" #: data/net.nokyan.Resources.metainfo.xml.in.in:79 msgid "Battery page in dark theme" msgstr "Σελίδα μπαταρίας σε σκούρο θέμα" #: data/net.nokyan.Resources.policy.in.in:9 msgid "Control Process" msgstr "Έλεγχος Διεργασίας" #: data/net.nokyan.Resources.policy.in.in:10 msgid "" "Authentication is required to control superuser’s or other users’ processes" msgstr "Απαιτείται έλεγχος ταυτότητας για τον έλεγχο των διεργασιών του υπερχρήστη ή άλλων χρηστών" #: data/resources/ui/dialogs/app_dialog.ui:7 msgid "App Information" msgstr "Πληροφορίες Εφαρμογής" #: data/resources/ui/dialogs/app_dialog.ui:70 #: data/resources/ui/dialogs/process_dialog.ui:48 #: data/resources/ui/pages/battery.ui:22 data/resources/ui/pages/cpu.ui:37 #: data/resources/ui/pages/cpu.ui:50 data/resources/ui/pages/drive.ui:22 #: data/resources/ui/pages/gpu.ui:22 data/resources/ui/pages/memory.ui:31 #: data/resources/ui/pages/network.ui:22 data/resources/ui/pages/npu.ui:22 msgid "Usage" msgstr "Χρήση" #: data/resources/ui/dialogs/app_dialog.ui:73 #: data/resources/ui/dialogs/process_dialog.ui:55 #: data/resources/ui/dialogs/settings_dialog.ui:133 #: data/resources/ui/dialogs/settings_dialog.ui:225 #: data/resources/ui/window.ui:145 data/resources/ui/window.ui:152 #: src/ui/pages/applications/mod.rs:862 src/ui/pages/cpu.rs:128 #: src/ui/pages/processes/mod.rs:1139 src/ui/window.rs:290 msgid "Processor" msgstr "Επεξεργαστής" #: data/resources/ui/dialogs/app_dialog.ui:91 #: data/resources/ui/dialogs/process_dialog.ui:73 #: data/resources/ui/dialogs/settings_dialog.ui:178 #: data/resources/ui/dialogs/settings_dialog.ui:290 #: src/ui/pages/applications/mod.rs:1420 src/ui/pages/memory.rs:198 #: src/ui/pages/processes/mod.rs:1955 msgid "Swap" msgstr "Swap" #: data/resources/ui/dialogs/app_dialog.ui:100 #: data/resources/ui/dialogs/process_dialog.ui:78 #: data/resources/ui/dialogs/settings_dialog.ui:138 #: data/resources/ui/dialogs/settings_dialog.ui:230 #: src/ui/pages/applications/mod.rs:926 src/ui/pages/processes/mod.rs:1203 msgid "Drive Read" msgstr "Ανάγνωση Δίσκου" #: data/resources/ui/dialogs/app_dialog.ui:109 #: data/resources/ui/dialogs/process_dialog.ui:87 #: data/resources/ui/dialogs/settings_dialog.ui:143 #: data/resources/ui/dialogs/settings_dialog.ui:235 #: src/ui/pages/applications/mod.rs:991 src/ui/pages/processes/mod.rs:1270 msgid "Drive Read Total" msgstr "Συνολική Ανάγνωση Δίσκου" #: data/resources/ui/dialogs/app_dialog.ui:118 #: data/resources/ui/dialogs/process_dialog.ui:96 #: data/resources/ui/dialogs/settings_dialog.ui:148 #: data/resources/ui/dialogs/settings_dialog.ui:240 #: src/ui/pages/applications/mod.rs:1052 src/ui/pages/processes/mod.rs:1337 msgid "Drive Write" msgstr "Εγγραφή Δίσκου" #: data/resources/ui/dialogs/app_dialog.ui:127 #: data/resources/ui/dialogs/process_dialog.ui:105 #: data/resources/ui/dialogs/settings_dialog.ui:153 #: data/resources/ui/dialogs/settings_dialog.ui:245 #: src/ui/pages/applications/mod.rs:1119 src/ui/pages/processes/mod.rs:1404 msgid "Drive Write Total" msgstr "Συνολική Εγγραφή Δίσκου" #: data/resources/ui/dialogs/app_dialog.ui:149 #: data/resources/ui/dialogs/process_dialog.ui:127 #: data/resources/ui/dialogs/settings_dialog.ui:163 #: data/resources/ui/dialogs/settings_dialog.ui:255 #: src/ui/pages/applications/mod.rs:1361 src/ui/pages/processes/mod.rs:1651 msgid "Video Memory" msgstr "Μνήμη Βίντεο" #: data/resources/ui/dialogs/app_dialog.ui:158 #: data/resources/ui/dialogs/process_dialog.ui:136 #: data/resources/ui/dialogs/settings_dialog.ui:168 #: data/resources/ui/dialogs/settings_dialog.ui:260 #: src/ui/pages/applications/mod.rs:1240 src/ui/pages/processes/mod.rs:1529 msgid "Video Encoder" msgstr "Κωδικοποιητής Βίντεο" #: data/resources/ui/dialogs/app_dialog.ui:167 #: data/resources/ui/dialogs/process_dialog.ui:145 #: data/resources/ui/dialogs/settings_dialog.ui:173 #: data/resources/ui/dialogs/settings_dialog.ui:265 #: src/ui/pages/applications/mod.rs:1301 src/ui/pages/processes/mod.rs:1590 msgid "Video Decoder" msgstr "Αποκωδικοποιητής Βίντεο" #: data/resources/ui/dialogs/app_dialog.ui:174 #: data/resources/ui/dialogs/process_dialog.ui:179 #: data/resources/ui/pages/battery.ui:33 data/resources/ui/pages/cpu.ui:83 #: data/resources/ui/pages/drive.ui:54 data/resources/ui/pages/gpu.ui:74 #: data/resources/ui/pages/memory.ui:42 data/resources/ui/pages/network.ui:51 #: data/resources/ui/pages/npu.ui:68 msgid "Properties" msgstr "Ιδιότητες" #: data/resources/ui/dialogs/app_dialog.ui:180 msgid "ID" msgstr "Αναγνωριστικό" #: data/resources/ui/dialogs/app_dialog.ui:190 #: data/resources/ui/dialogs/process_dialog.ui:195 msgid "Running Since" msgstr "Σε Λειτουργία Από" #: data/resources/ui/dialogs/app_dialog.ui:198 msgid "Running Processes" msgstr "Εκτελούμενες Διεργασίες" #: data/resources/ui/dialogs/app_dialog.ui:207 #: data/resources/ui/dialogs/process_dialog.ui:231 msgid "Containerized" msgstr "Σε περιέκτη" #: data/resources/ui/dialogs/process_dialog.ui:7 msgid "Process Information" msgstr "Πληροφορίες Διεργασίας" #: data/resources/ui/dialogs/process_dialog.ui:154 #: data/resources/ui/dialogs/settings_dialog.ui:270 #: src/ui/pages/processes/mod.rs:1711 msgid "Total CPU Time" msgstr "Συνολικός Χρόνος CPU" #: data/resources/ui/dialogs/process_dialog.ui:163 #: data/resources/ui/dialogs/settings_dialog.ui:275 #: src/ui/pages/processes/mod.rs:1770 msgid "User CPU Time" msgstr "Χρόνος CPU Χρήστη" #: data/resources/ui/dialogs/process_dialog.ui:172 #: data/resources/ui/dialogs/settings_dialog.ui:280 #: src/ui/pages/processes/mod.rs:1829 msgid "System CPU Time" msgstr "Χρόνος CPU Συστήματος" #: data/resources/ui/dialogs/process_dialog.ui:186 #: data/resources/ui/dialogs/settings_dialog.ui:210 #: src/ui/pages/processes/mod.rs:973 msgid "Process ID" msgstr "Αναγνωριστικό Διεργασίας" #: data/resources/ui/dialogs/process_dialog.ui:204 #: data/resources/ui/dialogs/settings_dialog.ui:300 #: src/ui/pages/processes/mod.rs:2075 msgid "Commandline" msgstr "Γραμμή Εντολών" #: data/resources/ui/dialogs/process_dialog.ui:213 #: data/resources/ui/dialogs/settings_dialog.ui:215 #: src/ui/pages/processes/mod.rs:1026 msgid "User" msgstr "Χρήστης" #: data/resources/ui/dialogs/process_dialog.ui:222 msgid "Control Group" msgstr "Ομάδα Ελέγχου" #: data/resources/ui/dialogs/process_options_dialog.ui:7 #: data/resources/ui/dialogs/process_options_dialog.ui:69 msgid "Process Options" msgstr "Επιλογές Διεργασίας" #: data/resources/ui/dialogs/process_options_dialog.ui:29 msgid "Apply" msgstr "Εφαρμογή" #: data/resources/ui/dialogs/process_options_dialog.ui:72 msgid "Niceness" msgstr "Ευγένεια (Niceness)" #: data/resources/ui/dialogs/process_options_dialog.ui:73 msgid "" "The priority of a process is given by its niceness. A lower niceness value " "correspond to a higher priority." msgstr "Η προτεραιότητα μιας διεργασίας καθορίζεται από την «ευγένειά» της. Μια χαμηλότερη τιμή «ευγένειας» αντιστοιχεί σε υψηλότερη προτεραιότητα." #: data/resources/ui/dialogs/process_options_dialog.ui:87 #: data/resources/ui/dialogs/settings_dialog.ui:285 #: src/ui/pages/processes/mod.rs:1888 msgid "Priority" msgstr "Προτεραιότητα" #: data/resources/ui/dialogs/process_options_dialog.ui:91 msgctxt "process priority" msgid "Very High" msgstr "Πολύ Υψηλή" #: data/resources/ui/dialogs/process_options_dialog.ui:92 msgctxt "process priority" msgid "High" msgstr "Υψηλή" #: data/resources/ui/dialogs/process_options_dialog.ui:93 msgctxt "process priority" msgid "Normal" msgstr "Κανονική" #: data/resources/ui/dialogs/process_options_dialog.ui:94 msgctxt "process priority" msgid "Low" msgstr "Χαμηλή" #: data/resources/ui/dialogs/process_options_dialog.ui:95 msgctxt "process priority" msgid "Very Low" msgstr "Πολύ Χαμηλή" #: data/resources/ui/dialogs/process_options_dialog.ui:103 msgid "Processor Affinity" msgstr "Συσχέτιση Επεξεργαστή" #: data/resources/ui/dialogs/process_options_dialog.ui:108 msgid "Toggle All" msgstr "Εναλλαγή Όλων" #: data/resources/ui/dialogs/process_options_dialog.ui:111 msgid "Select which processor cores the process is allowed to run on" msgstr "Επιλέξτε σε ποιους πυρήνες του επεξεργαστή επιτρέπεται να εκτελείται η διεργασία" #: data/resources/ui/dialogs/settings_dialog.ui:7 msgid "General" msgstr "Γενικά" #: data/resources/ui/dialogs/settings_dialog.ui:10 msgid "Units" msgstr "Μονάδες" #: data/resources/ui/dialogs/settings_dialog.ui:13 msgid "Data Unit Prefix" msgstr "Πρόθεμα Μονάδας Δεδομένων" #: data/resources/ui/dialogs/settings_dialog.ui:17 msgid "Decimal" msgstr "Δεκαδικό" #: data/resources/ui/dialogs/settings_dialog.ui:18 msgid "Binary" msgstr "Δυαδικό" #: data/resources/ui/dialogs/settings_dialog.ui:26 msgid "Show Network Speeds in Bits per Second" msgstr "Εμφάνιση Ταχυτήτων Δικτύου σε Bits ανά Δευτερόλεπτο" #: data/resources/ui/dialogs/settings_dialog.ui:31 msgid "Temperature Unit" msgstr "Μονάδα Θερμοκρασίας" #: data/resources/ui/dialogs/settings_dialog.ui:35 msgid "Celsius" msgstr "Κελσίου" #: data/resources/ui/dialogs/settings_dialog.ui:36 msgid "Kelvin" msgstr "Κέλβιν" #: data/resources/ui/dialogs/settings_dialog.ui:37 msgid "Fahrenheit" msgstr "Φαρενάιτ" #: data/resources/ui/dialogs/settings_dialog.ui:47 msgid "User Interface" msgstr "Διεπαφή Χρήστη" #: data/resources/ui/dialogs/settings_dialog.ui:50 msgid "Refresh Speed" msgstr "Ταχύτητα Ανανέωσης" #: data/resources/ui/dialogs/settings_dialog.ui:51 msgid "Higher refresh speeds can lead to higher processor usage" msgstr "Οι υψηλότερες ταχύτητες ανανέωσης μπορεί να οδηγήσουν σε μεγαλύτερη χρήση του επεξεργαστή" #: data/resources/ui/dialogs/settings_dialog.ui:55 msgctxt "UI refresh speed" msgid "Very Slow" msgstr "Πολύ Αργή" #: data/resources/ui/dialogs/settings_dialog.ui:56 msgctxt "UI refresh speed" msgid "Slow" msgstr "Αργή" #: data/resources/ui/dialogs/settings_dialog.ui:57 msgctxt "UI refresh speed" msgid "Normal" msgstr "Κανονική" #: data/resources/ui/dialogs/settings_dialog.ui:58 msgctxt "UI refresh speed" msgid "Fast" msgstr "Γρήγορη" #: data/resources/ui/dialogs/settings_dialog.ui:59 msgctxt "UI refresh speed" msgid "Very Fast" msgstr "Πολύ Γρήγορη" #: data/resources/ui/dialogs/settings_dialog.ui:67 msgid "Show Graph Grids" msgstr "Εμφάνιση Πλέγματος Γραφημάτων" #: data/resources/ui/dialogs/settings_dialog.ui:72 msgid "Graph Data Points" msgstr "Σημεία Δεδομένων Γραφήματος" #: data/resources/ui/dialogs/settings_dialog.ui:86 msgid "Show Usage Details in Sidebar" msgstr "Εμφάνιση Λεπτομερειών Χρήσης στην Πλευρική Στήλη" #: data/resources/ui/dialogs/settings_dialog.ui:87 msgid "If enabled, the usage along with other information will be displayed" msgstr "Εάν ενεργοποιηθεί, θα εμφανίζεται η χρήση μαζί με άλλες πληροφορίες" #: data/resources/ui/dialogs/settings_dialog.ui:92 msgid "Show Device Descriptions in Sidebar" msgstr "Εμφάνιση Περιγραφών Συσκευών στην Πλευρική Στήλη" #: data/resources/ui/dialogs/settings_dialog.ui:93 msgid "" "If enabled, a device identifier like its name or device type will be " "displayed" msgstr "Εάν ενεργοποιηθεί, θα εμφανίζεται ένα αναγνωριστικό της συσκευής, όπως το όνομά της ή ο τύπος της" #: data/resources/ui/dialogs/settings_dialog.ui:98 msgid "Sidebar Meter Type" msgstr "Τύπος Μετρητή Πλευρικής Στήλης" #: data/resources/ui/dialogs/settings_dialog.ui:102 msgid "Bar" msgstr "Ράβδος" #: data/resources/ui/dialogs/settings_dialog.ui:103 msgid "Graph" msgstr "Γράφημα" #: data/resources/ui/dialogs/settings_dialog.ui:111 msgid "Normalize Processor Usage" msgstr "Κανονικοποίηση Χρήσης Επεξεργαστή" #: data/resources/ui/dialogs/settings_dialog.ui:112 msgid "" "If enabled, the total usage of all cores will be divided by the amount of " "cores" msgstr "Εάν ενεργοποιηθεί, η συνολική χρήση όλων των πυρήνων θα διαιρείται με τον αριθμό των πυρήνων" #: data/resources/ui/dialogs/settings_dialog.ui:122 #: data/resources/ui/window.ui:65 data/resources/ui/window.ui:72 #: src/ui/pages/applications/mod.rs:131 msgid "Apps" msgstr "Εφαρμογές" #: data/resources/ui/dialogs/settings_dialog.ui:125 #: data/resources/ui/dialogs/settings_dialog.ui:207 msgid "Information Columns" msgstr "Στήλες Πληροφοριών" #: data/resources/ui/dialogs/settings_dialog.ui:183 #: data/resources/ui/dialogs/settings_dialog.ui:295 #: src/ui/pages/applications/mod.rs:1479 src/ui/pages/processes/mod.rs:2014 msgid "Combined Memory" msgstr "Συνδυασμένη Μνήμη" #: data/resources/ui/dialogs/settings_dialog.ui:193 #: data/resources/ui/window.ui:105 data/resources/ui/window.ui:112 #: src/ui/pages/processes/mod.rs:175 msgid "Processes" msgstr "Διεργασίες" #: data/resources/ui/dialogs/settings_dialog.ui:196 #: data/resources/ui/pages/cpu.ui:22 data/resources/ui/pages/processes.ui:56 msgid "Options" msgstr "Επιλογές" #: data/resources/ui/dialogs/settings_dialog.ui:199 msgid "Show Niceness Values" msgstr "Εμφάνιση Τιμών Niceness" #: data/resources/ui/dialogs/settings_dialog.ui:200 msgid "" "Display priorities as niceness to allow for more fine-grained adjustments" msgstr "Εμφάνιση προτεραιοτήτων ως «ευγένεια» (niceness) για να επιτρέπονται πιο λεπτομερείς ρυθμίσεις" #: data/resources/ui/dialogs/settings_dialog.ui:310 msgid "Devices" msgstr "Συσκευές" #: data/resources/ui/dialogs/settings_dialog.ui:313 msgid "Drives" msgstr "Δίσκοι" #: data/resources/ui/dialogs/settings_dialog.ui:316 msgid "Show Virtual Drives" msgstr "Εμφάνιση Εικονικών Δίσκων" #: data/resources/ui/dialogs/settings_dialog.ui:317 msgid "Virtual drives are for example ZFS volumes or mapped devices" msgstr "Οι εικονικοί δίσκοι είναι για παράδειγμα τόμοι ZFS ή αντιστοιχισμένες συσκευές" #: data/resources/ui/dialogs/settings_dialog.ui:327 msgid "Show Virtual Network Interfaces" msgstr "Εμφάνιση Εικονικών Διασυνδέσεων Δικτύου" #: data/resources/ui/dialogs/settings_dialog.ui:328 msgid "Virtual network interfaces are for example bridges or VPN tunnels" msgstr "Οι εικονικές διασυνδέσεις δικτύου είναι για παράδειγμα γέφυρες ή σήραγγες VPN" #: data/resources/ui/pages/applications.ui:6 #: data/resources/ui/pages/applications.ui:26 #: src/ui/pages/applications/mod.rs:1563 msgid "Kill App" msgstr "Βίαιος Τερματισμός Εφαρμογής" #: data/resources/ui/pages/applications.ui:10 #: data/resources/ui/pages/applications.ui:30 #: src/ui/pages/applications/mod.rs:1562 msgid "Halt App" msgstr "Παύση Εφαρμογής" #: data/resources/ui/pages/applications.ui:14 #: data/resources/ui/pages/applications.ui:34 #: src/ui/pages/applications/mod.rs:1564 msgid "Continue App" msgstr "Συνέχιση Εφαρμογής" #: data/resources/ui/pages/applications.ui:22 #: data/resources/ui/pages/applications.ui:98 #: src/ui/pages/applications/mod.rs:1561 msgid "End App" msgstr "Τερματισμός Εφαρμογής" #: data/resources/ui/pages/applications.ui:40 #: data/resources/ui/pages/processes.ui:62 msgid "Information" msgstr "Πληροφορίες" #: data/resources/ui/pages/applications.ui:57 msgid "Search applications" msgstr "Αναζήτηση εφαρμογών" #: data/resources/ui/pages/applications.ui:87 #: data/resources/ui/pages/applications.ui:89 msgid "Show App Information" msgstr "Εμφάνιση Πληροφοριών Εφαρμογής" #: data/resources/ui/pages/battery.ui:36 msgid "Battery Health" msgstr "Υγεία Μπαταρίας" #: data/resources/ui/pages/battery.ui:45 msgid "Design Capacity" msgstr "Ονομαστική Χωρητικότητα" #: data/resources/ui/pages/battery.ui:54 msgid "Charge Cycles" msgstr "Κύκλοι Φόρτισης" #: data/resources/ui/pages/battery.ui:63 msgid "Technology" msgstr "Τεχνολογία" #: data/resources/ui/pages/battery.ui:72 data/resources/ui/pages/gpu.ui:81 #: data/resources/ui/pages/network.ui:58 data/resources/ui/pages/npu.ui:75 msgid "Manufacturer" msgstr "Κατασκευαστής" #: data/resources/ui/pages/battery.ui:81 msgid "Model Name" msgstr "Όνομα Μοντέλου" #: data/resources/ui/pages/battery.ui:90 data/resources/ui/pages/drive.ui:66 msgid "Device" msgstr "Συσκευή" #: data/resources/ui/pages/cpu.ui:26 msgid "Show Usages of Logical CPUs" msgstr "Εμφάνιση Χρήσης Λογικών CPU" #: data/resources/ui/pages/cpu.ui:75 data/resources/ui/pages/gpu.ui:66 #: data/resources/ui/pages/npu.ui:60 msgid "Sensors" msgstr "Αισθητήρες" #: data/resources/ui/pages/cpu.ui:90 msgid "Max Frequency" msgstr "Μέγιστη Συχνότητα" #: data/resources/ui/pages/cpu.ui:99 msgid "Logical Cores" msgstr "Λογικοί Πυρήνες" #: data/resources/ui/pages/cpu.ui:108 msgid "Physical Cores" msgstr "Φυσικοί Πυρήνες" #: data/resources/ui/pages/cpu.ui:117 msgid "Sockets" msgstr "Υποδοχές" #: data/resources/ui/pages/cpu.ui:126 msgid "Uptime" msgstr "Χρόνος Λειτουργίας" #: data/resources/ui/pages/cpu.ui:135 msgid "Virtualization" msgstr "Εικονοποίηση" #: data/resources/ui/pages/cpu.ui:144 msgid "Architecture" msgstr "Αρχιτεκτονική" #: data/resources/ui/pages/drive.ui:38 msgid "Total Read" msgstr "Συνολική Ανάγνωση" #: data/resources/ui/pages/drive.ui:47 msgid "Total Written" msgstr "Συνολική Εγγραφή" #: data/resources/ui/pages/drive.ui:57 data/resources/ui/pages/memory.ui:72 msgid "Type" msgstr "Τύπος" #: data/resources/ui/pages/drive.ui:75 msgid "Capacity" msgstr "Χωρητικότητα" #: data/resources/ui/pages/drive.ui:84 msgid "Writable" msgstr "Εγγράψιμος" #: data/resources/ui/pages/drive.ui:93 msgid "Removable" msgstr "Αφαιρούμενος" #. Translators: "Link" refers to something like "PCIe 4.0 ×16" #: data/resources/ui/pages/drive.ui:102 data/resources/ui/pages/gpu.ui:113 #: data/resources/ui/pages/network.ui:103 data/resources/ui/pages/npu.ui:107 msgid "Link" msgstr "Σύνδεση" #: data/resources/ui/pages/gpu.ui:37 msgid "GPU Frequency" msgstr "Συχνότητα GPU" #: data/resources/ui/pages/gpu.ui:50 msgid "Video Memory Frequency" msgstr "Συχνότητα Μνήμης Βίντεο" #: data/resources/ui/pages/gpu.ui:55 data/resources/ui/pages/npu.ui:49 #: src/ui/pages/battery.rs:217 msgid "Power Usage" msgstr "Κατανάλωση Ενέργειας" #: data/resources/ui/pages/gpu.ui:90 data/resources/ui/pages/npu.ui:84 msgid "PCI Slot" msgstr "Υποδοχή PCI" #: data/resources/ui/pages/gpu.ui:99 data/resources/ui/pages/network.ui:67 #: data/resources/ui/pages/npu.ui:93 msgid "Driver Used" msgstr "Χρησιμοποιούμενος Οδηγός" #: data/resources/ui/pages/gpu.ui:108 data/resources/ui/pages/npu.ui:102 msgid "Max Power Cap" msgstr "Μέγιστο Όριο Ισχύος" #: data/resources/ui/pages/memory.ui:9 msgid "You need to authenticate to see memory properties" msgstr "Πρέπει να γίνει έλεγχος ταυτότητας για να δείτε τις ιδιότητες μνήμης" #: data/resources/ui/pages/memory.ui:10 msgid "Authenticate" msgstr "Έλεγχος Ταυτότητας" #: data/resources/ui/pages/memory.ui:45 msgid "Slots Used" msgstr "Χρησιμοποιούμενες Υποδοχές" #: data/resources/ui/pages/memory.ui:54 msgid "Speed" msgstr "Ταχύτητα" #: data/resources/ui/pages/memory.ui:63 msgid "Form Factor" msgstr "Συντελεστής Μορφής" #: data/resources/ui/pages/memory.ui:81 msgid "Type Detail" msgstr "Λεπτομέρεια Τύπου" #: data/resources/ui/pages/network.ui:35 msgid "Total Received" msgstr "Συνολική Λήψη" #: data/resources/ui/pages/network.ui:44 msgid "Total Sent" msgstr "Συνολική Αποστολή" #: data/resources/ui/pages/network.ui:76 msgid "Interface" msgstr "Διασύνδεση" #: data/resources/ui/pages/network.ui:85 msgid "Hardware Address" msgstr "Διεύθυνση Υλικού" #: data/resources/ui/pages/network.ui:94 msgid "Network Name" msgstr "Όνομα Δικτύου" #: data/resources/ui/pages/network.ui:112 msgid "Link Speed" msgstr "Ταχύτητα Σύνδεσης" #: data/resources/ui/pages/npu.ui:31 msgid "NPU Frequency" msgstr "Συχνότητα NPU" #: data/resources/ui/pages/npu.ui:44 msgid "Memory Frequency" msgstr "Συχνότητα Μνήμης" #: data/resources/ui/pages/processes.ui:6 #: data/resources/ui/pages/processes.ui:42 src/ui/pages/processes/mod.rs:2184 msgid "Kill Process" msgstr "Βίαιος Τερματισμός Διεργασίας" #: data/resources/ui/pages/processes.ui:10 #: data/resources/ui/pages/processes.ui:46 src/ui/pages/processes/mod.rs:2183 msgid "Halt Process" msgstr "Παύση Διεργασίας" #: data/resources/ui/pages/processes.ui:14 #: data/resources/ui/pages/processes.ui:50 src/ui/pages/processes/mod.rs:2185 msgid "Continue Process" msgstr "Συνέχιση Διεργασίας" #: data/resources/ui/pages/processes.ui:22 #: data/resources/ui/pages/processes.ui:74 msgid "Kill Processes" msgstr "Βίαιος Τερματισμός Διεργασιών" #: data/resources/ui/pages/processes.ui:26 #: data/resources/ui/pages/processes.ui:78 msgid "Halt Processes" msgstr "Παύση Διεργασιών" #: data/resources/ui/pages/processes.ui:30 #: data/resources/ui/pages/processes.ui:82 msgid "Continue Processes" msgstr "Συνέχιση Διεργασιών" #: data/resources/ui/pages/processes.ui:38 #: data/resources/ui/pages/processes.ui:157 src/ui/pages/processes/mod.rs:524 #: src/ui/pages/processes/mod.rs:2182 msgid "End Process" msgstr "Τερματισμός Διεργασίας" #: data/resources/ui/pages/processes.ui:70 src/ui/pages/processes/mod.rs:528 msgid "End Processes" msgstr "Τερματισμός Διεργασιών" #: data/resources/ui/pages/processes.ui:103 msgid "Search processes" msgstr "Αναζήτηση διεργασιών" #: data/resources/ui/pages/processes.ui:133 #: data/resources/ui/pages/processes.ui:135 msgid "Show Process Options" msgstr "Εμφάνιση Επιλογών Διεργασίας" #: data/resources/ui/pages/processes.ui:146 #: data/resources/ui/pages/processes.ui:148 msgid "Show Process Information" msgstr "Εμφάνιση Πληροφοριών Διεργασίας" #: data/resources/ui/shortcuts.ui:6 msgctxt "shortcut window" msgid "General" msgstr "Γενικά" #: data/resources/ui/shortcuts.ui:9 msgctxt "shortcut window" msgid "Preferences" msgstr "Προτιμήσεις" #: data/resources/ui/shortcuts.ui:15 msgctxt "shortcut window" msgid "Show Shortcuts" msgstr "Εμφάνιση Συντομεύσεων" #: data/resources/ui/shortcuts.ui:21 msgctxt "shortcut window" msgid "Quit" msgstr "Έξοδος" #: data/resources/ui/shortcuts.ui:29 msgctxt "shortcut window" msgid "Apps/Processes" msgstr "Εφαρμογές/Διεργασίες" #: data/resources/ui/shortcuts.ui:32 msgctxt "shortcut window" msgid "Toggle Search Field" msgstr "Εναλλαγή Πεδίου Αναζήτησης" #: data/resources/ui/shortcuts.ui:38 msgctxt "shortcut window" msgid "End App/Process" msgstr "Τερματισμός Εφαρμογής/Διεργασίας" #: data/resources/ui/shortcuts.ui:44 msgctxt "shortcut window" msgid "Kill App/Process" msgstr "Βίαιος Τερματισμός Εφαρμογής/Διεργασίας" #: data/resources/ui/shortcuts.ui:50 msgctxt "shortcut window" msgid "Halt App/Process" msgstr "Παύση Εφαρμογής/Διεργασίας" #: data/resources/ui/shortcuts.ui:56 msgctxt "shortcut window" msgid "Continue App/Process" msgstr "Συνέχιση Εφαρμογής/Διεργασίας" #: data/resources/ui/shortcuts.ui:62 msgctxt "shortcut window" msgid "Show Information for App/Process" msgstr "Εμφάνιση Πληροφοριών για Εφαρμογή/Διεργασία" #: data/resources/ui/shortcuts.ui:68 msgctxt "shortcut window" msgid "Show Process Options" msgstr "Εμφάνιση Επιλογών Διεργασίας" #: data/resources/ui/window.ui:6 msgid "Preferences" msgstr "Προτιμήσεις" #: data/resources/ui/window.ui:10 msgid "Keyboard Shortcuts" msgstr "Συντομεύσεις Πληκτρολογίου" #: data/resources/ui/window.ui:14 msgid "About Resources" msgstr "Σχετικά με το «Πόροι»" #: data/resources/ui/window.ui:88 data/resources/ui/window.ui:128 msgid "Search" msgstr "Αναζήτηση" #: data/resources/ui/window.ui:90 data/resources/ui/window.ui:130 msgid "Toggle search field" msgstr "Εναλλαγή πεδίου αναζήτησης" #: src/application.rs:274 msgid "The Nalux Team" msgstr "The Nalux Team" #: src/application.rs:282 msgid "Report Issues" msgstr "Αναφορά Προβλημάτων" #. Translator credits. Replace "translator-credits" with your name/username, and optionally an email or URL. #. One name per line, please do not remove previous names. #: src/application.rs:288 msgid "translator-credits" msgstr "" #: src/application.rs:289 msgid "Icon by" msgstr "Εικονίδιο από" #: src/ui/dialogs/app_dialog.rs:155 src/ui/dialogs/process_dialog.rs:133 #: src/ui/dialogs/process_dialog.rs:137 src/ui/dialogs/process_dialog.rs:146 #: src/ui/dialogs/process_dialog.rs:148 src/ui/dialogs/process_dialog.rs:171 #: src/ui/dialogs/process_dialog.rs:178 src/ui/dialogs/process_dialog.rs:185 #: src/ui/dialogs/process_dialog.rs:192 src/ui/pages/applications/mod.rs:948 #: src/ui/pages/applications/mod.rs:1074 src/ui/pages/battery.rs:205 #: src/ui/pages/battery.rs:225 src/ui/pages/battery.rs:231 #: src/ui/pages/battery.rs:234 src/ui/pages/battery.rs:265 #: src/ui/pages/battery.rs:289 src/ui/pages/battery.rs:291 #: src/ui/pages/battery.rs:301 src/ui/pages/cpu.rs:243 src/ui/pages/cpu.rs:258 #: src/ui/pages/cpu.rs:278 src/ui/pages/cpu.rs:284 src/ui/pages/cpu.rs:290 #: src/ui/pages/cpu.rs:296 src/ui/pages/cpu.rs:300 src/ui/pages/cpu.rs:303 #: src/ui/pages/cpu.rs:341 src/ui/pages/cpu.rs:448 src/ui/pages/drive.rs:319 #: src/ui/pages/drive.rs:350 src/ui/pages/drive.rs:352 #: src/ui/pages/drive.rs:381 src/ui/pages/drive.rs:383 #: src/ui/pages/drive.rs:399 src/ui/pages/drive.rs:400 #: src/ui/pages/drive.rs:407 src/ui/pages/drive.rs:417 #: src/ui/pages/drive.rs:427 src/ui/pages/drive.rs:433 src/ui/pages/gpu.rs:245 #: src/ui/pages/gpu.rs:252 src/ui/pages/gpu.rs:297 src/ui/pages/gpu.rs:322 #: src/ui/pages/gpu.rs:325 src/ui/pages/gpu.rs:336 src/ui/pages/gpu.rs:377 #: src/ui/pages/gpu.rs:384 src/ui/pages/gpu.rs:396 src/ui/pages/gpu.rs:403 #: src/ui/pages/gpu.rs:407 src/ui/pages/gpu.rs:437 src/ui/pages/gpu.rs:443 #: src/ui/pages/memory.rs:227 src/ui/pages/memory.rs:228 #: src/ui/pages/memory.rs:232 src/ui/pages/memory.rs:233 #: src/ui/pages/memory.rs:237 src/ui/pages/memory.rs:238 #: src/ui/pages/memory.rs:266 src/ui/pages/memory.rs:327 #: src/ui/pages/network.rs:252 src/ui/pages/network.rs:259 #: src/ui/pages/network.rs:266 src/ui/pages/network.rs:272 #: src/ui/pages/network.rs:275 src/ui/pages/network.rs:285 #: src/ui/pages/network.rs:292 src/ui/pages/network.rs:302 #: src/ui/pages/network.rs:370 src/ui/pages/network.rs:373 #: src/ui/pages/network.rs:375 src/ui/pages/network.rs:404 #: src/ui/pages/network.rs:407 src/ui/pages/network.rs:409 #: src/ui/pages/network.rs:417 src/ui/pages/network.rs:424 #: src/ui/pages/network.rs:434 src/ui/pages/processes/mod.rs:1225 #: src/ui/pages/processes/mod.rs:1292 src/ui/pages/processes/mod.rs:1359 #: src/ui/pages/processes/mod.rs:1426 src/ui/pages/processes/mod.rs:1912 #: src/ui/pages/processes/mod.rs:1914 src/utils/battery.rs:152 #: src/utils/drive.rs:137 src/utils/gpu/mod.rs:279 src/utils/gpu/mod.rs:291 #: src/utils/link/mod.rs:61 src/utils/npu/mod.rs:244 src/utils/npu/mod.rs:250 msgid "N/A" msgstr "Δ/Υ" #: src/ui/dialogs/process_options_dialog.rs:147 src/ui/pages/cpu.rs:257 #: src/ui/pages/cpu.rs:417 src/ui/pages/cpu.rs:421 msgid "CPU {}" msgstr "CPU {}" #: src/ui/pages/applications/application_entry.rs:190 src/ui/pages/drive.rs:414 #: src/ui/pages/drive.rs:424 src/ui/pages/processes/process_entry.rs:211 msgid "No" msgstr "Όχι" #: src/ui/pages/applications/application_entry.rs:191 #: src/ui/pages/processes/process_entry.rs:212 msgid "Yes (Flatpak)" msgstr "Ναι (Flatpak)" #: src/ui/pages/applications/application_entry.rs:192 #: src/ui/pages/processes/process_entry.rs:213 msgid "Yes (Snap)" msgstr "Ναι (Snap)" #: src/ui/pages/applications/mod.rs:660 msgid "Running Apps: {}" msgstr "Εκτελούμενες Εφαρμογές: {}" #: src/ui/pages/applications/mod.rs:700 src/ui/pages/processes/mod.rs:863 msgid "Cancel" msgstr "Άκυρο" #: src/ui/pages/applications/mod.rs:746 msgid "App" msgstr "Εφαρμογή" #: src/ui/pages/applications/mod.rs:1539 src/ui/pages/processes/mod.rs:2131 msgid "End {}?" msgstr "Τερματισμός του {} ;" #: src/ui/pages/applications/mod.rs:1540 src/ui/pages/processes/mod.rs:2132 msgid "Halt {}?" msgstr "Παύση του {} ;" #: src/ui/pages/applications/mod.rs:1541 src/ui/pages/processes/mod.rs:2133 msgid "Kill {}?" msgstr "Βίαιος τερματισμός του {} ;" #: src/ui/pages/applications/mod.rs:1542 src/ui/pages/processes/mod.rs:2134 msgid "Continue {}?" msgstr "Συνέχιση του {} ;" #: src/ui/pages/applications/mod.rs:1548 src/ui/pages/processes/mod.rs:2169 msgid "Unsaved work might be lost." msgstr "Μη αποθηκευμένη εργασία μπορεί να χαθεί." #: src/ui/pages/applications/mod.rs:1550 msgid "" "Halting an app can come with serious risks such as losing data and security " "implications. Use with caution." msgstr "Η παύση μιας εφαρμογής μπορεί να ενέχει σοβαρούς κινδύνους, όπως απώλεια δεδομένων και επιπτώσεις στην ασφάλεια. Χρησιμοποιήστε με προσοχή." #: src/ui/pages/applications/mod.rs:1553 msgid "" "Killing an app can come with serious risks such as losing data and security " "implications. Use with caution." msgstr "Ο βίαιος τερματισμός μιας εφαρμογής μπορεί να ενέχει σοβαρούς κινδύνους, όπως απώλεια δεδομένων και επιπτώσεις στην ασφάλεια. Χρησιμοποιήστε με προσοχή." #: src/ui/pages/battery.rs:102 src/utils/battery.rs:258 msgid "Battery" msgstr "Μπαταρία" #: src/ui/pages/battery.rs:210 msgid "Battery Charge" msgstr "Φόρτιση Μπαταρίας" #: src/ui/pages/battery.rs:279 src/ui/pages/cpu.rs:438 #: src/ui/pages/drive.rs:344 src/ui/pages/drive.rs:375 src/ui/pages/gpu.rs:429 #: src/ui/pages/network.rs:362 src/ui/pages/network.rs:396 msgid "Highest:" msgstr "Υψηλότερο:" #: src/ui/pages/cpu.rs:242 src/ui/pages/gpu.rs:212 msgid "Total Usage" msgstr "Συνολική Χρήση" #: src/ui/pages/cpu.rs:271 src/ui/pages/gpu.rs:239 msgid "Temperature" msgstr "Θερμοκρασία" #: src/ui/pages/drive.rs:126 msgid "Drive" msgstr "Δίσκος" #: src/ui/pages/drive.rs:236 msgid "Drive Activity" msgstr "Δραστηριότητα Δίσκου" #: src/ui/pages/drive.rs:243 msgid "Read Speed" msgstr "Ταχύτητα Ανάγνωσης" #: src/ui/pages/drive.rs:247 msgid "Write Speed" msgstr "Ταχύτητα Εγγραφής" #: src/ui/pages/drive.rs:412 src/ui/pages/drive.rs:422 msgid "Yes" msgstr "Ναι" #. Translators: This is an abbreviation for "Read" and "Write". This is displayed in the sidebar so your #. translation should preferably be quite short or an abbreviation #: src/ui/pages/drive.rs:440 msgid "R: {} · W: {}" msgstr "Α: {} · Ε: {}" #: src/ui/pages/gpu.rs:220 msgid "Video Encoder/Decoder Usage" msgstr "Χρήση Κωδικοποιητή/Αποκωδικοποιητή Βίντεο" #: src/ui/pages/gpu.rs:226 msgid "Video Encoder Usage" msgstr "Χρήση Κωδικοποιητή Βίντεο" #: src/ui/pages/gpu.rs:231 msgid "Video Decoder Usage" msgstr "Χρήση Αποκωδικοποιητή Βίντεο" #: src/ui/pages/gpu.rs:236 msgid "Video Memory Usage" msgstr "Χρήση Μνήμης Βίντεο" #. Translators: This will be displayed in the sidebar, please try to keep your translation as short as (or even #. shorter than) 'Memory' #: src/ui/pages/gpu.rs:415 msgid "Memory: {}" msgstr "Μνήμη: {}" #: src/ui/pages/memory.rs:262 msgid "{} of {}" msgstr "{} από {}" #: src/ui/pages/memory.rs:265 msgid "{} MT/s" msgstr "{} MT/s" #. Translators: This will be displayed in the sidebar, so your translation for "Swap" should #. preferably be quite short or an abbreviation #: src/ui/pages/memory.rs:346 msgid "{} / {} · Swap: {} %" msgstr "{} / {} · Swap: {} %" #: src/ui/pages/network.rs:127 src/utils/network.rs:135 msgid "Network Interface" msgstr "Διασύνδεση Δικτύου" #: src/ui/pages/network.rs:241 msgid "Receiving" msgstr "Λήψη" #: src/ui/pages/network.rs:245 msgid "Sending" msgstr "Αποστολή" #. Translators: This is an abbreviation for "Receive" and "Send". This is displayed in the sidebar so #. your translation should preferably be quite short or an abbreviation #: src/ui/pages/network.rs:445 msgid "R: {} · S: {}" msgstr "Λ: {} · Α: {}" #: src/ui/pages/processes/mod.rs:814 msgid "Running Processes: {}" msgstr "Εκτελούμενες Διεργασίες: {}" #: src/ui/pages/processes/mod.rs:912 msgid "Process" msgstr "Διεργασία" #: src/ui/pages/processes/mod.rs:2141 msgid "End process?" msgid_plural "End {} processes?" msgstr[0] "Τερματισμός διεργασίας;" msgstr[1] "Τερματισμός {} διεργασιών;" #: src/ui/pages/processes/mod.rs:2147 msgid "Halt process?" msgid_plural "Halt {} processes?" msgstr[0] "Παύση διεργασίας;" msgstr[1] "Παύση {} διεργασιών;" #: src/ui/pages/processes/mod.rs:2153 src/ui/pages/processes/mod.rs:2159 msgid "Kill process?" msgid_plural "Kill {} processes?" msgstr[0] "Βίαιος τερματισμός διεργασίας;" msgstr[1] "Βίαιος τερματισμός {} διεργασιών;" #: src/ui/pages/processes/mod.rs:2171 msgid "" "Halting a process can come with serious risks such as losing data and " "security implications. Use with caution." msgstr "Η παύση μιας διεργασίας μπορεί να ενέχει σοβαρούς κινδύνους, όπως απώλεια δεδομένων και επιπτώσεις στην ασφάλεια. Χρησιμοποιήστε με προσοχή." #: src/ui/pages/processes/mod.rs:2174 msgid "" "Killing a process can come with serious risks such as losing data and " "security implications. Use with caution." msgstr "Ο βίαιος τερματισμός μιας διεργασίας μπορεί να ενέχει σοβαρούς κινδύνους, όπως απώλεια δεδομένων και επιπτώσεις στην ασφάλεια. Χρησιμοποιήστε με προσοχή." #: src/ui/window.rs:466 msgid "GPU {}" msgstr "GPU {}" #: src/ui/window.rs:496 msgid "NPU {}" msgstr "NPU {}" #: src/ui/window.rs:498 msgid "NPU" msgstr "NPU" #: src/ui/window.rs:1174 msgid "Successfully adjusted {}" msgstr "Επιτυχής προσαρμογή του {}" #: src/ui/window.rs:1175 msgid "There was a problem adjusting {}" msgstr "Παρουσιάστηκε πρόβλημα κατά την προσαρμογή του {}" #: src/ui/window.rs:1257 msgid "Successfully ended {}" msgstr "Επιτυχής τερματισμός του {}" #: src/ui/window.rs:1258 msgid "Successfully halted {}" msgstr "Επιτυχής παύση του {}" #: src/ui/window.rs:1259 msgid "Successfully killed {}" msgstr "Επιτυχής βίαιος τερματισμός του {}" #: src/ui/window.rs:1260 msgid "Successfully continued {}" msgstr "Επιτυχής συνέχιση του {}" #: src/ui/window.rs:1267 msgid "Successfully ended the process" msgid_plural "Successfully ended {} processes" msgstr[0] "Επιτυχής τερματισμός της διεργασίας" msgstr[1] "Επιτυχής τερματισμός {} διεργασιών" #: src/ui/window.rs:1273 msgid "Successfully halted the process" msgid_plural "Successfully halted {} processes" msgstr[0] "Επιτυχής παύση της διεργασίας" msgstr[1] "Επιτυχής παύση {} διεργασιών" #: src/ui/window.rs:1279 msgid "Successfully killed the process" msgid_plural "Successfully killed {} processes" msgstr[0] "Επιτυχής βίαιος τερματισμός της διεργασίας" msgstr[1] "Επιτυχής βίαιος τερματισμός {} διεργασιών" #: src/ui/window.rs:1285 msgid "Successfully continued the process" msgid_plural "Successfully continued {} processes" msgstr[0] "Επιτυχής συνέχιση της διεργασίας" msgstr[1] "Επιτυχής συνέχιση {} διεργασιών" #: src/ui/window.rs:1296 msgid "There was a problem ending a process" msgid_plural "There were problems ending {} processes" msgstr[0] "Παρουσιάστηκε πρόβλημα κατά τον τερματισμό μιας διεργασίας" msgstr[1] "Παρουσιάστηκαν προβλήματα κατά τον τερματισμό {} διεργασιών" #: src/ui/window.rs:1302 msgid "There was a problem halting a process" msgid_plural "There were problems halting {} processes" msgstr[0] "Παρουσιάστηκε πρόβλημα κατά την παύση μιας διεργασίας" msgstr[1] "Παρουσιάστηκαν προβλήματα κατά την παύση {} διεργασιών" #: src/ui/window.rs:1308 msgid "There was a problem killing a process" msgid_plural "There were problems killing {} processes" msgstr[0] "Παρουσιάστηκε πρόβλημα κατά τον βίαιο τερματισμό μιας διεργασίας" msgstr[1] "Παρουσιάστηκαν προβλήματα κατά τον βίαιο τερματισμό {} διεργασιών" #: src/ui/window.rs:1314 msgid "There was a problem continuing a process" msgid_plural "There were problems continuing {} processes" msgstr[0] "Παρουσιάστηκε πρόβλημα κατά τη συνέχιση μιας διεργασίας" msgstr[1] "Παρουσιάστηκαν προβλήματα κατά τη συνέχιση {} διεργασιών" #: src/ui/window.rs:1324 msgid "There was a problem ending {}" msgstr "Παρουσιάστηκε πρόβλημα κατά τον τερματισμό του {}" #: src/ui/window.rs:1325 msgid "There was a problem halting {}" msgstr "Παρουσιάστηκε πρόβλημα κατά την παύση του {}" #: src/ui/window.rs:1326 msgid "There was a problem killing {}" msgstr "Παρουσιάστηκε πρόβλημα κατά τον βίαιο τερματισμό του {}" #: src/ui/window.rs:1327 msgid "There was a problem continuing {}" msgstr "Παρουσιάστηκε πρόβλημα κατά τη συνέχιση του {}" #: src/utils/app.rs:222 msgid "System Processes" msgstr "Διεργασίες Συστήματος" #: src/utils/battery.rs:93 msgid "Charging" msgstr "Φόρτιση" #: src/utils/battery.rs:94 msgid "Discharging" msgstr "Εκφόρτιση" #: src/utils/battery.rs:95 msgid "Empty" msgstr "Άδεια" #: src/utils/battery.rs:96 msgid "Full" msgstr "Πλήρης" #: src/utils/battery.rs:97 msgid "Unknown" msgstr "Άγνωστο" #: src/utils/battery.rs:143 msgid "Nickel-Metal Hydride" msgstr "Νικελίου-Υδριδίου Μετάλλου" #: src/utils/battery.rs:144 msgid "Nickel-Cadmium" msgstr "Νικελίου-Καδμίου" #: src/utils/battery.rs:145 msgid "Nickel-Zinc" msgstr "Νικελίου-Ψευδαργύρου" #: src/utils/battery.rs:146 msgid "Lead-Acid" msgstr "Μολύβδου-Οξέος" #: src/utils/battery.rs:147 msgid "Lithium-Ion" msgstr "Ιόντων Λιθίου" #: src/utils/battery.rs:148 msgid "Lithium Iron Phosphate" msgstr "Φωσφορικού Σιδήρου Λιθίου" #: src/utils/battery.rs:149 msgid "Lithium Polymer" msgstr "Πολυμερών Λιθίου" #: src/utils/battery.rs:151 msgid "Rechargeable Alkaline Managanese" msgstr "Επαναφορτιζόμενη Αλκαλική Μαγγανίου" #: src/utils/battery.rs:256 msgid "{} Battery" msgstr "Μπαταρία {}" #: src/utils/units.rs:91 msgid "{} K" msgstr "{} K" #: src/utils/units.rs:93 msgid "{} °C" msgstr "{} °C" #: src/utils/units.rs:95 msgid "{} °F" msgstr "{} °F" #: src/utils/units.rs:113 src/utils/units.rs:127 src/utils/units.rs:147 #: src/utils/units.rs:161 msgid "{} B" msgstr "{} B" #: src/utils/units.rs:114 src/utils/units.rs:128 msgid "{} kB" msgstr "{} kB" #: src/utils/units.rs:115 src/utils/units.rs:129 msgid "{} MB" msgstr "{} MB" #: src/utils/units.rs:116 src/utils/units.rs:130 msgid "{} GB" msgstr "{} GB" #: src/utils/units.rs:117 src/utils/units.rs:131 msgid "{} TB" msgstr "{} TB" #: src/utils/units.rs:118 src/utils/units.rs:132 msgid "{} PB" msgstr "{} PB" #: src/utils/units.rs:119 src/utils/units.rs:133 msgid "{} EB" msgstr "{} EB" #: src/utils/units.rs:120 src/utils/units.rs:134 msgid "{} ZB" msgstr "{} ZB" #: src/utils/units.rs:121 src/utils/units.rs:135 msgid "{} YB" msgstr "{} YB" #: src/utils/units.rs:122 src/utils/units.rs:136 msgid "{} RB" msgstr "{} RB" #: src/utils/units.rs:123 src/utils/units.rs:137 msgid "{} QB" msgstr "{} QB" #: src/utils/units.rs:148 src/utils/units.rs:162 msgid "{} KiB" msgstr "{} KiB" #: src/utils/units.rs:149 src/utils/units.rs:163 msgid "{} MiB" msgstr "{} MiB" #: src/utils/units.rs:150 src/utils/units.rs:164 msgid "{} GiB" msgstr "{} GiB" #: src/utils/units.rs:151 src/utils/units.rs:165 msgid "{} TiB" msgstr "{} TiB" #: src/utils/units.rs:152 src/utils/units.rs:166 msgid "{} PiB" msgstr "{} PiB" #: src/utils/units.rs:153 src/utils/units.rs:167 msgid "{} EiB" msgstr "{} EiB" #: src/utils/units.rs:154 src/utils/units.rs:168 msgid "{} ZiB" msgstr "{} ZiB" #: src/utils/units.rs:155 src/utils/units.rs:169 msgid "{} YiB" msgstr "{} YiB" #: src/utils/units.rs:156 src/utils/units.rs:170 msgid "{} RiB" msgstr "{} RiB" #: src/utils/units.rs:157 src/utils/units.rs:171 msgid "{} QiB" msgstr "{} QiB" #: src/utils/units.rs:198 src/utils/units.rs:215 msgid "{} B/s" msgstr "{} B/s" #: src/utils/units.rs:199 msgid "{} kB/s" msgstr "{} kB/s" #: src/utils/units.rs:200 msgid "{} MB/s" msgstr "{} MB/s" #: src/utils/units.rs:201 msgid "{} GB/s" msgstr "{} GB/s" #: src/utils/units.rs:202 msgid "{} TB/s" msgstr "{} TB/s" #: src/utils/units.rs:203 msgid "{} PB/s" msgstr "{} PB/s" #: src/utils/units.rs:204 msgid "{} EB/s" msgstr "{} EB/s" #: src/utils/units.rs:205 msgid "{} ZB/s" msgstr "{} ZB/s" #: src/utils/units.rs:206 msgid "{} YB/s" msgstr "{} YB/s" #: src/utils/units.rs:207 msgid "{} RB/s" msgstr "{} RB/s" #: src/utils/units.rs:208 msgid "{} QB/s" msgstr "{} QB/s" #: src/utils/units.rs:216 msgid "{} KiB/s" msgstr "{} KiB/s" #: src/utils/units.rs:217 msgid "{} MiB/s" msgstr "{} MiB/s" #: src/utils/units.rs:218 msgid "{} GiB/s" msgstr "{} GiB/s" #: src/utils/units.rs:219 msgid "{} TiB/s" msgstr "{} TiB/s" #: src/utils/units.rs:220 msgid "{} PiB/s" msgstr "{} PiB/s" #: src/utils/units.rs:221 msgid "{} EiB/s" msgstr "{} EiB/s" #: src/utils/units.rs:222 msgid "{} ZiB/s" msgstr "{} ZiB/s" #: src/utils/units.rs:223 msgid "{} YiB/s" msgstr "{} YiB/s" #: src/utils/units.rs:224 msgid "{} RiB/s" msgstr "{} RiB/s" #: src/utils/units.rs:225 msgid "{} QiB/s" msgstr "{} QiB/s" #: src/utils/units.rs:239 src/utils/units.rs:256 msgid "{} b/s" msgstr "{} b/s" #: src/utils/units.rs:240 msgid "{} kb/s" msgstr "{} kb/s" #: src/utils/units.rs:241 msgid "{} Mb/s" msgstr "{} Mb/s" #: src/utils/units.rs:242 msgid "{} Gb/s" msgstr "{} Gb/s" #: src/utils/units.rs:243 msgid "{} Tb/s" msgstr "{} Tb/s" #: src/utils/units.rs:244 msgid "{} Pb/s" msgstr "{} Pb/s" #: src/utils/units.rs:245 msgid "{} Eb/s" msgstr "{} Eb/s" #: src/utils/units.rs:246 msgid "{} Zb/s" msgstr "{} Zb/s" #: src/utils/units.rs:247 msgid "{} Yb/s" msgstr "{} Yb/s" #: src/utils/units.rs:248 msgid "{} Rb/s" msgstr "{} Rb/s" #: src/utils/units.rs:249 msgid "{} Qb/s" msgstr "{} Qb/s" #: src/utils/units.rs:257 msgid "{} Kib/s" msgstr "{} Kib/s" #: src/utils/units.rs:258 msgid "{} Mib/s" msgstr "{} Mib/s" #: src/utils/units.rs:259 msgid "{} Gib/s" msgstr "{} Gib/s" #: src/utils/units.rs:260 msgid "{} Tib/s" msgstr "{} Tib/s" #: src/utils/units.rs:261 msgid "{} Pib/s" msgstr "{} Pib/s" #: src/utils/units.rs:262 msgid "{} Eib/s" msgstr "{} Eib/s" #: src/utils/units.rs:263 msgid "{} Zib/s" msgstr "{} Zib/s" #: src/utils/units.rs:264 msgid "{} Yib/s" msgstr "{} Yib/s" #: src/utils/units.rs:265 msgid "{} Rib/s" msgstr "{} Rib/s" #: src/utils/units.rs:266 msgid "{} Qib/s" msgstr "{} Qib/s" #: src/utils/units.rs:273 msgid "{} Hz" msgstr "{} Hz" #: src/utils/units.rs:274 msgid "{} kHz" msgstr "{} kHz" #: src/utils/units.rs:275 msgid "{} MHz" msgstr "{} MHz" #: src/utils/units.rs:276 msgid "{} GHz" msgstr "{} GHz" #: src/utils/units.rs:277 msgid "{} THz" msgstr "{} THz" #: src/utils/units.rs:278 msgid "{} PHz" msgstr "{} PHz" #: src/utils/units.rs:279 msgid "{} EHz" msgstr "{} EHz" #: src/utils/units.rs:280 msgid "{} ZHz" msgstr "{} ZHz" #: src/utils/units.rs:281 msgid "{} YHz" msgstr "{} YHz" #: src/utils/units.rs:282 msgid "{} RHz" msgstr "{} RHz" #: src/utils/units.rs:283 msgid "{} QHz" msgstr "{} QHz" #: src/utils/units.rs:290 msgid "{} W" msgstr "{} W" #: src/utils/units.rs:291 msgid "{} kW" msgstr "{} kW" #: src/utils/units.rs:292 msgid "{} MW" msgstr "{} MW" #: src/utils/units.rs:293 msgid "{} GW" msgstr "{} GW" #: src/utils/units.rs:294 msgid "{} TW" msgstr "{} TW" #: src/utils/units.rs:295 msgid "{} PW" msgstr "{} PW" #: src/utils/units.rs:296 msgid "{} EW" msgstr "{} EW" #: src/utils/units.rs:297 msgid "{} ZW" msgstr "{} ZW" #: src/utils/units.rs:298 msgid "{} YW" msgstr "{} YW" #: src/utils/units.rs:299 msgid "{} RW" msgstr "{} RW" #: src/utils/units.rs:300 msgid "{} QW" msgstr "{} QW" #: src/utils/units.rs:309 src/utils/units.rs:323 msgid "{} Wh" msgstr "{} Wh" #: src/utils/units.rs:310 src/utils/units.rs:324 msgid "{} kWh" msgstr "{} kWh" #: src/utils/units.rs:311 src/utils/units.rs:325 msgid "{} MWh" msgstr "{} MWh" #: src/utils/units.rs:312 src/utils/units.rs:326 msgid "{} GWh" msgstr "{} GWh" #: src/utils/units.rs:313 src/utils/units.rs:327 msgid "{} TWh" msgstr "{} TWh" #: src/utils/units.rs:314 src/utils/units.rs:328 msgid "{} PWh" msgstr "{} PWh" #: src/utils/units.rs:315 src/utils/units.rs:329 msgid "{} EWh" msgstr "{} EWh" #: src/utils/units.rs:316 src/utils/units.rs:330 msgid "{} ZWh" msgstr "{} ZWh" #: src/utils/units.rs:317 src/utils/units.rs:331 msgid "{} YWh" msgstr "{} YWh" #: src/utils/units.rs:318 src/utils/units.rs:332 msgid "{} RWh" msgstr "{} RWh" #: src/utils/units.rs:319 src/utils/units.rs:333 msgid "{} QWh" msgstr "{} QWh" #: src/utils/drive.rs:129 src/utils/drive.rs:208 msgid "CD/DVD/Blu-ray Drive" msgstr "Συσκευή CD/DVD/Blu-ray" #: src/utils/drive.rs:130 msgid "eMMC Storage" msgstr "Αποθηκευτικός Χώρος eMMC" #: src/utils/drive.rs:131 msgid "Flash Storage" msgstr "Αποθηκευτικός Χώρος Flash" #: src/utils/drive.rs:132 src/utils/drive.rs:209 msgid "Floppy Drive" msgstr "Συσκευή Δισκέτας" #: src/utils/drive.rs:133 msgid "Hard Disk Drive" msgstr "Σκληρός Δίσκος" #: src/utils/drive.rs:134 msgid "Loop Device" msgstr "Συσκευή Loop" #: src/utils/drive.rs:135 msgid "Mapped Device" msgstr "Αντιστοιχισμένη Συσκευή" #: src/utils/drive.rs:136 msgid "NVMe Drive" msgstr "Συσκευή NVMe" #: src/utils/drive.rs:138 msgid "Software Raid" msgstr "Λογισμικό Raid" #: src/utils/drive.rs:139 msgid "RAM Disk" msgstr "Δίσκος RAM" #: src/utils/drive.rs:140 msgid "Solid State Drive" msgstr "Συσκευή SSD" #: src/utils/drive.rs:141 msgid "ZFS Volume" msgstr "Τόμος ZFS" #: src/utils/drive.rs:142 msgid "Compressed RAM Disk (zram)" msgstr "Συμπιεσμένος Δίσκος RAM (zram)" #: src/utils/drive.rs:210 msgid "{} Loop Device" msgstr "Συσκευή Loop {}" #: src/utils/drive.rs:211 msgid "{} Mapped Device" msgstr "Αντιστοιχισμένη Συσκευή {}" #: src/utils/drive.rs:212 msgid "{} RAID" msgstr "RAID {}" #: src/utils/drive.rs:213 msgid "{} RAM Disk" msgstr "Δίσκος RAM {}" #: src/utils/drive.rs:214 msgid "{} zram Device" msgstr "Συσκευή zram {}" #: src/utils/drive.rs:215 msgid "{} ZFS Volume" msgstr "Τόμος ZFS {}" #: src/utils/drive.rs:216 msgid "{} Drive" msgstr "Συσκευή {}" #: src/utils/network.rs:123 msgid "Bluetooth Tether" msgstr "Σύνδεση Bluetooth" #: src/utils/network.rs:124 msgid "Network Bridge" msgstr "Γέφυρα Δικτύου" #: src/utils/network.rs:125 msgid "Ethernet Connection" msgstr "Σύνδεση Ethernet" #: src/utils/network.rs:126 msgid "Docker Bridge" msgstr "Γέφυρα Docker" #: src/utils/network.rs:127 msgid "InfiniBand Connection" msgstr "Σύνδεση InfiniBand" #: src/utils/network.rs:128 msgid "Serial Line IP Connection" msgstr "Σύνδεση IP Σειριακής Γραμμής" #: src/utils/network.rs:129 msgid "Virtual Ethernet Device" msgstr "Εικονική Συσκευή Ethernet" #: src/utils/network.rs:130 msgid "VM Network Bridge" msgstr "Γέφυρα Δικτύου Εικονικής Μηχανής" #: src/utils/network.rs:131 msgid "VPN Tunnel" msgstr "Σήραγγα VPN" #: src/utils/network.rs:132 msgid "VPN Tunnel (WireGuard)" msgstr "Σήραγγα VPN (WireGuard)" #: src/utils/network.rs:133 msgid "Wi-Fi Connection" msgstr "Σύνδεση Wi-Fi" #: src/utils/network.rs:134 msgid "WWAN Connection" msgstr "Σύνδεση WWAN" resources-1.9.1/po/en_GB.po000066400000000000000000001402731510634446000154760ustar00rootroot00000000000000# British English translation for resources. # Copyright (C) 2024 resources's COPYRIGHT HOLDER # This file is distributed under the same license as the resources package. # Bruce Cowan , 2024-2025. # msgid "" msgstr "" "Project-Id-Version: unnamed project\n" "Report-Msgid-Bugs-To: https://github.com/nokyan/resources/issues/\n" "POT-Creation-Date: 2025-10-24 15:39+0000\n" "PO-Revision-Date: 2025-10-24 19:28+0100\n" "Last-Translator: Bruce Cowan \n" "Language-Team: British English \n" "Language: en_GB\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Gtranslator 49.0\n" #: data/net.nokyan.Resources.desktop.in.in:2 #: data/net.nokyan.Resources.metainfo.xml.in.in:4 #: data/resources/ui/window.ui:22 src/application.rs:272 msgid "Resources" msgstr "Resources" #. Translators: The summary should be 35 characters or less according to Flathub appstream guidelines #: data/net.nokyan.Resources.desktop.in.in:3 #: data/net.nokyan.Resources.metainfo.xml.in.in:5 msgid "Keep an eye on system resources" msgstr "Keep an eye on system resources" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/net.nokyan.Resources.desktop.in.in:9 msgid "System;Resources;Monitor;Processes;Usage;Task;Manager;CPU;RAM;Memory;GPU;" msgstr "System;Resources;Monitor;Processes;Usage;Task;Manager;CPU;RAM;Memory;GPU;" #: data/net.nokyan.Resources.metainfo.xml.in.in:17 msgid "" "Resources allows you to check the utilization of your system resources and " "control your running processes and apps. It’s designed to be user-friendly " "and feel right at home on a modern desktop by using GNOME’s libadwaita." msgstr "" "Resources allows you to check the utilisation of your system resources and " "control your running processes and apps. It’s designed to be user-friendly " "and feel right at home on a modern desktop by using GNOME’s libadwaita." #: data/net.nokyan.Resources.metainfo.xml.in.in:20 msgid "Resources supports monitoring the following components:" msgstr "Resources supports monitoring the following components:" #: data/net.nokyan.Resources.metainfo.xml.in.in:24 msgid "CPU" msgstr "CPU" #: data/net.nokyan.Resources.metainfo.xml.in.in:25 #: data/resources/ui/dialogs/app_dialog.ui:82 #: data/resources/ui/dialogs/process_dialog.ui:64 #: data/resources/ui/dialogs/settings_dialog.ui:128 #: data/resources/ui/dialogs/settings_dialog.ui:220 #: data/resources/ui/window.ui:176 data/resources/ui/window.ui:183 #: src/ui/pages/applications/mod.rs:803 src/ui/pages/memory.rs:106 #: src/ui/pages/memory.rs:192 src/ui/pages/processes/mod.rs:1080 msgid "Memory" msgstr "Memory" #: data/net.nokyan.Resources.metainfo.xml.in.in:26 #: data/resources/ui/dialogs/app_dialog.ui:140 #: data/resources/ui/dialogs/process_dialog.ui:118 #: data/resources/ui/dialogs/settings_dialog.ui:158 #: data/resources/ui/dialogs/settings_dialog.ui:250 #: src/ui/pages/applications/mod.rs:1181 src/ui/pages/gpu.rs:119 #: src/ui/pages/processes/mod.rs:1470 src/ui/window.rs:468 msgid "GPU" msgstr "GPU" #: data/net.nokyan.Resources.metainfo.xml.in.in:27 #: data/resources/ui/dialogs/settings_dialog.ui:324 msgid "Network Interfaces" msgstr "Network Interfaces" #: data/net.nokyan.Resources.metainfo.xml.in.in:28 msgid "Storage Devices" msgstr "Storage Devices" #: data/net.nokyan.Resources.metainfo.xml.in.in:29 msgid "Batteries" msgstr "Batteries" #: data/net.nokyan.Resources.metainfo.xml.in.in:51 msgid "Apps page in light theme" msgstr "Apps page in light theme" #: data/net.nokyan.Resources.metainfo.xml.in.in:55 msgid "Processes page in dark theme" msgstr "Processes page in dark theme" #: data/net.nokyan.Resources.metainfo.xml.in.in:59 msgid "Processor page in light theme" msgstr "Processor page in light theme" #: data/net.nokyan.Resources.metainfo.xml.in.in:63 msgid "Memory page in dark theme" msgstr "Memory page in dark theme" #: data/net.nokyan.Resources.metainfo.xml.in.in:67 msgid "GPU page in light theme" msgstr "GPU page in light theme" #: data/net.nokyan.Resources.metainfo.xml.in.in:71 msgid "Drive page in dark theme" msgstr "Drive page in dark theme" #: data/net.nokyan.Resources.metainfo.xml.in.in:75 msgid "Network Interface page in light theme" msgstr "Network Interface page in light theme" #: data/net.nokyan.Resources.metainfo.xml.in.in:79 msgid "Battery page in dark theme" msgstr "Battery page in dark theme" #: data/net.nokyan.Resources.policy.in.in:9 msgid "Control Process" msgstr "Control Process" #: data/net.nokyan.Resources.policy.in.in:10 msgid "" "Authentication is required to control superuser’s or other users’ processes" msgstr "" "Authentication is required to control superuser’s or other users’ processes" #: data/resources/ui/dialogs/app_dialog.ui:7 msgid "App Information" msgstr "App Information" #: data/resources/ui/dialogs/app_dialog.ui:70 #: data/resources/ui/dialogs/process_dialog.ui:48 #: data/resources/ui/pages/battery.ui:22 data/resources/ui/pages/cpu.ui:37 #: data/resources/ui/pages/cpu.ui:50 data/resources/ui/pages/drive.ui:22 #: data/resources/ui/pages/gpu.ui:22 data/resources/ui/pages/memory.ui:31 #: data/resources/ui/pages/network.ui:22 data/resources/ui/pages/npu.ui:22 msgid "Usage" msgstr "Usage" #: data/resources/ui/dialogs/app_dialog.ui:73 #: data/resources/ui/dialogs/process_dialog.ui:55 #: data/resources/ui/dialogs/settings_dialog.ui:133 #: data/resources/ui/dialogs/settings_dialog.ui:225 #: data/resources/ui/window.ui:145 data/resources/ui/window.ui:152 #: src/ui/pages/applications/mod.rs:862 src/ui/pages/cpu.rs:128 #: src/ui/pages/processes/mod.rs:1139 src/ui/window.rs:290 msgid "Processor" msgstr "Processor" #: data/resources/ui/dialogs/app_dialog.ui:91 #: data/resources/ui/dialogs/process_dialog.ui:73 #: data/resources/ui/dialogs/settings_dialog.ui:178 #: data/resources/ui/dialogs/settings_dialog.ui:290 #: src/ui/pages/applications/mod.rs:1420 src/ui/pages/memory.rs:198 #: src/ui/pages/processes/mod.rs:1955 msgid "Swap" msgstr "Swap" #: data/resources/ui/dialogs/app_dialog.ui:100 #: data/resources/ui/dialogs/process_dialog.ui:78 #: data/resources/ui/dialogs/settings_dialog.ui:138 #: data/resources/ui/dialogs/settings_dialog.ui:230 #: src/ui/pages/applications/mod.rs:926 src/ui/pages/processes/mod.rs:1203 msgid "Drive Read" msgstr "Drive Read" #: data/resources/ui/dialogs/app_dialog.ui:109 #: data/resources/ui/dialogs/process_dialog.ui:87 #: data/resources/ui/dialogs/settings_dialog.ui:143 #: data/resources/ui/dialogs/settings_dialog.ui:235 #: src/ui/pages/applications/mod.rs:991 src/ui/pages/processes/mod.rs:1270 msgid "Drive Read Total" msgstr "Drive Read Total" #: data/resources/ui/dialogs/app_dialog.ui:118 #: data/resources/ui/dialogs/process_dialog.ui:96 #: data/resources/ui/dialogs/settings_dialog.ui:148 #: data/resources/ui/dialogs/settings_dialog.ui:240 #: src/ui/pages/applications/mod.rs:1052 src/ui/pages/processes/mod.rs:1337 msgid "Drive Write" msgstr "Drive Write" #: data/resources/ui/dialogs/app_dialog.ui:127 #: data/resources/ui/dialogs/process_dialog.ui:105 #: data/resources/ui/dialogs/settings_dialog.ui:153 #: data/resources/ui/dialogs/settings_dialog.ui:245 #: src/ui/pages/applications/mod.rs:1119 src/ui/pages/processes/mod.rs:1404 msgid "Drive Write Total" msgstr "Drive Write Total" #: data/resources/ui/dialogs/app_dialog.ui:149 #: data/resources/ui/dialogs/process_dialog.ui:127 #: data/resources/ui/dialogs/settings_dialog.ui:163 #: data/resources/ui/dialogs/settings_dialog.ui:255 #: src/ui/pages/applications/mod.rs:1361 src/ui/pages/processes/mod.rs:1651 msgid "Video Memory" msgstr "Video Memory" #: data/resources/ui/dialogs/app_dialog.ui:158 #: data/resources/ui/dialogs/process_dialog.ui:136 #: data/resources/ui/dialogs/settings_dialog.ui:168 #: data/resources/ui/dialogs/settings_dialog.ui:260 #: src/ui/pages/applications/mod.rs:1240 src/ui/pages/processes/mod.rs:1529 msgid "Video Encoder" msgstr "Video Encoder" #: data/resources/ui/dialogs/app_dialog.ui:167 #: data/resources/ui/dialogs/process_dialog.ui:145 #: data/resources/ui/dialogs/settings_dialog.ui:173 #: data/resources/ui/dialogs/settings_dialog.ui:265 #: src/ui/pages/applications/mod.rs:1301 src/ui/pages/processes/mod.rs:1590 msgid "Video Decoder" msgstr "Video Decoder" #: data/resources/ui/dialogs/app_dialog.ui:174 #: data/resources/ui/dialogs/process_dialog.ui:179 #: data/resources/ui/pages/battery.ui:33 data/resources/ui/pages/cpu.ui:83 #: data/resources/ui/pages/drive.ui:54 data/resources/ui/pages/gpu.ui:74 #: data/resources/ui/pages/memory.ui:42 data/resources/ui/pages/network.ui:51 #: data/resources/ui/pages/npu.ui:68 msgid "Properties" msgstr "Properties" #: data/resources/ui/dialogs/app_dialog.ui:180 msgid "ID" msgstr "ID" #: data/resources/ui/dialogs/app_dialog.ui:190 #: data/resources/ui/dialogs/process_dialog.ui:195 msgid "Running Since" msgstr "Running Since" #: data/resources/ui/dialogs/app_dialog.ui:198 msgid "Running Processes" msgstr "Running Processes" #: data/resources/ui/dialogs/app_dialog.ui:207 #: data/resources/ui/dialogs/process_dialog.ui:231 msgid "Containerized" msgstr "Containerised" #: data/resources/ui/dialogs/process_dialog.ui:7 msgid "Process Information" msgstr "Process Information" #: data/resources/ui/dialogs/process_dialog.ui:154 #: data/resources/ui/dialogs/settings_dialog.ui:270 #: src/ui/pages/processes/mod.rs:1711 msgid "Total CPU Time" msgstr "Total CPU Time" #: data/resources/ui/dialogs/process_dialog.ui:163 #: data/resources/ui/dialogs/settings_dialog.ui:275 #: src/ui/pages/processes/mod.rs:1770 msgid "User CPU Time" msgstr "User CPU Time" #: data/resources/ui/dialogs/process_dialog.ui:172 #: data/resources/ui/dialogs/settings_dialog.ui:280 #: src/ui/pages/processes/mod.rs:1829 msgid "System CPU Time" msgstr "System CPU Time" #: data/resources/ui/dialogs/process_dialog.ui:186 #: data/resources/ui/dialogs/settings_dialog.ui:210 #: src/ui/pages/processes/mod.rs:973 msgid "Process ID" msgstr "Process ID" #: data/resources/ui/dialogs/process_dialog.ui:204 #: data/resources/ui/dialogs/settings_dialog.ui:300 #: src/ui/pages/processes/mod.rs:2075 msgid "Commandline" msgstr "Commandline" #: data/resources/ui/dialogs/process_dialog.ui:213 #: data/resources/ui/dialogs/settings_dialog.ui:215 #: src/ui/pages/processes/mod.rs:1026 msgid "User" msgstr "User" #: data/resources/ui/dialogs/process_dialog.ui:222 msgid "Control Group" msgstr "Control Group" #: data/resources/ui/dialogs/process_options_dialog.ui:7 #: data/resources/ui/dialogs/process_options_dialog.ui:69 msgid "Process Options" msgstr "Process Options" #: data/resources/ui/dialogs/process_options_dialog.ui:29 msgid "Apply" msgstr "Apply" #: data/resources/ui/dialogs/process_options_dialog.ui:72 msgid "Niceness" msgstr "Niceness" #: data/resources/ui/dialogs/process_options_dialog.ui:73 msgid "" "The priority of a process is given by its niceness. A lower niceness value " "correspond to a higher priority." msgstr "" "The priority of a process is given by its niceness. A lower niceness value " "correspond to a higher priority." #: data/resources/ui/dialogs/process_options_dialog.ui:87 #: data/resources/ui/dialogs/settings_dialog.ui:285 #: src/ui/pages/processes/mod.rs:1888 msgid "Priority" msgstr "Priority" #: data/resources/ui/dialogs/process_options_dialog.ui:91 msgctxt "process priority" msgid "Very High" msgstr "Very High" #: data/resources/ui/dialogs/process_options_dialog.ui:92 msgctxt "process priority" msgid "High" msgstr "High" #: data/resources/ui/dialogs/process_options_dialog.ui:93 msgctxt "process priority" msgid "Normal" msgstr "Normal" #: data/resources/ui/dialogs/process_options_dialog.ui:94 msgctxt "process priority" msgid "Low" msgstr "Low" #: data/resources/ui/dialogs/process_options_dialog.ui:95 msgctxt "process priority" msgid "Very Low" msgstr "Very Low" #: data/resources/ui/dialogs/process_options_dialog.ui:103 msgid "Processor Affinity" msgstr "Processor Affinity" #: data/resources/ui/dialogs/process_options_dialog.ui:108 msgid "Toggle All" msgstr "Toggle All" #: data/resources/ui/dialogs/process_options_dialog.ui:111 msgid "Select which processor cores the process is allowed to run on" msgstr "Select which processor cores the process is allowed to run on" #: data/resources/ui/dialogs/settings_dialog.ui:7 msgid "General" msgstr "General" #: data/resources/ui/dialogs/settings_dialog.ui:10 msgid "Units" msgstr "Units" #: data/resources/ui/dialogs/settings_dialog.ui:13 msgid "Data Unit Prefix" msgstr "Data Unit Prefix" #: data/resources/ui/dialogs/settings_dialog.ui:17 msgid "Decimal" msgstr "Decimal" #: data/resources/ui/dialogs/settings_dialog.ui:18 msgid "Binary" msgstr "Binary" #: data/resources/ui/dialogs/settings_dialog.ui:26 msgid "Show Network Speeds in Bits per Second" msgstr "Show Network Speeds in Bits per Second" #: data/resources/ui/dialogs/settings_dialog.ui:31 msgid "Temperature Unit" msgstr "Temperature Unit" #: data/resources/ui/dialogs/settings_dialog.ui:35 msgid "Celsius" msgstr "Celsius" #: data/resources/ui/dialogs/settings_dialog.ui:36 msgid "Kelvin" msgstr "Kelvin" #: data/resources/ui/dialogs/settings_dialog.ui:37 msgid "Fahrenheit" msgstr "Fahrenheit" #: data/resources/ui/dialogs/settings_dialog.ui:47 msgid "User Interface" msgstr "User Interface" #: data/resources/ui/dialogs/settings_dialog.ui:50 msgid "Refresh Speed" msgstr "Refresh Speed" #: data/resources/ui/dialogs/settings_dialog.ui:51 msgid "Higher refresh speeds can lead to higher processor usage" msgstr "Higher refresh speeds can lead to higher processor usage" #: data/resources/ui/dialogs/settings_dialog.ui:55 msgctxt "UI refresh speed" msgid "Very Slow" msgstr "Very Slow" #: data/resources/ui/dialogs/settings_dialog.ui:56 msgctxt "UI refresh speed" msgid "Slow" msgstr "Slow" #: data/resources/ui/dialogs/settings_dialog.ui:57 msgctxt "UI refresh speed" msgid "Normal" msgstr "Normal" #: data/resources/ui/dialogs/settings_dialog.ui:58 msgctxt "UI refresh speed" msgid "Fast" msgstr "Fast" #: data/resources/ui/dialogs/settings_dialog.ui:59 msgctxt "UI refresh speed" msgid "Very Fast" msgstr "Very Fast" #: data/resources/ui/dialogs/settings_dialog.ui:67 msgid "Show Graph Grids" msgstr "Show Graph Grids" #: data/resources/ui/dialogs/settings_dialog.ui:72 msgid "Graph Data Points" msgstr "Graph Data Points" #: data/resources/ui/dialogs/settings_dialog.ui:86 msgid "Show Usage Details in Sidebar" msgstr "Show Usage Details in Sidebar" #: data/resources/ui/dialogs/settings_dialog.ui:87 msgid "If enabled, the usage along with other information will be displayed" msgstr "If enabled, the usage along with other information will be displayed" #: data/resources/ui/dialogs/settings_dialog.ui:92 msgid "Show Device Descriptions in Sidebar" msgstr "Show Device Descriptions in Sidebar" #: data/resources/ui/dialogs/settings_dialog.ui:93 msgid "" "If enabled, a device identifier like its name or device type will be " "displayed" msgstr "" "If enabled, a device identifier like its name or device type will be " "displayed" #: data/resources/ui/dialogs/settings_dialog.ui:98 msgid "Sidebar Meter Type" msgstr "Sidebar Meter Type" #: data/resources/ui/dialogs/settings_dialog.ui:102 msgid "Bar" msgstr "Bar" #: data/resources/ui/dialogs/settings_dialog.ui:103 msgid "Graph" msgstr "Graph" #: data/resources/ui/dialogs/settings_dialog.ui:111 msgid "Normalize Processor Usage" msgstr "Normalise Processor Usage" #: data/resources/ui/dialogs/settings_dialog.ui:112 msgid "" "If enabled, the total usage of all cores will be divided by the amount of " "cores" msgstr "" "If enabled, the total usage of all cores will be divided by the amount of " "cores" #: data/resources/ui/dialogs/settings_dialog.ui:122 #: data/resources/ui/window.ui:65 data/resources/ui/window.ui:72 #: src/ui/pages/applications/mod.rs:131 msgid "Apps" msgstr "Apps" #: data/resources/ui/dialogs/settings_dialog.ui:125 #: data/resources/ui/dialogs/settings_dialog.ui:207 msgid "Information Columns" msgstr "Information Columns" #: data/resources/ui/dialogs/settings_dialog.ui:183 #: data/resources/ui/dialogs/settings_dialog.ui:295 #: src/ui/pages/applications/mod.rs:1479 src/ui/pages/processes/mod.rs:2014 msgid "Combined Memory" msgstr "Combined Memory" #: data/resources/ui/dialogs/settings_dialog.ui:193 #: data/resources/ui/window.ui:105 data/resources/ui/window.ui:112 #: src/ui/pages/processes/mod.rs:175 msgid "Processes" msgstr "Processes" #: data/resources/ui/dialogs/settings_dialog.ui:196 #: data/resources/ui/pages/cpu.ui:22 data/resources/ui/pages/processes.ui:56 msgid "Options" msgstr "Options" #: data/resources/ui/dialogs/settings_dialog.ui:199 msgid "Show Niceness Values" msgstr "Show Niceness Values" #: data/resources/ui/dialogs/settings_dialog.ui:200 msgid "" "Display priorities as niceness to allow for more fine-grained adjustments" msgstr "" "Display priorities as niceness to allow for more fine-grained adjustments" #: data/resources/ui/dialogs/settings_dialog.ui:310 msgid "Devices" msgstr "Devices" #: data/resources/ui/dialogs/settings_dialog.ui:313 msgid "Drives" msgstr "Drives" #: data/resources/ui/dialogs/settings_dialog.ui:316 msgid "Show Virtual Drives" msgstr "Show Virtual Drives" #: data/resources/ui/dialogs/settings_dialog.ui:317 msgid "Virtual drives are for example ZFS volumes or mapped devices" msgstr "Virtual drives are for example ZFS volumes or mapped devices" #: data/resources/ui/dialogs/settings_dialog.ui:327 msgid "Show Virtual Network Interfaces" msgstr "Show Virtual Network Interfaces" #: data/resources/ui/dialogs/settings_dialog.ui:328 msgid "Virtual network interfaces are for example bridges or VPN tunnels" msgstr "Virtual network interfaces are for example bridges or VPN tunnels" #: data/resources/ui/pages/applications.ui:6 #: data/resources/ui/pages/applications.ui:26 #: src/ui/pages/applications/mod.rs:1563 msgid "Kill App" msgstr "Kill App" #: data/resources/ui/pages/applications.ui:10 #: data/resources/ui/pages/applications.ui:30 #: src/ui/pages/applications/mod.rs:1562 msgid "Halt App" msgstr "Halt App" #: data/resources/ui/pages/applications.ui:14 #: data/resources/ui/pages/applications.ui:34 #: src/ui/pages/applications/mod.rs:1564 msgid "Continue App" msgstr "Continue App" #: data/resources/ui/pages/applications.ui:22 #: data/resources/ui/pages/applications.ui:98 #: src/ui/pages/applications/mod.rs:1561 msgid "End App" msgstr "End App" #: data/resources/ui/pages/applications.ui:40 #: data/resources/ui/pages/processes.ui:62 msgid "Information" msgstr "Information" #: data/resources/ui/pages/applications.ui:57 msgid "Search applications" msgstr "Search applications" #: data/resources/ui/pages/applications.ui:87 #: data/resources/ui/pages/applications.ui:89 msgid "Show App Information" msgstr "Show App Information" #: data/resources/ui/pages/battery.ui:36 msgid "Battery Health" msgstr "Battery Health" #: data/resources/ui/pages/battery.ui:45 msgid "Design Capacity" msgstr "Design Capacity" #: data/resources/ui/pages/battery.ui:54 msgid "Charge Cycles" msgstr "Charge Cycles" #: data/resources/ui/pages/battery.ui:63 msgid "Technology" msgstr "Technology" #: data/resources/ui/pages/battery.ui:72 data/resources/ui/pages/gpu.ui:81 #: data/resources/ui/pages/network.ui:58 data/resources/ui/pages/npu.ui:75 msgid "Manufacturer" msgstr "Manufacturer" #: data/resources/ui/pages/battery.ui:81 msgid "Model Name" msgstr "Model Name" #: data/resources/ui/pages/battery.ui:90 data/resources/ui/pages/drive.ui:66 msgid "Device" msgstr "Device" #: data/resources/ui/pages/cpu.ui:26 msgid "Show Usages of Logical CPUs" msgstr "Show Usages of Logical CPUs" #: data/resources/ui/pages/cpu.ui:75 data/resources/ui/pages/gpu.ui:66 #: data/resources/ui/pages/npu.ui:60 msgid "Sensors" msgstr "Sensors" #: data/resources/ui/pages/cpu.ui:90 msgid "Max Frequency" msgstr "Max Frequency" #: data/resources/ui/pages/cpu.ui:99 msgid "Logical Cores" msgstr "Logical Cores" #: data/resources/ui/pages/cpu.ui:108 msgid "Physical Cores" msgstr "Physical Cores" #: data/resources/ui/pages/cpu.ui:117 msgid "Sockets" msgstr "Sockets" #: data/resources/ui/pages/cpu.ui:126 msgid "Uptime" msgstr "Uptime" #: data/resources/ui/pages/cpu.ui:135 msgid "Virtualization" msgstr "Virtualisation" #: data/resources/ui/pages/cpu.ui:144 msgid "Architecture" msgstr "Architecture" #: data/resources/ui/pages/drive.ui:38 msgid "Total Read" msgstr "Total Read" #: data/resources/ui/pages/drive.ui:47 msgid "Total Written" msgstr "Total Written" #: data/resources/ui/pages/drive.ui:57 data/resources/ui/pages/memory.ui:72 msgid "Type" msgstr "Type" #: data/resources/ui/pages/drive.ui:75 msgid "Capacity" msgstr "Capacity" #: data/resources/ui/pages/drive.ui:84 msgid "Writable" msgstr "Writeable" #: data/resources/ui/pages/drive.ui:93 msgid "Removable" msgstr "Removable" #. Translators: "Link" refers to something like "PCIe 4.0 ×16" #: data/resources/ui/pages/drive.ui:102 data/resources/ui/pages/gpu.ui:113 #: data/resources/ui/pages/network.ui:103 data/resources/ui/pages/npu.ui:107 msgid "Link" msgstr "Link" #: data/resources/ui/pages/gpu.ui:37 msgid "GPU Frequency" msgstr "GPU Frequency" #: data/resources/ui/pages/gpu.ui:50 msgid "Video Memory Frequency" msgstr "Video Memory Frequency" #: data/resources/ui/pages/gpu.ui:55 data/resources/ui/pages/npu.ui:49 #: src/ui/pages/battery.rs:217 msgid "Power Usage" msgstr "Power Usage" #: data/resources/ui/pages/gpu.ui:90 data/resources/ui/pages/npu.ui:84 msgid "PCI Slot" msgstr "PCI Slot" #: data/resources/ui/pages/gpu.ui:99 data/resources/ui/pages/network.ui:67 #: data/resources/ui/pages/npu.ui:93 msgid "Driver Used" msgstr "Driver Used" #: data/resources/ui/pages/gpu.ui:108 data/resources/ui/pages/npu.ui:102 msgid "Max Power Cap" msgstr "Max Power Cap" #: data/resources/ui/pages/memory.ui:9 msgid "You need to authenticate to see memory properties" msgstr "You need to authenticate to see memory properties" #: data/resources/ui/pages/memory.ui:10 msgid "Authenticate" msgstr "Authenticate" #: data/resources/ui/pages/memory.ui:45 msgid "Slots Used" msgstr "Slots Used" #: data/resources/ui/pages/memory.ui:54 msgid "Speed" msgstr "Speed" #: data/resources/ui/pages/memory.ui:63 msgid "Form Factor" msgstr "Form Factor" #: data/resources/ui/pages/memory.ui:81 msgid "Type Detail" msgstr "Type Detail" #: data/resources/ui/pages/network.ui:35 msgid "Total Received" msgstr "Total Received" #: data/resources/ui/pages/network.ui:44 msgid "Total Sent" msgstr "Total Sent" #: data/resources/ui/pages/network.ui:76 msgid "Interface" msgstr "Interface" #: data/resources/ui/pages/network.ui:85 msgid "Hardware Address" msgstr "Hardware Address" #: data/resources/ui/pages/network.ui:94 msgid "Network Name" msgstr "Network Name" #: data/resources/ui/pages/network.ui:112 msgid "Link Speed" msgstr "Link Speed" #: data/resources/ui/pages/npu.ui:31 msgid "NPU Frequency" msgstr "NPU Frequency" #: data/resources/ui/pages/npu.ui:44 msgid "Memory Frequency" msgstr "Memory Frequency" #: data/resources/ui/pages/processes.ui:6 #: data/resources/ui/pages/processes.ui:42 src/ui/pages/processes/mod.rs:2184 msgid "Kill Process" msgstr "Kill Process" #: data/resources/ui/pages/processes.ui:10 #: data/resources/ui/pages/processes.ui:46 src/ui/pages/processes/mod.rs:2183 msgid "Halt Process" msgstr "Halt Process" #: data/resources/ui/pages/processes.ui:14 #: data/resources/ui/pages/processes.ui:50 src/ui/pages/processes/mod.rs:2185 msgid "Continue Process" msgstr "Continue Process" #: data/resources/ui/pages/processes.ui:22 #: data/resources/ui/pages/processes.ui:74 msgid "Kill Processes" msgstr "Kill Processes" #: data/resources/ui/pages/processes.ui:26 #: data/resources/ui/pages/processes.ui:78 msgid "Halt Processes" msgstr "Halt Processes" #: data/resources/ui/pages/processes.ui:30 #: data/resources/ui/pages/processes.ui:82 msgid "Continue Processes" msgstr "Continue Processes" #: data/resources/ui/pages/processes.ui:38 #: data/resources/ui/pages/processes.ui:157 src/ui/pages/processes/mod.rs:524 #: src/ui/pages/processes/mod.rs:2182 msgid "End Process" msgstr "End Process" #: data/resources/ui/pages/processes.ui:70 src/ui/pages/processes/mod.rs:528 msgid "End Processes" msgstr "End Processes" #: data/resources/ui/pages/processes.ui:103 msgid "Search processes" msgstr "Search processes" #: data/resources/ui/pages/processes.ui:133 #: data/resources/ui/pages/processes.ui:135 msgid "Show Process Options" msgstr "Show Process Options" #: data/resources/ui/pages/processes.ui:146 #: data/resources/ui/pages/processes.ui:148 msgid "Show Process Information" msgstr "Show Process Information" #: data/resources/ui/shortcuts.ui:6 msgctxt "shortcut window" msgid "General" msgstr "General" #: data/resources/ui/shortcuts.ui:9 msgctxt "shortcut window" msgid "Preferences" msgstr "Preferences" #: data/resources/ui/shortcuts.ui:15 msgctxt "shortcut window" msgid "Show Shortcuts" msgstr "Show Shortcuts" #: data/resources/ui/shortcuts.ui:21 msgctxt "shortcut window" msgid "Quit" msgstr "Quit" #: data/resources/ui/shortcuts.ui:29 msgctxt "shortcut window" msgid "Apps/Processes" msgstr "Apps/Processes" #: data/resources/ui/shortcuts.ui:32 msgctxt "shortcut window" msgid "Toggle Search Field" msgstr "Toggle Search Field" #: data/resources/ui/shortcuts.ui:38 msgctxt "shortcut window" msgid "End App/Process" msgstr "End App/Process" #: data/resources/ui/shortcuts.ui:44 msgctxt "shortcut window" msgid "Kill App/Process" msgstr "Kill App/Process" #: data/resources/ui/shortcuts.ui:50 msgctxt "shortcut window" msgid "Halt App/Process" msgstr "Halt App/Process" #: data/resources/ui/shortcuts.ui:56 msgctxt "shortcut window" msgid "Continue App/Process" msgstr "Continue App/Process" #: data/resources/ui/shortcuts.ui:62 msgctxt "shortcut window" msgid "Show Information for App/Process" msgstr "Show Information for App/Process" #: data/resources/ui/shortcuts.ui:68 msgctxt "shortcut window" msgid "Show Process Options" msgstr "Show Process Options" #: data/resources/ui/window.ui:6 msgid "Preferences" msgstr "Preferences" #: data/resources/ui/window.ui:10 msgid "Keyboard Shortcuts" msgstr "Keyboard Shortcuts" #: data/resources/ui/window.ui:14 msgid "About Resources" msgstr "About Resources" #: data/resources/ui/window.ui:88 data/resources/ui/window.ui:128 msgid "Search" msgstr "Search" #: data/resources/ui/window.ui:90 data/resources/ui/window.ui:130 msgid "Toggle search field" msgstr "Toggle search field" #: src/application.rs:274 msgid "The Nalux Team" msgstr "The Nalux Team" #: src/application.rs:282 msgid "Report Issues" msgstr "Report Issues" #. Translator credits. Replace "translator-credits" with your name/username, and optionally an email or URL. #. One name per line, please do not remove previous names. #: src/application.rs:288 msgid "translator-credits" msgstr "Bruce Cowan " #: src/application.rs:289 msgid "Icon by" msgstr "Icon by" #: src/ui/dialogs/app_dialog.rs:155 src/ui/dialogs/process_dialog.rs:133 #: src/ui/dialogs/process_dialog.rs:137 src/ui/dialogs/process_dialog.rs:146 #: src/ui/dialogs/process_dialog.rs:148 src/ui/dialogs/process_dialog.rs:171 #: src/ui/dialogs/process_dialog.rs:178 src/ui/dialogs/process_dialog.rs:185 #: src/ui/dialogs/process_dialog.rs:192 src/ui/pages/applications/mod.rs:948 #: src/ui/pages/applications/mod.rs:1074 src/ui/pages/battery.rs:205 #: src/ui/pages/battery.rs:225 src/ui/pages/battery.rs:231 #: src/ui/pages/battery.rs:234 src/ui/pages/battery.rs:265 #: src/ui/pages/battery.rs:289 src/ui/pages/battery.rs:291 #: src/ui/pages/battery.rs:301 src/ui/pages/cpu.rs:243 src/ui/pages/cpu.rs:258 #: src/ui/pages/cpu.rs:278 src/ui/pages/cpu.rs:284 src/ui/pages/cpu.rs:290 #: src/ui/pages/cpu.rs:296 src/ui/pages/cpu.rs:300 src/ui/pages/cpu.rs:303 #: src/ui/pages/cpu.rs:341 src/ui/pages/cpu.rs:448 src/ui/pages/drive.rs:319 #: src/ui/pages/drive.rs:350 src/ui/pages/drive.rs:352 #: src/ui/pages/drive.rs:381 src/ui/pages/drive.rs:383 #: src/ui/pages/drive.rs:399 src/ui/pages/drive.rs:400 #: src/ui/pages/drive.rs:407 src/ui/pages/drive.rs:417 #: src/ui/pages/drive.rs:427 src/ui/pages/drive.rs:433 src/ui/pages/gpu.rs:245 #: src/ui/pages/gpu.rs:252 src/ui/pages/gpu.rs:297 src/ui/pages/gpu.rs:322 #: src/ui/pages/gpu.rs:325 src/ui/pages/gpu.rs:336 src/ui/pages/gpu.rs:377 #: src/ui/pages/gpu.rs:384 src/ui/pages/gpu.rs:396 src/ui/pages/gpu.rs:403 #: src/ui/pages/gpu.rs:407 src/ui/pages/gpu.rs:437 src/ui/pages/gpu.rs:443 #: src/ui/pages/memory.rs:227 src/ui/pages/memory.rs:228 #: src/ui/pages/memory.rs:232 src/ui/pages/memory.rs:233 #: src/ui/pages/memory.rs:237 src/ui/pages/memory.rs:238 #: src/ui/pages/memory.rs:266 src/ui/pages/memory.rs:327 #: src/ui/pages/network.rs:252 src/ui/pages/network.rs:259 #: src/ui/pages/network.rs:266 src/ui/pages/network.rs:272 #: src/ui/pages/network.rs:275 src/ui/pages/network.rs:285 #: src/ui/pages/network.rs:292 src/ui/pages/network.rs:302 #: src/ui/pages/network.rs:370 src/ui/pages/network.rs:373 #: src/ui/pages/network.rs:375 src/ui/pages/network.rs:404 #: src/ui/pages/network.rs:407 src/ui/pages/network.rs:409 #: src/ui/pages/network.rs:417 src/ui/pages/network.rs:424 #: src/ui/pages/network.rs:434 src/ui/pages/processes/mod.rs:1225 #: src/ui/pages/processes/mod.rs:1292 src/ui/pages/processes/mod.rs:1359 #: src/ui/pages/processes/mod.rs:1426 src/ui/pages/processes/mod.rs:1912 #: src/ui/pages/processes/mod.rs:1914 src/utils/battery.rs:152 #: src/utils/drive.rs:137 src/utils/gpu/mod.rs:279 src/utils/gpu/mod.rs:291 #: src/utils/link/mod.rs:61 src/utils/npu/mod.rs:244 src/utils/npu/mod.rs:250 msgid "N/A" msgstr "N/A" #: src/ui/dialogs/process_options_dialog.rs:147 src/ui/pages/cpu.rs:257 #: src/ui/pages/cpu.rs:417 src/ui/pages/cpu.rs:421 msgid "CPU {}" msgstr "CPU {}" #: src/ui/pages/applications/application_entry.rs:190 src/ui/pages/drive.rs:414 #: src/ui/pages/drive.rs:424 src/ui/pages/processes/process_entry.rs:211 msgid "No" msgstr "No" #: src/ui/pages/applications/application_entry.rs:191 #: src/ui/pages/processes/process_entry.rs:212 msgid "Yes (Flatpak)" msgstr "Yes (Flatpak)" #: src/ui/pages/applications/application_entry.rs:192 #: src/ui/pages/processes/process_entry.rs:213 msgid "Yes (Snap)" msgstr "Yes (Snap)" #: src/ui/pages/applications/mod.rs:660 msgid "Running Apps: {}" msgstr "Running Apps: {}" #: src/ui/pages/applications/mod.rs:700 src/ui/pages/processes/mod.rs:863 msgid "Cancel" msgstr "Cancel" #: src/ui/pages/applications/mod.rs:746 msgid "App" msgstr "App" #: src/ui/pages/applications/mod.rs:1539 src/ui/pages/processes/mod.rs:2131 msgid "End {}?" msgstr "End {}?" #: src/ui/pages/applications/mod.rs:1540 src/ui/pages/processes/mod.rs:2132 msgid "Halt {}?" msgstr "Halt {}?" #: src/ui/pages/applications/mod.rs:1541 src/ui/pages/processes/mod.rs:2133 msgid "Kill {}?" msgstr "Kill {}?" #: src/ui/pages/applications/mod.rs:1542 src/ui/pages/processes/mod.rs:2134 msgid "Continue {}?" msgstr "Continue {}?" #: src/ui/pages/applications/mod.rs:1548 src/ui/pages/processes/mod.rs:2169 msgid "Unsaved work might be lost." msgstr "Unsaved work might be lost." #: src/ui/pages/applications/mod.rs:1550 msgid "" "Halting an app can come with serious risks such as losing data and security " "implications. Use with caution." msgstr "" "Halting an app can come with serious risks such as losing data and security " "implications. Use with caution." #: src/ui/pages/applications/mod.rs:1553 msgid "" "Killing an app can come with serious risks such as losing data and security " "implications. Use with caution." msgstr "" "Killing an app can come with serious risks such as losing data and security " "implications. Use with caution." #: src/ui/pages/battery.rs:102 src/utils/battery.rs:258 msgid "Battery" msgstr "Battery" #: src/ui/pages/battery.rs:210 msgid "Battery Charge" msgstr "Battery Charge" #: src/ui/pages/battery.rs:279 src/ui/pages/cpu.rs:438 #: src/ui/pages/drive.rs:344 src/ui/pages/drive.rs:375 src/ui/pages/gpu.rs:429 #: src/ui/pages/network.rs:362 src/ui/pages/network.rs:396 msgid "Highest:" msgstr "Highest:" #: src/ui/pages/cpu.rs:242 src/ui/pages/gpu.rs:212 msgid "Total Usage" msgstr "Total Usage" #: src/ui/pages/cpu.rs:271 src/ui/pages/gpu.rs:239 msgid "Temperature" msgstr "Temperature" #: src/ui/pages/drive.rs:126 msgid "Drive" msgstr "Drive" #: src/ui/pages/drive.rs:236 msgid "Drive Activity" msgstr "Drive Activity" #: src/ui/pages/drive.rs:243 msgid "Read Speed" msgstr "Read Speed" #: src/ui/pages/drive.rs:247 msgid "Write Speed" msgstr "Write Speed" #: src/ui/pages/drive.rs:412 src/ui/pages/drive.rs:422 msgid "Yes" msgstr "Yes" #. Translators: This is an abbreviation for "Read" and "Write". This is displayed in the sidebar so your #. translation should preferably be quite short or an abbreviation #: src/ui/pages/drive.rs:440 msgid "R: {} · W: {}" msgstr "R: {} · W: {}" #: src/ui/pages/gpu.rs:220 msgid "Video Encoder/Decoder Usage" msgstr "Video Encoder/Decoder Usage" #: src/ui/pages/gpu.rs:226 msgid "Video Encoder Usage" msgstr "Video Encoder Usage" #: src/ui/pages/gpu.rs:231 msgid "Video Decoder Usage" msgstr "Video Decoder Usage" #: src/ui/pages/gpu.rs:236 msgid "Video Memory Usage" msgstr "Video Memory Usage" #. Translators: This will be displayed in the sidebar, please try to keep your translation as short as (or even #. shorter than) 'Memory' #: src/ui/pages/gpu.rs:415 msgid "Memory: {}" msgstr "Memory: {}" #: src/ui/pages/memory.rs:262 msgid "{} of {}" msgstr "{} of {}" #: src/ui/pages/memory.rs:265 msgid "{} MT/s" msgstr "{} MT/s" #. Translators: This will be displayed in the sidebar, so your translation for "Swap" should #. preferably be quite short or an abbreviation #: src/ui/pages/memory.rs:346 msgid "{} / {} · Swap: {} %" msgstr "{} / {} · Swap: {} %" #: src/ui/pages/network.rs:127 src/utils/network.rs:135 msgid "Network Interface" msgstr "Network Interface" #: src/ui/pages/network.rs:241 msgid "Receiving" msgstr "Receiving" #: src/ui/pages/network.rs:245 msgid "Sending" msgstr "Sending" #. Translators: This is an abbreviation for "Receive" and "Send". This is displayed in the sidebar so #. your translation should preferably be quite short or an abbreviation #: src/ui/pages/network.rs:445 msgid "R: {} · S: {}" msgstr "R: {} · S: {}" #: src/ui/pages/processes/mod.rs:814 msgid "Running Processes: {}" msgstr "Running Processes: {}" #: src/ui/pages/processes/mod.rs:912 msgid "Process" msgstr "Process" #: src/ui/pages/processes/mod.rs:2141 msgid "End process?" msgid_plural "End {} processes?" msgstr[0] "End {} processes?" msgstr[1] "End Process" #: src/ui/pages/processes/mod.rs:2147 msgid "Halt process?" msgid_plural "Halt {} processes?" msgstr[0] "Halt process?" msgstr[1] "Halt {} process?" #: src/ui/pages/processes/mod.rs:2153 src/ui/pages/processes/mod.rs:2159 msgid "Kill process?" msgid_plural "Kill {} processes?" msgstr[0] "Kill process?" msgstr[1] "Kill {} processes?" #: src/ui/pages/processes/mod.rs:2171 msgid "" "Halting a process can come with serious risks such as losing data and " "security implications. Use with caution." msgstr "" "Halting a process can come with serious risks such as losing data and " "security implications. Use with caution." #: src/ui/pages/processes/mod.rs:2174 msgid "" "Killing a process can come with serious risks such as losing data and " "security implications. Use with caution." msgstr "" "Killing a process can come with serious risks such as losing data and " "security implications. Use with caution." #: src/ui/window.rs:466 msgid "GPU {}" msgstr "GPU {}" #: src/ui/window.rs:496 msgid "NPU {}" msgstr "NPU {}" #: src/ui/window.rs:498 msgid "NPU" msgstr "NPU" #: src/ui/window.rs:1174 msgid "Successfully adjusted {}" msgstr "Successfully adjusted {}" #: src/ui/window.rs:1175 msgid "There was a problem adjusting {}" msgstr "There was a problem adjusting {}" #: src/ui/window.rs:1257 msgid "Successfully ended {}" msgstr "Successfully ended {}" #: src/ui/window.rs:1258 msgid "Successfully halted {}" msgstr "Successfully halted {}" #: src/ui/window.rs:1259 msgid "Successfully killed {}" msgstr "Successfully killed {}" #: src/ui/window.rs:1260 msgid "Successfully continued {}" msgstr "Successfully continued {}" #: src/ui/window.rs:1267 msgid "Successfully ended the process" msgid_plural "Successfully ended {} processes" msgstr[0] "Successfully ended the process" msgstr[1] "Successfully ended {} processes" #: src/ui/window.rs:1273 msgid "Successfully halted the process" msgid_plural "Successfully halted {} processes" msgstr[0] "Successfully halted the process" msgstr[1] "Successfully halted {} processes" #: src/ui/window.rs:1279 msgid "Successfully killed the process" msgid_plural "Successfully killed {} processes" msgstr[0] "Successfully killed the process" msgstr[1] "Successfully killed {} processes" #: src/ui/window.rs:1285 msgid "Successfully continued the process" msgid_plural "Successfully continued {} processes" msgstr[0] "Successfully continued the process" msgstr[1] "Successfully continued {} processes" #: src/ui/window.rs:1296 msgid "There was a problem ending a process" msgid_plural "There were problems ending {} processes" msgstr[0] "There was a problem ending a process" msgstr[1] "There were problems ending {} processes" #: src/ui/window.rs:1302 msgid "There was a problem halting a process" msgid_plural "There were problems halting {} processes" msgstr[0] "There was a problem halting a process" msgstr[1] "There were problems halting {} processes" #: src/ui/window.rs:1308 msgid "There was a problem killing a process" msgid_plural "There were problems killing {} processes" msgstr[0] "There was a problem killing a process" msgstr[1] "There were problems killing {} processes" #: src/ui/window.rs:1314 msgid "There was a problem continuing a process" msgid_plural "There were problems continuing {} processes" msgstr[0] "There was a problem continuing a process" msgstr[1] "There were problems continuing {} processes" #: src/ui/window.rs:1324 msgid "There was a problem ending {}" msgstr "There was a problem ending {}" #: src/ui/window.rs:1325 msgid "There was a problem halting {}" msgstr "There was a problem halting {}" #: src/ui/window.rs:1326 msgid "There was a problem killing {}" msgstr "There was a problem killing {}" #: src/ui/window.rs:1327 msgid "There was a problem continuing {}" msgstr "There was a problem continuing {}" #: src/utils/app.rs:222 msgid "System Processes" msgstr "System Processes" #: src/utils/battery.rs:93 msgid "Charging" msgstr "Charging" #: src/utils/battery.rs:94 msgid "Discharging" msgstr "Discharging" #: src/utils/battery.rs:95 msgid "Empty" msgstr "Empty" #: src/utils/battery.rs:96 msgid "Full" msgstr "Full" #: src/utils/battery.rs:97 msgid "Unknown" msgstr "Unknown" #: src/utils/battery.rs:143 msgid "Nickel-Metal Hydride" msgstr "Nickel-Metal Hydride" #: src/utils/battery.rs:144 msgid "Nickel-Cadmium" msgstr "Nickel-Cadmium" #: src/utils/battery.rs:145 msgid "Nickel-Zinc" msgstr "Nickel-Zinc" #: src/utils/battery.rs:146 msgid "Lead-Acid" msgstr "Lead-Acid" #: src/utils/battery.rs:147 msgid "Lithium-Ion" msgstr "Lithium-Ion" #: src/utils/battery.rs:148 msgid "Lithium Iron Phosphate" msgstr "Lithium Iron Phosphate" #: src/utils/battery.rs:149 msgid "Lithium Polymer" msgstr "Lithium Polymer" #: src/utils/battery.rs:151 msgid "Rechargeable Alkaline Managanese" msgstr "Rechargeable Alkaline Managanese" #: src/utils/battery.rs:256 msgid "{} Battery" msgstr "{} Battery" #: src/utils/units.rs:91 msgid "{} K" msgstr "{} K" #: src/utils/units.rs:93 msgid "{} °C" msgstr "{} °C" #: src/utils/units.rs:95 msgid "{} °F" msgstr "{} °F" #: src/utils/units.rs:113 src/utils/units.rs:127 src/utils/units.rs:147 #: src/utils/units.rs:161 msgid "{} B" msgstr "{} B" #: src/utils/units.rs:114 src/utils/units.rs:128 msgid "{} kB" msgstr "{} kB" #: src/utils/units.rs:115 src/utils/units.rs:129 msgid "{} MB" msgstr "{} MB" #: src/utils/units.rs:116 src/utils/units.rs:130 msgid "{} GB" msgstr "{} GB" #: src/utils/units.rs:117 src/utils/units.rs:131 msgid "{} TB" msgstr "{} TB" #: src/utils/units.rs:118 src/utils/units.rs:132 msgid "{} PB" msgstr "{} PB" #: src/utils/units.rs:119 src/utils/units.rs:133 msgid "{} EB" msgstr "{} EB" #: src/utils/units.rs:120 src/utils/units.rs:134 msgid "{} ZB" msgstr "{} ZB" #: src/utils/units.rs:121 src/utils/units.rs:135 msgid "{} YB" msgstr "{} YB" #: src/utils/units.rs:122 src/utils/units.rs:136 msgid "{} RB" msgstr "{} RB" #: src/utils/units.rs:123 src/utils/units.rs:137 msgid "{} QB" msgstr "{} QB" #: src/utils/units.rs:148 src/utils/units.rs:162 msgid "{} KiB" msgstr "{} KiB" #: src/utils/units.rs:149 src/utils/units.rs:163 msgid "{} MiB" msgstr "{} MiB" #: src/utils/units.rs:150 src/utils/units.rs:164 msgid "{} GiB" msgstr "{} GiB" #: src/utils/units.rs:151 src/utils/units.rs:165 msgid "{} TiB" msgstr "{} TiB" #: src/utils/units.rs:152 src/utils/units.rs:166 msgid "{} PiB" msgstr "{} PiB" #: src/utils/units.rs:153 src/utils/units.rs:167 msgid "{} EiB" msgstr "{} EiB" #: src/utils/units.rs:154 src/utils/units.rs:168 msgid "{} ZiB" msgstr "{} ZiB" #: src/utils/units.rs:155 src/utils/units.rs:169 msgid "{} YiB" msgstr "{} YiB" #: src/utils/units.rs:156 src/utils/units.rs:170 msgid "{} RiB" msgstr "{} RiB" #: src/utils/units.rs:157 src/utils/units.rs:171 msgid "{} QiB" msgstr "{} QiB" #: src/utils/units.rs:198 src/utils/units.rs:215 msgid "{} B/s" msgstr "{} B/s" #: src/utils/units.rs:199 msgid "{} kB/s" msgstr "{} kB/s" #: src/utils/units.rs:200 msgid "{} MB/s" msgstr "{} MB/s" #: src/utils/units.rs:201 msgid "{} GB/s" msgstr "{} GB/s" #: src/utils/units.rs:202 msgid "{} TB/s" msgstr "{} TB/s" #: src/utils/units.rs:203 msgid "{} PB/s" msgstr "{} PB/s" #: src/utils/units.rs:204 msgid "{} EB/s" msgstr "{} EB/s" #: src/utils/units.rs:205 msgid "{} ZB/s" msgstr "{} ZB/s" #: src/utils/units.rs:206 msgid "{} YB/s" msgstr "{} YB/s" #: src/utils/units.rs:207 msgid "{} RB/s" msgstr "{} RB/s" #: src/utils/units.rs:208 msgid "{} QB/s" msgstr "{} QB/s" #: src/utils/units.rs:216 msgid "{} KiB/s" msgstr "{} KiB/s" #: src/utils/units.rs:217 msgid "{} MiB/s" msgstr "{} MiB/s" #: src/utils/units.rs:218 msgid "{} GiB/s" msgstr "{} GiB/s" #: src/utils/units.rs:219 msgid "{} TiB/s" msgstr "{} TiB/s" #: src/utils/units.rs:220 msgid "{} PiB/s" msgstr "{} PiB/s" #: src/utils/units.rs:221 msgid "{} EiB/s" msgstr "{} EiB/s" #: src/utils/units.rs:222 msgid "{} ZiB/s" msgstr "{} ZiB/s" #: src/utils/units.rs:223 msgid "{} YiB/s" msgstr "{} YiB/s" #: src/utils/units.rs:224 msgid "{} RiB/s" msgstr "{} RiB/s" #: src/utils/units.rs:225 msgid "{} QiB/s" msgstr "{} QiB/s" #: src/utils/units.rs:239 src/utils/units.rs:256 msgid "{} b/s" msgstr "{} b/s" #: src/utils/units.rs:240 msgid "{} kb/s" msgstr "{} kb/s" #: src/utils/units.rs:241 msgid "{} Mb/s" msgstr "{} Mb/s" #: src/utils/units.rs:242 msgid "{} Gb/s" msgstr "{} Gb/s" #: src/utils/units.rs:243 msgid "{} Tb/s" msgstr "{} Tb/s" #: src/utils/units.rs:244 msgid "{} Pb/s" msgstr "{} Pb/s" #: src/utils/units.rs:245 msgid "{} Eb/s" msgstr "{} Eb/s" #: src/utils/units.rs:246 msgid "{} Zb/s" msgstr "{} Zb/s" #: src/utils/units.rs:247 msgid "{} Yb/s" msgstr "{} Yb/s" #: src/utils/units.rs:248 msgid "{} Rb/s" msgstr "{} Rb/s" #: src/utils/units.rs:249 msgid "{} Qb/s" msgstr "{} Qb/s" #: src/utils/units.rs:257 msgid "{} Kib/s" msgstr "{} Kib/s" #: src/utils/units.rs:258 msgid "{} Mib/s" msgstr "{} Mib/s" #: src/utils/units.rs:259 msgid "{} Gib/s" msgstr "{} Gib/s" #: src/utils/units.rs:260 msgid "{} Tib/s" msgstr "{} Tib/s" #: src/utils/units.rs:261 msgid "{} Pib/s" msgstr "{} Pib/s" #: src/utils/units.rs:262 msgid "{} Eib/s" msgstr "{} Eib/s" #: src/utils/units.rs:263 msgid "{} Zib/s" msgstr "{} Zib/s" #: src/utils/units.rs:264 msgid "{} Yib/s" msgstr "{} Yib/s" #: src/utils/units.rs:265 msgid "{} Rib/s" msgstr "{} Rib/s" #: src/utils/units.rs:266 msgid "{} Qib/s" msgstr "{} Qib/s" #: src/utils/units.rs:273 msgid "{} Hz" msgstr "{} Hz" #: src/utils/units.rs:274 msgid "{} kHz" msgstr "{} kHz" #: src/utils/units.rs:275 msgid "{} MHz" msgstr "{} MHz" #: src/utils/units.rs:276 msgid "{} GHz" msgstr "{} GHz" #: src/utils/units.rs:277 msgid "{} THz" msgstr "{} THz" #: src/utils/units.rs:278 msgid "{} PHz" msgstr "{} PHz" #: src/utils/units.rs:279 msgid "{} EHz" msgstr "{} EHz" #: src/utils/units.rs:280 msgid "{} ZHz" msgstr "{} ZHz" #: src/utils/units.rs:281 msgid "{} YHz" msgstr "{} YHz" #: src/utils/units.rs:282 msgid "{} RHz" msgstr "{} RHz" #: src/utils/units.rs:283 msgid "{} QHz" msgstr "{} QHz" #: src/utils/units.rs:290 msgid "{} W" msgstr "{} W" #: src/utils/units.rs:291 msgid "{} kW" msgstr "{} kW" #: src/utils/units.rs:292 msgid "{} MW" msgstr "{} MW" #: src/utils/units.rs:293 msgid "{} GW" msgstr "{} GW" #: src/utils/units.rs:294 msgid "{} TW" msgstr "{} TW" #: src/utils/units.rs:295 msgid "{} PW" msgstr "{} PW" #: src/utils/units.rs:296 msgid "{} EW" msgstr "{} EW" #: src/utils/units.rs:297 msgid "{} ZW" msgstr "{} ZW" #: src/utils/units.rs:298 msgid "{} YW" msgstr "{} YW" #: src/utils/units.rs:299 msgid "{} RW" msgstr "{} RW" #: src/utils/units.rs:300 msgid "{} QW" msgstr "{} QW" #: src/utils/units.rs:309 src/utils/units.rs:323 msgid "{} Wh" msgstr "{} Wh" #: src/utils/units.rs:310 src/utils/units.rs:324 msgid "{} kWh" msgstr "{} kWh" #: src/utils/units.rs:311 src/utils/units.rs:325 msgid "{} MWh" msgstr "{} MWh" #: src/utils/units.rs:312 src/utils/units.rs:326 msgid "{} GWh" msgstr "{} GWh" #: src/utils/units.rs:313 src/utils/units.rs:327 msgid "{} TWh" msgstr "{} TWh" #: src/utils/units.rs:314 src/utils/units.rs:328 msgid "{} PWh" msgstr "{} PWh" #: src/utils/units.rs:315 src/utils/units.rs:329 msgid "{} EWh" msgstr "{} EWh" #: src/utils/units.rs:316 src/utils/units.rs:330 msgid "{} ZWh" msgstr "{} ZWh" #: src/utils/units.rs:317 src/utils/units.rs:331 msgid "{} YWh" msgstr "{} YWh" #: src/utils/units.rs:318 src/utils/units.rs:332 msgid "{} RWh" msgstr "{} RWh" #: src/utils/units.rs:319 src/utils/units.rs:333 msgid "{} QWh" msgstr "{} QWh" #: src/utils/drive.rs:129 src/utils/drive.rs:208 msgid "CD/DVD/Blu-ray Drive" msgstr "CD/DVD/Blu-ray Drive" #: src/utils/drive.rs:130 msgid "eMMC Storage" msgstr "eMMC Storage" #: src/utils/drive.rs:131 msgid "Flash Storage" msgstr "Flash Storage" #: src/utils/drive.rs:132 src/utils/drive.rs:209 msgid "Floppy Drive" msgstr "Floppy Drive" #: src/utils/drive.rs:133 msgid "Hard Disk Drive" msgstr "Hard Disk Drive" #: src/utils/drive.rs:134 msgid "Loop Device" msgstr "Loop Device" #: src/utils/drive.rs:135 msgid "Mapped Device" msgstr "Mapped Device" #: src/utils/drive.rs:136 msgid "NVMe Drive" msgstr "NVMe Drive" #: src/utils/drive.rs:138 msgid "Software Raid" msgstr "Software Raid" #: src/utils/drive.rs:139 msgid "RAM Disk" msgstr "RAM Disk" #: src/utils/drive.rs:140 msgid "Solid State Drive" msgstr "Solid State Drive" #: src/utils/drive.rs:141 msgid "ZFS Volume" msgstr "ZFS Volume" #: src/utils/drive.rs:142 msgid "Compressed RAM Disk (zram)" msgstr "Compressed RAM Disk (zram)" #: src/utils/drive.rs:210 msgid "{} Loop Device" msgstr "{} Loop Device" #: src/utils/drive.rs:211 msgid "{} Mapped Device" msgstr "{} Mapped Device" #: src/utils/drive.rs:212 msgid "{} RAID" msgstr "{} RAID" #: src/utils/drive.rs:213 msgid "{} RAM Disk" msgstr "{} RAM Disk" #: src/utils/drive.rs:214 msgid "{} zram Device" msgstr "{} zram Device" #: src/utils/drive.rs:215 msgid "{} ZFS Volume" msgstr "{} ZFS Volume" #: src/utils/drive.rs:216 msgid "{} Drive" msgstr "{} Drive" #: src/utils/network.rs:123 msgid "Bluetooth Tether" msgstr "Bluetooth Tether" #: src/utils/network.rs:124 msgid "Network Bridge" msgstr "Network Bridge" #: src/utils/network.rs:125 msgid "Ethernet Connection" msgstr "Ethernet Connection" #: src/utils/network.rs:126 msgid "Docker Bridge" msgstr "Docker Bridge" #: src/utils/network.rs:127 msgid "InfiniBand Connection" msgstr "InfiniBand Connection" #: src/utils/network.rs:128 msgid "Serial Line IP Connection" msgstr "Serial Line IP Connection" #: src/utils/network.rs:129 msgid "Virtual Ethernet Device" msgstr "Virtual Ethernet Device" #: src/utils/network.rs:130 msgid "VM Network Bridge" msgstr "VM Network Bridge" #: src/utils/network.rs:131 msgid "VPN Tunnel" msgstr "VPN Tunnel" #: src/utils/network.rs:132 msgid "VPN Tunnel (WireGuard)" msgstr "VPN Tunnel (WireGuard)" #: src/utils/network.rs:133 msgid "Wi-Fi Connection" msgstr "Wi-Fi Connection" #: src/utils/network.rs:134 msgid "WWAN Connection" msgstr "WWAN Connection" resources-1.9.1/po/es.po000066400000000000000000001452261510634446000151360ustar00rootroot00000000000000# # nokyan , 2023. # Julián Villodre , 2025. # msgid "" msgstr "" "Project-Id-Version: resources\n" "Report-Msgid-Bugs-To: https://github.com/nokyan/resources/issues/\n" "POT-Creation-Date: 2025-10-12 15:36+0000\n" "PO-Revision-Date: 2025-10-12 19:51+0200\n" "Last-Translator: Julián Villodre \n" "Language-Team: es_ES\n" "Language: es_ES\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Gtranslator 49.0\n" "X-Poedit-SourceCharset: UTF-8\n" #: data/net.nokyan.Resources.desktop.in.in:2 #: data/net.nokyan.Resources.metainfo.xml.in.in:4 #: data/resources/ui/window.ui:22 src/application.rs:272 msgid "Resources" msgstr "Resources" #. Translators: The summary should be 35 characters or less according to Flathub appstream guidelines #: data/net.nokyan.Resources.desktop.in.in:3 #: data/net.nokyan.Resources.metainfo.xml.in.in:5 msgid "Keep an eye on system resources" msgstr "Monitoree los recursos del sistema" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/net.nokyan.Resources.desktop.in.in:9 msgid "System;Resources;Monitor;Processes;Usage;Task;Manager;CPU;RAM;Memory;GPU;" msgstr "Sistema;Recursos;Monitor;Procesos;Uso;Tarea;Admin;CPU;RAM;Memoria;GPU;" #: data/net.nokyan.Resources.metainfo.xml.in.in:17 msgid "" "Resources allows you to check the utilization of your system resources and " "control your running processes and apps. It’s designed to be user-friendly " "and feel right at home on a modern desktop by using GNOME’s libadwaita." msgstr "" "Resources te permite comprobar la utilización de los recursos de tu sistema " "y controlar los procesos y aplicaciones en ejecución. Está diseñado para ser " "fácil de usar y sentirse como en casa en un escritorio moderno utilizando " "libadwaita de GNOME." #: data/net.nokyan.Resources.metainfo.xml.in.in:20 msgid "Resources supports monitoring the following components:" msgstr "Resources soporta el monitoreo de los siguientes componentes:" #: data/net.nokyan.Resources.metainfo.xml.in.in:24 msgid "CPU" msgstr "CPU" #: data/net.nokyan.Resources.metainfo.xml.in.in:25 #: data/resources/ui/dialogs/app_dialog.ui:82 #: data/resources/ui/dialogs/process_dialog.ui:64 #: data/resources/ui/dialogs/settings_dialog.ui:128 #: data/resources/ui/dialogs/settings_dialog.ui:220 #: data/resources/ui/window.ui:176 data/resources/ui/window.ui:183 #: src/ui/pages/applications/mod.rs:803 src/ui/pages/memory.rs:106 #: src/ui/pages/memory.rs:192 src/ui/pages/processes/mod.rs:1080 msgid "Memory" msgstr "Memoria" #: data/net.nokyan.Resources.metainfo.xml.in.in:26 #: data/resources/ui/dialogs/app_dialog.ui:140 #: data/resources/ui/dialogs/process_dialog.ui:118 #: data/resources/ui/dialogs/settings_dialog.ui:158 #: data/resources/ui/dialogs/settings_dialog.ui:250 #: src/ui/pages/applications/mod.rs:1181 src/ui/pages/gpu.rs:119 #: src/ui/pages/processes/mod.rs:1470 src/ui/window.rs:468 msgid "GPU" msgstr "GPU" #: data/net.nokyan.Resources.metainfo.xml.in.in:27 #: data/resources/ui/dialogs/settings_dialog.ui:324 msgid "Network Interfaces" msgstr "Interfaces de red" #: data/net.nokyan.Resources.metainfo.xml.in.in:28 msgid "Storage Devices" msgstr "Dispositivos de almacenamiento" #: data/net.nokyan.Resources.metainfo.xml.in.in:29 msgid "Batteries" msgstr "Baterías" #: data/net.nokyan.Resources.metainfo.xml.in.in:51 msgid "Apps page in light theme" msgstr "Página de aplicaciones en tema claro" #: data/net.nokyan.Resources.metainfo.xml.in.in:55 msgid "Processes page in dark theme" msgstr "Página de procesos en tema oscuro" #: data/net.nokyan.Resources.metainfo.xml.in.in:59 msgid "Processor page in light theme" msgstr "Página de procesos en tema claro" #: data/net.nokyan.Resources.metainfo.xml.in.in:63 msgid "Memory page in dark theme" msgstr "Página de memoria en tema oscuro" #: data/net.nokyan.Resources.metainfo.xml.in.in:67 msgid "GPU page in light theme" msgstr "Página GPU en el tema claro" #: data/net.nokyan.Resources.metainfo.xml.in.in:71 msgid "Drive page in dark theme" msgstr "Página de unidades en tema oscuro" #: data/net.nokyan.Resources.metainfo.xml.in.in:75 msgid "Network Interface page in light theme" msgstr "Página de interfaz de red en el tema claro" #: data/net.nokyan.Resources.metainfo.xml.in.in:79 msgid "Battery page in dark theme" msgstr "Página de la batería en el tema oscuro" #: data/net.nokyan.Resources.policy.in.in:9 msgid "Control Process" msgstr "Controlar proceso" #: data/net.nokyan.Resources.policy.in.in:10 msgid "" "Authentication is required to control superuser’s or other users’ processes" msgstr "" "Se requiere autenticación para controlar los procesos del superusuario o de " "otros usuarios" #: data/resources/ui/dialogs/app_dialog.ui:7 msgid "App Information" msgstr "Información de aplicación" #: data/resources/ui/dialogs/app_dialog.ui:70 #: data/resources/ui/dialogs/process_dialog.ui:48 #: data/resources/ui/pages/battery.ui:22 data/resources/ui/pages/cpu.ui:37 #: data/resources/ui/pages/cpu.ui:50 data/resources/ui/pages/drive.ui:22 #: data/resources/ui/pages/gpu.ui:22 data/resources/ui/pages/memory.ui:31 #: data/resources/ui/pages/network.ui:22 data/resources/ui/pages/npu.ui:22 msgid "Usage" msgstr "Uso" #: data/resources/ui/dialogs/app_dialog.ui:73 #: data/resources/ui/dialogs/process_dialog.ui:55 #: data/resources/ui/dialogs/settings_dialog.ui:133 #: data/resources/ui/dialogs/settings_dialog.ui:225 #: data/resources/ui/window.ui:145 data/resources/ui/window.ui:152 #: src/ui/pages/applications/mod.rs:862 src/ui/pages/cpu.rs:128 #: src/ui/pages/processes/mod.rs:1139 src/ui/window.rs:290 msgid "Processor" msgstr "Procesador" #: data/resources/ui/dialogs/app_dialog.ui:91 #: data/resources/ui/dialogs/process_dialog.ui:73 #: data/resources/ui/dialogs/settings_dialog.ui:178 #: data/resources/ui/dialogs/settings_dialog.ui:290 #: src/ui/pages/applications/mod.rs:1420 src/ui/pages/memory.rs:198 #: src/ui/pages/processes/mod.rs:1955 msgid "Swap" msgstr "Swap" #: data/resources/ui/dialogs/app_dialog.ui:100 #: data/resources/ui/dialogs/process_dialog.ui:78 #: data/resources/ui/dialogs/settings_dialog.ui:138 #: data/resources/ui/dialogs/settings_dialog.ui:230 #: src/ui/pages/applications/mod.rs:926 src/ui/pages/processes/mod.rs:1203 msgid "Drive Read" msgstr "Lecturas" #: data/resources/ui/dialogs/app_dialog.ui:109 #: data/resources/ui/dialogs/process_dialog.ui:87 #: data/resources/ui/dialogs/settings_dialog.ui:143 #: data/resources/ui/dialogs/settings_dialog.ui:235 #: src/ui/pages/applications/mod.rs:991 src/ui/pages/processes/mod.rs:1270 msgid "Drive Read Total" msgstr "Total de lecturas" #: data/resources/ui/dialogs/app_dialog.ui:118 #: data/resources/ui/dialogs/process_dialog.ui:96 #: data/resources/ui/dialogs/settings_dialog.ui:148 #: data/resources/ui/dialogs/settings_dialog.ui:240 #: src/ui/pages/applications/mod.rs:1052 src/ui/pages/processes/mod.rs:1337 msgid "Drive Write" msgstr "Escrituras" #: data/resources/ui/dialogs/app_dialog.ui:127 #: data/resources/ui/dialogs/process_dialog.ui:105 #: data/resources/ui/dialogs/settings_dialog.ui:153 #: data/resources/ui/dialogs/settings_dialog.ui:245 #: src/ui/pages/applications/mod.rs:1119 src/ui/pages/processes/mod.rs:1404 msgid "Drive Write Total" msgstr "Total de escrituras" #: data/resources/ui/dialogs/app_dialog.ui:149 #: data/resources/ui/dialogs/process_dialog.ui:127 #: data/resources/ui/dialogs/settings_dialog.ui:163 #: data/resources/ui/dialogs/settings_dialog.ui:255 #: src/ui/pages/applications/mod.rs:1361 src/ui/pages/processes/mod.rs:1651 msgid "Video Memory" msgstr "Memoria de video" #: data/resources/ui/dialogs/app_dialog.ui:158 #: data/resources/ui/dialogs/process_dialog.ui:136 #: data/resources/ui/dialogs/settings_dialog.ui:168 #: data/resources/ui/dialogs/settings_dialog.ui:260 #: src/ui/pages/applications/mod.rs:1240 src/ui/pages/processes/mod.rs:1529 msgid "Video Encoder" msgstr "Codificador de video" #: data/resources/ui/dialogs/app_dialog.ui:167 #: data/resources/ui/dialogs/process_dialog.ui:145 #: data/resources/ui/dialogs/settings_dialog.ui:173 #: data/resources/ui/dialogs/settings_dialog.ui:265 #: src/ui/pages/applications/mod.rs:1301 src/ui/pages/processes/mod.rs:1590 msgid "Video Decoder" msgstr "Decodificador de video" #: data/resources/ui/dialogs/app_dialog.ui:174 #: data/resources/ui/dialogs/process_dialog.ui:179 #: data/resources/ui/pages/battery.ui:33 data/resources/ui/pages/cpu.ui:83 #: data/resources/ui/pages/drive.ui:54 data/resources/ui/pages/gpu.ui:74 #: data/resources/ui/pages/memory.ui:42 data/resources/ui/pages/network.ui:51 #: data/resources/ui/pages/npu.ui:68 msgid "Properties" msgstr "Propiedades" #: data/resources/ui/dialogs/app_dialog.ui:180 msgid "ID" msgstr "ID" #: data/resources/ui/dialogs/app_dialog.ui:190 #: data/resources/ui/dialogs/process_dialog.ui:195 msgid "Running Since" msgstr "En ejecución desde" #: data/resources/ui/dialogs/app_dialog.ui:198 msgid "Running Processes" msgstr "Procesos en ejecución" #: data/resources/ui/dialogs/app_dialog.ui:207 #: data/resources/ui/dialogs/process_dialog.ui:231 msgid "Containerized" msgstr "En contenedor" #: data/resources/ui/dialogs/process_dialog.ui:7 msgid "Process Information" msgstr "Información de proceso" #: data/resources/ui/dialogs/process_dialog.ui:154 #: data/resources/ui/dialogs/settings_dialog.ui:270 #: src/ui/pages/processes/mod.rs:1711 msgid "Total CPU Time" msgstr "Tiempo total de CPU" #: data/resources/ui/dialogs/process_dialog.ui:163 #: data/resources/ui/dialogs/settings_dialog.ui:275 #: src/ui/pages/processes/mod.rs:1770 msgid "User CPU Time" msgstr "Tiempo de CPU del usuario" #: data/resources/ui/dialogs/process_dialog.ui:172 #: data/resources/ui/dialogs/settings_dialog.ui:280 #: src/ui/pages/processes/mod.rs:1829 msgid "System CPU Time" msgstr "Tiempo de CPU del sistema" #: data/resources/ui/dialogs/process_dialog.ui:186 #: data/resources/ui/dialogs/settings_dialog.ui:210 #: src/ui/pages/processes/mod.rs:973 msgid "Process ID" msgstr "ID del Proceso" #: data/resources/ui/dialogs/process_dialog.ui:204 #: data/resources/ui/dialogs/settings_dialog.ui:300 #: src/ui/pages/processes/mod.rs:2075 msgid "Commandline" msgstr "Línea de comandos" #: data/resources/ui/dialogs/process_dialog.ui:213 #: data/resources/ui/dialogs/settings_dialog.ui:215 #: src/ui/pages/processes/mod.rs:1026 msgid "User" msgstr "Usuario" #: data/resources/ui/dialogs/process_dialog.ui:222 msgid "Control Group" msgstr "Grupo de control" #: data/resources/ui/dialogs/process_options_dialog.ui:7 #: data/resources/ui/dialogs/process_options_dialog.ui:69 msgid "Process Options" msgstr "Opciones de proceso" #: data/resources/ui/dialogs/process_options_dialog.ui:29 msgid "Apply" msgstr "Aplicar" #: data/resources/ui/dialogs/process_options_dialog.ui:72 msgid "Niceness" msgstr "Cortesía" #: data/resources/ui/dialogs/process_options_dialog.ui:73 msgid "" "The priority of a process is given by its niceness. A lower niceness value " "correspond to a higher priority." msgstr "" "La prioridad de un proceso viene dada por su cortesía. Un valor de cortesía " "más bajo corresponde a una prioridad más alta." #: data/resources/ui/dialogs/process_options_dialog.ui:87 #: data/resources/ui/dialogs/settings_dialog.ui:285 #: src/ui/pages/processes/mod.rs:1888 msgid "Priority" msgstr "Prioridad" #: data/resources/ui/dialogs/process_options_dialog.ui:91 msgctxt "process priority" msgid "Very High" msgstr "Muy alta" #: data/resources/ui/dialogs/process_options_dialog.ui:92 msgctxt "process priority" msgid "High" msgstr "Alta" #: data/resources/ui/dialogs/process_options_dialog.ui:93 msgctxt "process priority" msgid "Normal" msgstr "Normal" #: data/resources/ui/dialogs/process_options_dialog.ui:94 msgctxt "process priority" msgid "Low" msgstr "Baja" #: data/resources/ui/dialogs/process_options_dialog.ui:95 msgctxt "process priority" msgid "Very Low" msgstr "Muy baja" #: data/resources/ui/dialogs/process_options_dialog.ui:103 msgid "Processor Affinity" msgstr "Afinidad del procesador" #: data/resources/ui/dialogs/process_options_dialog.ui:108 msgid "Toggle All" msgstr "Conmutar todo" #: data/resources/ui/dialogs/process_options_dialog.ui:111 msgid "Select which processor cores the process is allowed to run on" msgstr "Seleccione en qué núcleos de procesador puede ejecutarse el proceso" #: data/resources/ui/dialogs/settings_dialog.ui:7 msgid "General" msgstr "General" #: data/resources/ui/dialogs/settings_dialog.ui:10 msgid "Units" msgstr "Unidades" #: data/resources/ui/dialogs/settings_dialog.ui:13 msgid "Data Unit Prefix" msgstr "Prefijo Unidad de datos" #: data/resources/ui/dialogs/settings_dialog.ui:17 msgid "Decimal" msgstr "Decimal" #: data/resources/ui/dialogs/settings_dialog.ui:18 msgid "Binary" msgstr "Binario" #: data/resources/ui/dialogs/settings_dialog.ui:26 msgid "Show Network Speeds in Bits per Second" msgstr "Mostrar velocidades de red en bits por segundo" #: data/resources/ui/dialogs/settings_dialog.ui:31 msgid "Temperature Unit" msgstr "Unidad de temperatura" #: data/resources/ui/dialogs/settings_dialog.ui:35 msgid "Celsius" msgstr "Celsius" #: data/resources/ui/dialogs/settings_dialog.ui:36 msgid "Kelvin" msgstr "Kelvin" #: data/resources/ui/dialogs/settings_dialog.ui:37 msgid "Fahrenheit" msgstr "Fahrenheit" #: data/resources/ui/dialogs/settings_dialog.ui:47 msgid "User Interface" msgstr "Interfaz de Usuario" #: data/resources/ui/dialogs/settings_dialog.ui:50 msgid "Refresh Speed" msgstr "Velocidad de refresco" #: data/resources/ui/dialogs/settings_dialog.ui:51 msgid "Higher refresh speeds can lead to higher processor usage" msgstr "" "Una mayor velocidad de refresco puede provocar un mayor uso del procesador" #: data/resources/ui/dialogs/settings_dialog.ui:55 msgctxt "UI refresh speed" msgid "Very Slow" msgstr "Muy lento" #: data/resources/ui/dialogs/settings_dialog.ui:56 msgctxt "UI refresh speed" msgid "Slow" msgstr "Lento" #: data/resources/ui/dialogs/settings_dialog.ui:57 msgctxt "UI refresh speed" msgid "Normal" msgstr "Normal" #: data/resources/ui/dialogs/settings_dialog.ui:58 msgctxt "UI refresh speed" msgid "Fast" msgstr "Rápido" #: data/resources/ui/dialogs/settings_dialog.ui:59 msgctxt "UI refresh speed" msgid "Very Fast" msgstr "Muy rápido" #: data/resources/ui/dialogs/settings_dialog.ui:67 msgid "Show Graph Grids" msgstr "Mostrar cuadrículas de gráficos" #: data/resources/ui/dialogs/settings_dialog.ui:72 msgid "Graph Data Points" msgstr "Puntos de datos del gráfico" #: data/resources/ui/dialogs/settings_dialog.ui:86 msgid "Show Usage Details in Sidebar" msgstr "Mostrar detalles de uso en la barra lateral" #: data/resources/ui/dialogs/settings_dialog.ui:87 msgid "If enabled, the usage along with other information will be displayed" msgstr "Si está activada, se mostrará el uso junto con otra información" #: data/resources/ui/dialogs/settings_dialog.ui:92 msgid "Show Device Descriptions in Sidebar" msgstr "Mostrar descripciones de dispositivos en la barra lateral" #: data/resources/ui/dialogs/settings_dialog.ui:93 msgid "" "If enabled, a device identifier like its name or device type will be " "displayed" msgstr "" "Si está activada, se mostrará un identificador del dispositivo como su " "nombre o tipo de dispositivo" #: data/resources/ui/dialogs/settings_dialog.ui:98 msgid "Sidebar Meter Type" msgstr "Tipo de medidor de barra lateral" #: data/resources/ui/dialogs/settings_dialog.ui:102 msgid "Bar" msgstr "Barra" #: data/resources/ui/dialogs/settings_dialog.ui:103 msgid "Graph" msgstr "Gráfico" #: data/resources/ui/dialogs/settings_dialog.ui:111 msgid "Normalize Processor Usage" msgstr "Normalizar el uso del procesador" #: data/resources/ui/dialogs/settings_dialog.ui:112 msgid "" "If enabled, the total usage of all cores will be divided by the amount of " "cores" msgstr "" "Si está habilitado, el uso total de todos los núcleos se dividirá por la " "cantidad de núcleos" #: data/resources/ui/dialogs/settings_dialog.ui:122 #: data/resources/ui/window.ui:65 data/resources/ui/window.ui:72 #: src/ui/pages/applications/mod.rs:131 msgid "Apps" msgstr "Aplicaciones" #: data/resources/ui/dialogs/settings_dialog.ui:125 #: data/resources/ui/dialogs/settings_dialog.ui:207 msgid "Information Columns" msgstr "Columnas de información" #: data/resources/ui/dialogs/settings_dialog.ui:183 #: data/resources/ui/dialogs/settings_dialog.ui:295 #: src/ui/pages/applications/mod.rs:1479 src/ui/pages/processes/mod.rs:2014 msgid "Combined Memory" msgstr "Memoria combinada" #: data/resources/ui/dialogs/settings_dialog.ui:193 #: data/resources/ui/window.ui:105 data/resources/ui/window.ui:112 #: src/ui/pages/processes/mod.rs:175 msgid "Processes" msgstr "Procesos" #: data/resources/ui/dialogs/settings_dialog.ui:196 #: data/resources/ui/pages/cpu.ui:22 data/resources/ui/pages/processes.ui:56 msgid "Options" msgstr "Opciones" #: data/resources/ui/dialogs/settings_dialog.ui:199 msgid "Show Niceness Values" msgstr "Mostrar valores de cortesía" #: data/resources/ui/dialogs/settings_dialog.ui:200 msgid "" "Display priorities as niceness to allow for more fine-grained adjustments" msgstr "" "Mostrar las prioridades en función de la cortesía para poder realizar " "ajustes más precisos" #: data/resources/ui/dialogs/settings_dialog.ui:310 msgid "Devices" msgstr "Dispositivos" #: data/resources/ui/dialogs/settings_dialog.ui:313 msgid "Drives" msgstr "Unidades" #: data/resources/ui/dialogs/settings_dialog.ui:316 msgid "Show Virtual Drives" msgstr "Mostrar unidades virtuales" #: data/resources/ui/dialogs/settings_dialog.ui:317 msgid "Virtual drives are for example ZFS volumes or mapped devices" msgstr "" "Las unidades virtuales son, por ejemplo, volúmenes ZFS o dispositivos " "mapeados" #: data/resources/ui/dialogs/settings_dialog.ui:327 msgid "Show Virtual Network Interfaces" msgstr "Mostrar interfaces de red virtuales" #: data/resources/ui/dialogs/settings_dialog.ui:328 msgid "Virtual network interfaces are for example bridges or VPN tunnels" msgstr "" "Las interfaces de red virtuales son, por ejemplo, puentes o túneles VPN" #: data/resources/ui/pages/applications.ui:6 #: data/resources/ui/pages/applications.ui:26 #: src/ui/pages/applications/mod.rs:1563 msgid "Kill App" msgstr "Matar aplicación" #: data/resources/ui/pages/applications.ui:10 #: data/resources/ui/pages/applications.ui:30 #: src/ui/pages/applications/mod.rs:1562 msgid "Halt App" msgstr "Detener aplicación" #: data/resources/ui/pages/applications.ui:14 #: data/resources/ui/pages/applications.ui:34 #: src/ui/pages/applications/mod.rs:1564 msgid "Continue App" msgstr "Reanudar aplicación" #: data/resources/ui/pages/applications.ui:22 #: data/resources/ui/pages/applications.ui:98 #: src/ui/pages/applications/mod.rs:1561 msgid "End App" msgstr "Terminar aplicación" #: data/resources/ui/pages/applications.ui:40 #: data/resources/ui/pages/processes.ui:62 msgid "Information" msgstr "Información" #: data/resources/ui/pages/applications.ui:57 msgid "Search applications" msgstr "Buscar aplicaciones" #: data/resources/ui/pages/applications.ui:87 #: data/resources/ui/pages/applications.ui:89 msgid "Show App Information" msgstr "Mostrar información de la aplicación" #: data/resources/ui/pages/battery.ui:36 msgid "Battery Health" msgstr "Salud de la batería" #: data/resources/ui/pages/battery.ui:45 msgid "Design Capacity" msgstr "Capacidad de diseño" #: data/resources/ui/pages/battery.ui:54 msgid "Charge Cycles" msgstr "Ciclos de carga" #: data/resources/ui/pages/battery.ui:63 msgid "Technology" msgstr "Tecnología" #: data/resources/ui/pages/battery.ui:72 data/resources/ui/pages/gpu.ui:81 #: data/resources/ui/pages/network.ui:58 data/resources/ui/pages/npu.ui:75 msgid "Manufacturer" msgstr "Productor" #: data/resources/ui/pages/battery.ui:81 msgid "Model Name" msgstr "Nombre del modelo" #: data/resources/ui/pages/battery.ui:90 data/resources/ui/pages/drive.ui:66 msgid "Device" msgstr "Dispositivo" #: data/resources/ui/pages/cpu.ui:26 msgid "Show Usages of Logical CPUs" msgstr "Mostrar Usos de CPU lógicas" #: data/resources/ui/pages/cpu.ui:75 data/resources/ui/pages/gpu.ui:66 #: data/resources/ui/pages/npu.ui:60 msgid "Sensors" msgstr "Sensores" #: data/resources/ui/pages/cpu.ui:90 msgid "Max Frequency" msgstr "Frecuencia máxima" #: data/resources/ui/pages/cpu.ui:99 msgid "Logical Cores" msgstr "Núcleos lógicos" #: data/resources/ui/pages/cpu.ui:108 msgid "Physical Cores" msgstr "Núcleos físicos" #: data/resources/ui/pages/cpu.ui:117 msgid "Sockets" msgstr "Sockets" #: data/resources/ui/pages/cpu.ui:126 msgid "Uptime" msgstr "Tiempo de actividad" #: data/resources/ui/pages/cpu.ui:135 msgid "Virtualization" msgstr "Virtualización" #: data/resources/ui/pages/cpu.ui:144 msgid "Architecture" msgstr "Arquitectura" #: data/resources/ui/pages/drive.ui:38 msgid "Total Read" msgstr "Lectura total" #: data/resources/ui/pages/drive.ui:47 msgid "Total Written" msgstr "Escritura total" #: data/resources/ui/pages/drive.ui:57 data/resources/ui/pages/memory.ui:72 msgid "Type" msgstr "Tipo" #: data/resources/ui/pages/drive.ui:75 msgid "Capacity" msgstr "Capacidad" #: data/resources/ui/pages/drive.ui:84 msgid "Writable" msgstr "Escribible" #: data/resources/ui/pages/drive.ui:93 msgid "Removable" msgstr "Extraíble" #. Translators: "Link" refers to something like "PCIe 4.0 ×16" #: data/resources/ui/pages/drive.ui:102 data/resources/ui/pages/gpu.ui:113 #: data/resources/ui/pages/network.ui:103 data/resources/ui/pages/npu.ui:107 msgid "Link" msgstr "Enlace" #: data/resources/ui/pages/gpu.ui:37 msgid "GPU Frequency" msgstr "Frecuencia GPU" #: data/resources/ui/pages/gpu.ui:50 msgid "Video Memory Frequency" msgstr "Frecuencia memoria video" #: data/resources/ui/pages/gpu.ui:55 data/resources/ui/pages/npu.ui:49 #: src/ui/pages/battery.rs:217 msgid "Power Usage" msgstr "Uso de energía" #: data/resources/ui/pages/gpu.ui:90 data/resources/ui/pages/npu.ui:84 msgid "PCI Slot" msgstr "Slot PCI" #: data/resources/ui/pages/gpu.ui:99 data/resources/ui/pages/network.ui:67 #: data/resources/ui/pages/npu.ui:93 msgid "Driver Used" msgstr "Controlador usado" #: data/resources/ui/pages/gpu.ui:108 data/resources/ui/pages/npu.ui:102 msgid "Max Power Cap" msgstr "Límite máximo de energía" #: data/resources/ui/pages/memory.ui:9 msgid "You need to authenticate to see memory properties" msgstr "Necesitas autenticarte para ver las propiedades de la memoria" #: data/resources/ui/pages/memory.ui:10 msgid "Authenticate" msgstr "Autenticar" #: data/resources/ui/pages/memory.ui:45 msgid "Slots Used" msgstr "Slots usados" #: data/resources/ui/pages/memory.ui:54 msgid "Speed" msgstr "Velocidad" #: data/resources/ui/pages/memory.ui:63 msgid "Form Factor" msgstr "Factor de forma" #: data/resources/ui/pages/memory.ui:81 msgid "Type Detail" msgstr "Detalle del tipo" #: data/resources/ui/pages/network.ui:35 msgid "Total Received" msgstr "Total recibido" #: data/resources/ui/pages/network.ui:44 msgid "Total Sent" msgstr "Total enviado" #: data/resources/ui/pages/network.ui:76 msgid "Interface" msgstr "Interfaz" #: data/resources/ui/pages/network.ui:85 msgid "Hardware Address" msgstr "Dirección física" #: data/resources/ui/pages/network.ui:94 msgid "Network Name" msgstr "Nombre de la red" #: data/resources/ui/pages/network.ui:112 msgid "Link Speed" msgstr "Velocidad de conexión" #: data/resources/ui/pages/npu.ui:31 msgid "NPU Frequency" msgstr "Frecuencia NPU" #: data/resources/ui/pages/npu.ui:44 msgid "Memory Frequency" msgstr "Frecuencia memoria" #: data/resources/ui/pages/processes.ui:6 #: data/resources/ui/pages/processes.ui:42 src/ui/pages/processes/mod.rs:2184 msgid "Kill Process" msgstr "Matar proceso" #: data/resources/ui/pages/processes.ui:10 #: data/resources/ui/pages/processes.ui:46 src/ui/pages/processes/mod.rs:2183 msgid "Halt Process" msgstr "Detener proceso" #: data/resources/ui/pages/processes.ui:14 #: data/resources/ui/pages/processes.ui:50 src/ui/pages/processes/mod.rs:2185 msgid "Continue Process" msgstr "Reanudar proceso" #: data/resources/ui/pages/processes.ui:22 #: data/resources/ui/pages/processes.ui:74 msgid "Kill Processes" msgstr "Matar procesos" #: data/resources/ui/pages/processes.ui:26 #: data/resources/ui/pages/processes.ui:78 msgid "Halt Processes" msgstr "Detener procesos" #: data/resources/ui/pages/processes.ui:30 #: data/resources/ui/pages/processes.ui:82 msgid "Continue Processes" msgstr "Reanudar procesos" #: data/resources/ui/pages/processes.ui:38 #: data/resources/ui/pages/processes.ui:157 src/ui/pages/processes/mod.rs:524 #: src/ui/pages/processes/mod.rs:2182 msgid "End Process" msgstr "Terminar proceso" #: data/resources/ui/pages/processes.ui:70 src/ui/pages/processes/mod.rs:528 msgid "End Processes" msgstr "Terminar procesos" #: data/resources/ui/pages/processes.ui:103 msgid "Search processes" msgstr "Mostrar procesos" #: data/resources/ui/pages/processes.ui:133 #: data/resources/ui/pages/processes.ui:135 msgid "Show Process Options" msgstr "Mostrar opciones de proceso" #: data/resources/ui/pages/processes.ui:146 #: data/resources/ui/pages/processes.ui:148 msgid "Show Process Information" msgstr "Mostrar información del proceso" #: data/resources/ui/shortcuts.ui:6 msgctxt "shortcut window" msgid "General" msgstr "General" #: data/resources/ui/shortcuts.ui:9 msgctxt "shortcut window" msgid "Preferences" msgstr "Preferencias" #: data/resources/ui/shortcuts.ui:15 msgctxt "shortcut window" msgid "Show Shortcuts" msgstr "Mostrar atajos" #: data/resources/ui/shortcuts.ui:21 msgctxt "shortcut window" msgid "Quit" msgstr "Salir" #: data/resources/ui/shortcuts.ui:29 msgctxt "shortcut window" msgid "Apps/Processes" msgstr "Aplicaciones/Procesos" #: data/resources/ui/shortcuts.ui:32 msgctxt "shortcut window" msgid "Toggle Search Field" msgstr "Mostrar/ocultar campo de búsqueda" #: data/resources/ui/shortcuts.ui:38 msgctxt "shortcut window" msgid "End App/Process" msgstr "Terminar aplicación/proceso" #: data/resources/ui/shortcuts.ui:44 msgctxt "shortcut window" msgid "Kill App/Process" msgstr "Matar aplicación/proceso" #: data/resources/ui/shortcuts.ui:50 msgctxt "shortcut window" msgid "Halt App/Process" msgstr "Detener aplicación/proceso" #: data/resources/ui/shortcuts.ui:56 msgctxt "shortcut window" msgid "Continue App/Process" msgstr "Reanudar aplicación/proceso" #: data/resources/ui/shortcuts.ui:62 msgctxt "shortcut window" msgid "Show Information for App/Process" msgstr "Mostrar información para aplicación/proceso" #: data/resources/ui/shortcuts.ui:68 msgctxt "shortcut window" msgid "Show Process Options" msgstr "Mostrar opciones de proceso" #: data/resources/ui/window.ui:6 msgid "Preferences" msgstr "Preferencias" #: data/resources/ui/window.ui:10 msgid "Keyboard Shortcuts" msgstr "Atajos de teclado" #: data/resources/ui/window.ui:14 msgid "About Resources" msgstr "Acerca de Resources" #: data/resources/ui/window.ui:88 data/resources/ui/window.ui:128 msgid "Search" msgstr "Buscar" #: data/resources/ui/window.ui:90 data/resources/ui/window.ui:130 msgid "Toggle search field" msgstr "Mostrar/ocultar el campo de búsqueda" #: src/application.rs:274 msgid "The Nalux Team" msgstr "Equipo Nalux" #: src/application.rs:282 msgid "Report Issues" msgstr "Reportar problemas" #. Translator credits. Replace "translator-credits" with your name/username, and optionally an email or URL. #. One name per line, please do not remove previous names. #: src/application.rs:288 msgid "translator-credits" msgstr "haggen88" #: src/application.rs:289 msgid "Icon by" msgstr "Icono por" #: src/ui/dialogs/app_dialog.rs:155 src/ui/dialogs/process_dialog.rs:133 #: src/ui/dialogs/process_dialog.rs:137 src/ui/dialogs/process_dialog.rs:146 #: src/ui/dialogs/process_dialog.rs:148 src/ui/dialogs/process_dialog.rs:171 #: src/ui/dialogs/process_dialog.rs:178 src/ui/dialogs/process_dialog.rs:185 #: src/ui/dialogs/process_dialog.rs:192 src/ui/pages/applications/mod.rs:948 #: src/ui/pages/applications/mod.rs:1074 src/ui/pages/battery.rs:205 #: src/ui/pages/battery.rs:225 src/ui/pages/battery.rs:231 #: src/ui/pages/battery.rs:234 src/ui/pages/battery.rs:265 #: src/ui/pages/battery.rs:289 src/ui/pages/battery.rs:291 #: src/ui/pages/battery.rs:301 src/ui/pages/cpu.rs:243 src/ui/pages/cpu.rs:258 #: src/ui/pages/cpu.rs:278 src/ui/pages/cpu.rs:284 src/ui/pages/cpu.rs:290 #: src/ui/pages/cpu.rs:296 src/ui/pages/cpu.rs:300 src/ui/pages/cpu.rs:303 #: src/ui/pages/cpu.rs:341 src/ui/pages/cpu.rs:448 src/ui/pages/drive.rs:319 #: src/ui/pages/drive.rs:350 src/ui/pages/drive.rs:352 #: src/ui/pages/drive.rs:381 src/ui/pages/drive.rs:383 #: src/ui/pages/drive.rs:399 src/ui/pages/drive.rs:400 #: src/ui/pages/drive.rs:407 src/ui/pages/drive.rs:417 #: src/ui/pages/drive.rs:427 src/ui/pages/drive.rs:433 src/ui/pages/gpu.rs:245 #: src/ui/pages/gpu.rs:252 src/ui/pages/gpu.rs:297 src/ui/pages/gpu.rs:322 #: src/ui/pages/gpu.rs:325 src/ui/pages/gpu.rs:336 src/ui/pages/gpu.rs:377 #: src/ui/pages/gpu.rs:384 src/ui/pages/gpu.rs:396 src/ui/pages/gpu.rs:403 #: src/ui/pages/gpu.rs:407 src/ui/pages/gpu.rs:437 src/ui/pages/gpu.rs:443 #: src/ui/pages/memory.rs:227 src/ui/pages/memory.rs:228 #: src/ui/pages/memory.rs:232 src/ui/pages/memory.rs:233 #: src/ui/pages/memory.rs:237 src/ui/pages/memory.rs:238 #: src/ui/pages/memory.rs:266 src/ui/pages/memory.rs:327 #: src/ui/pages/network.rs:252 src/ui/pages/network.rs:259 #: src/ui/pages/network.rs:266 src/ui/pages/network.rs:272 #: src/ui/pages/network.rs:275 src/ui/pages/network.rs:285 #: src/ui/pages/network.rs:292 src/ui/pages/network.rs:302 #: src/ui/pages/network.rs:370 src/ui/pages/network.rs:373 #: src/ui/pages/network.rs:375 src/ui/pages/network.rs:404 #: src/ui/pages/network.rs:407 src/ui/pages/network.rs:409 #: src/ui/pages/network.rs:417 src/ui/pages/network.rs:424 #: src/ui/pages/network.rs:434 src/ui/pages/processes/mod.rs:1225 #: src/ui/pages/processes/mod.rs:1292 src/ui/pages/processes/mod.rs:1359 #: src/ui/pages/processes/mod.rs:1426 src/ui/pages/processes/mod.rs:1912 #: src/ui/pages/processes/mod.rs:1914 src/utils/battery.rs:152 #: src/utils/drive.rs:137 src/utils/gpu/mod.rs:279 src/utils/gpu/mod.rs:291 #: src/utils/link/mod.rs:61 src/utils/npu/mod.rs:244 src/utils/npu/mod.rs:250 msgid "N/A" msgstr "N/A" #: src/ui/dialogs/process_options_dialog.rs:147 src/ui/pages/cpu.rs:257 #: src/ui/pages/cpu.rs:417 src/ui/pages/cpu.rs:421 msgid "CPU {}" msgstr "CPU {}" #: src/ui/pages/applications/application_entry.rs:190 src/ui/pages/drive.rs:414 #: src/ui/pages/drive.rs:424 src/ui/pages/processes/process_entry.rs:211 msgid "No" msgstr "No" #: src/ui/pages/applications/application_entry.rs:191 #: src/ui/pages/processes/process_entry.rs:212 msgid "Yes (Flatpak)" msgstr "Sí (Flatpak)" #: src/ui/pages/applications/application_entry.rs:192 #: src/ui/pages/processes/process_entry.rs:213 msgid "Yes (Snap)" msgstr "Sí (Snap)" #: src/ui/pages/applications/mod.rs:660 msgid "Running Apps: {}" msgstr "Aplicaciones en ejecución: {}" #: src/ui/pages/applications/mod.rs:700 src/ui/pages/processes/mod.rs:863 msgid "Cancel" msgstr "Cancelar" #: src/ui/pages/applications/mod.rs:746 msgid "App" msgstr "Aplicacion" #: src/ui/pages/applications/mod.rs:1539 src/ui/pages/processes/mod.rs:2131 msgid "End {}?" msgstr "Terminar {}?" #: src/ui/pages/applications/mod.rs:1540 src/ui/pages/processes/mod.rs:2132 msgid "Halt {}?" msgstr "Detener {}?" #: src/ui/pages/applications/mod.rs:1541 src/ui/pages/processes/mod.rs:2133 msgid "Kill {}?" msgstr "Matar {}?" #: src/ui/pages/applications/mod.rs:1542 src/ui/pages/processes/mod.rs:2134 msgid "Continue {}?" msgstr "Reanudar {}?" #: src/ui/pages/applications/mod.rs:1548 src/ui/pages/processes/mod.rs:2169 msgid "Unsaved work might be lost." msgstr "El trabajo no guardado podría perderse." #: src/ui/pages/applications/mod.rs:1550 msgid "" "Halting an app can come with serious risks such as losing data and security " "implications. Use with caution." msgstr "" "Detener una aplicación puede conllevar graves riesgos, como la pérdida de " "datos e implicaciones de seguridad. Use esta opción con precaución." #: src/ui/pages/applications/mod.rs:1553 msgid "" "Killing an app can come with serious risks such as losing data and security " "implications. Use with caution." msgstr "" "Eliminar una aplicación puede conllevar graves riesgos, como la pérdida de " "datos e implicaciones de seguridad. Use esta opción con precaución." #: src/ui/pages/battery.rs:102 src/utils/battery.rs:258 msgid "Battery" msgstr "Batería" #: src/ui/pages/battery.rs:210 msgid "Battery Charge" msgstr "Carga de la batería" #: src/ui/pages/battery.rs:279 src/ui/pages/cpu.rs:438 #: src/ui/pages/drive.rs:344 src/ui/pages/drive.rs:375 src/ui/pages/gpu.rs:429 #: src/ui/pages/network.rs:362 src/ui/pages/network.rs:396 msgid "Highest:" msgstr "Máximo:" #: src/ui/pages/cpu.rs:242 src/ui/pages/gpu.rs:212 msgid "Total Usage" msgstr "Uso total" #: src/ui/pages/cpu.rs:271 src/ui/pages/gpu.rs:239 msgid "Temperature" msgstr "Temperatura" #: src/ui/pages/drive.rs:126 msgid "Drive" msgstr "Unidad" #: src/ui/pages/drive.rs:236 msgid "Drive Activity" msgstr "Actividad de la unidad" #: src/ui/pages/drive.rs:243 msgid "Read Speed" msgstr "Velocidad de lectura" #: src/ui/pages/drive.rs:247 msgid "Write Speed" msgstr "Velocidad de escritura" #: src/ui/pages/drive.rs:412 src/ui/pages/drive.rs:422 msgid "Yes" msgstr "Sí" #. Translators: This is an abbreviation for "Read" and "Write". This is displayed in the sidebar so your #. translation should preferably be quite short or an abbreviation #: src/ui/pages/drive.rs:440 msgid "R: {} · W: {}" msgstr "L: {} · E: {}" #: src/ui/pages/gpu.rs:220 msgid "Video Encoder/Decoder Usage" msgstr "Uso del codificador/decodificador de vídeo" #: src/ui/pages/gpu.rs:226 msgid "Video Encoder Usage" msgstr "Uso del codificador de video" #: src/ui/pages/gpu.rs:231 msgid "Video Decoder Usage" msgstr "Uso del decodificador de video" #: src/ui/pages/gpu.rs:236 msgid "Video Memory Usage" msgstr "Uso de la memoria de video" #. Translators: This will be displayed in the sidebar, please try to keep your translation as short as (or even #. shorter than) 'Memory' #: src/ui/pages/gpu.rs:415 msgid "Memory: {}" msgstr "Memoria: {}" #: src/ui/pages/memory.rs:262 msgid "{} of {}" msgstr "{} de {}" #: src/ui/pages/memory.rs:265 msgid "{} MT/s" msgstr "{} MT/s" #. Translators: This will be displayed in the sidebar, so your translation for "Swap" should #. preferably be quite short or an abbreviation #: src/ui/pages/memory.rs:346 msgid "{} / {} · Swap: {} %" msgstr "{} / {} · Swap: {} %" #: src/ui/pages/network.rs:127 src/utils/network.rs:135 msgid "Network Interface" msgstr "Interfaz de red" #: src/ui/pages/network.rs:241 msgid "Receiving" msgstr "Recibiendo" #: src/ui/pages/network.rs:245 msgid "Sending" msgstr "Enviando" #. Translators: This is an abbreviation for "Receive" and "Send". This is displayed in the sidebar so #. your translation should preferably be quite short or an abbreviation #: src/ui/pages/network.rs:445 msgid "R: {} · S: {}" msgstr "R: {} · E: {}" #: src/ui/pages/processes/mod.rs:814 msgid "Running Processes: {}" msgstr "Procesos en ejecución: {}" #: src/ui/pages/processes/mod.rs:912 msgid "Process" msgstr "Proceso" #: src/ui/pages/processes/mod.rs:2141 msgid "End process?" msgid_plural "End {} processes?" msgstr[0] "Terminar proceso?" msgstr[1] "Terminar procesos?" #: src/ui/pages/processes/mod.rs:2147 msgid "Halt process?" msgid_plural "Halt {} processes?" msgstr[0] "Detener proceso?" msgstr[1] "Detener procesos?" #: src/ui/pages/processes/mod.rs:2153 src/ui/pages/processes/mod.rs:2159 msgid "Kill process?" msgid_plural "Kill {} processes?" msgstr[0] "Matar proceso?" msgstr[1] "Matar procesos?" #: src/ui/pages/processes/mod.rs:2171 msgid "" "Halting a process can come with serious risks such as losing data and " "security implications. Use with caution." msgstr "" "Detener un proceso puede conllevar graves riesgos, como la pérdida de datos " "e implicaciones de seguridad. Utilízelo con precaución." #: src/ui/pages/processes/mod.rs:2174 msgid "" "Killing a process can come with serious risks such as losing data and " "security implications. Use with caution." msgstr "" "Matar un proceso puede conllevar graves riesgos, como la pérdida de datos e " "implicaciones de seguridad. Utilízelo con precaución." #: src/ui/window.rs:466 msgid "GPU {}" msgstr "GPU {}" #: src/ui/window.rs:496 msgid "NPU {}" msgstr "NPU {}" #: src/ui/window.rs:498 msgid "NPU" msgstr "NPU" #: src/ui/window.rs:1174 msgid "Successfully adjusted {}" msgstr "Ajustado {} correctamente" #: src/ui/window.rs:1175 msgid "There was a problem adjusting {}" msgstr "Hubo un problema al ajustar {}" #: src/ui/window.rs:1257 msgid "Successfully ended {}" msgstr "{} terminado exitosamente" #: src/ui/window.rs:1258 msgid "Successfully halted {}" msgstr "{} detenido exitosamente" #: src/ui/window.rs:1259 msgid "Successfully killed {}" msgstr "{} matado exitosamente" #: src/ui/window.rs:1260 msgid "Successfully continued {}" msgstr "{} reanudado exitosamente" #: src/ui/window.rs:1267 msgid "Successfully ended the process" msgid_plural "Successfully ended {} processes" msgstr[0] "Proceso finalizado con éxito" msgstr[1] "{} procesos finalizados con éxito" #: src/ui/window.rs:1273 msgid "Successfully halted the process" msgid_plural "Successfully halted {} processes" msgstr[0] "Proceso detenido con éxito" msgstr[1] "{} procesos detenidos con éxito" #: src/ui/window.rs:1279 msgid "Successfully killed the process" msgid_plural "Successfully killed {} processes" msgstr[0] "Proceso muerto exitosamente" msgstr[1] "{} procesos muertos exitosamente" #: src/ui/window.rs:1285 msgid "Successfully continued the process" msgid_plural "Successfully continued {} processes" msgstr[0] "Proceso continuado con éxito" msgstr[1] "{} procesos continuados con éxito" #: src/ui/window.rs:1296 msgid "There was a problem ending a process" msgid_plural "There were problems ending {} processes" msgstr[0] "Problema al terminar un proceso" msgstr[1] "Problemas al terminar {} procesos" #: src/ui/window.rs:1302 msgid "There was a problem halting a process" msgid_plural "There were problems halting {} processes" msgstr[0] "Problema al suspender un proceso" msgstr[1] "Problemas al suspender {} procesos" #: src/ui/window.rs:1308 msgid "There was a problem killing a process" msgid_plural "There were problems killing {} processes" msgstr[0] "Problema al matar un proceso" msgstr[1] "Problemas al matar {} procesos" #: src/ui/window.rs:1314 msgid "There was a problem continuing a process" msgid_plural "There were problems continuing {} processes" msgstr[0] "Problema al reanudar un proceso" msgstr[1] "Problemas al reanudar {} procesos" #: src/ui/window.rs:1324 msgid "There was a problem ending {}" msgstr "Problema al terminar {}" #: src/ui/window.rs:1325 msgid "There was a problem halting {}" msgstr "Problema al suspender {}" #: src/ui/window.rs:1326 msgid "There was a problem killing {}" msgstr "Problema al matar {}" #: src/ui/window.rs:1327 msgid "There was a problem continuing {}" msgstr "Problema al reanudar {}" #: src/utils/app.rs:222 msgid "System Processes" msgstr "Procesos del sistema" #: src/utils/battery.rs:93 msgid "Charging" msgstr "Cargando" #: src/utils/battery.rs:94 msgid "Discharging" msgstr "Descargando" #: src/utils/battery.rs:95 msgid "Empty" msgstr "Vacío" #: src/utils/battery.rs:96 msgid "Full" msgstr "Completo" #: src/utils/battery.rs:97 msgid "Unknown" msgstr "Desconocido" #: src/utils/battery.rs:143 msgid "Nickel-Metal Hydride" msgstr "Hidruro de níquel-metal" #: src/utils/battery.rs:144 msgid "Nickel-Cadmium" msgstr "Níquel-Cadmio" #: src/utils/battery.rs:145 msgid "Nickel-Zinc" msgstr "Níquel-Zinc" #: src/utils/battery.rs:146 msgid "Lead-Acid" msgstr "Plomo-ácido" #: src/utils/battery.rs:147 msgid "Lithium-Ion" msgstr "Ión-litio" #: src/utils/battery.rs:148 msgid "Lithium Iron Phosphate" msgstr "Fosfato de litio y hierro" #: src/utils/battery.rs:149 msgid "Lithium Polymer" msgstr "Polímero de litio" #: src/utils/battery.rs:151 msgid "Rechargeable Alkaline Managanese" msgstr "Manganeso Alcalino Recargable" #: src/utils/battery.rs:256 msgid "{} Battery" msgstr "{} Batería" #: src/utils/units.rs:91 msgid "{} K" msgstr "{} K" #: src/utils/units.rs:93 msgid "{} °C" msgstr "{} °C" #: src/utils/units.rs:95 msgid "{} °F" msgstr "{} °F" #: src/utils/units.rs:113 src/utils/units.rs:127 src/utils/units.rs:147 #: src/utils/units.rs:161 msgid "{} B" msgstr "{} B" #: src/utils/units.rs:114 src/utils/units.rs:128 msgid "{} kB" msgstr "{} kB" #: src/utils/units.rs:115 src/utils/units.rs:129 msgid "{} MB" msgstr "{} MB" #: src/utils/units.rs:116 src/utils/units.rs:130 msgid "{} GB" msgstr "{} GB" #: src/utils/units.rs:117 src/utils/units.rs:131 msgid "{} TB" msgstr "{} TB" #: src/utils/units.rs:118 src/utils/units.rs:132 msgid "{} PB" msgstr "{} PB" #: src/utils/units.rs:119 src/utils/units.rs:133 msgid "{} EB" msgstr "{} EB" #: src/utils/units.rs:120 src/utils/units.rs:134 msgid "{} ZB" msgstr "{} ZB" #: src/utils/units.rs:121 src/utils/units.rs:135 msgid "{} YB" msgstr "{} YB" #: src/utils/units.rs:122 src/utils/units.rs:136 msgid "{} RB" msgstr "{} RB" #: src/utils/units.rs:123 src/utils/units.rs:137 msgid "{} QB" msgstr "{} QB" #: src/utils/units.rs:148 src/utils/units.rs:162 msgid "{} KiB" msgstr "{} KiB" #: src/utils/units.rs:149 src/utils/units.rs:163 msgid "{} MiB" msgstr "{} MiB" #: src/utils/units.rs:150 src/utils/units.rs:164 msgid "{} GiB" msgstr "{} GiB" #: src/utils/units.rs:151 src/utils/units.rs:165 msgid "{} TiB" msgstr "{} TiB" #: src/utils/units.rs:152 src/utils/units.rs:166 msgid "{} PiB" msgstr "{} PiB" #: src/utils/units.rs:153 src/utils/units.rs:167 msgid "{} EiB" msgstr "{} EiB" #: src/utils/units.rs:154 src/utils/units.rs:168 msgid "{} ZiB" msgstr "{} ZiB" #: src/utils/units.rs:155 src/utils/units.rs:169 msgid "{} YiB" msgstr "{} YiB" #: src/utils/units.rs:156 src/utils/units.rs:170 msgid "{} RiB" msgstr "{} RiB" #: src/utils/units.rs:157 src/utils/units.rs:171 msgid "{} QiB" msgstr "{} QiB" #: src/utils/units.rs:198 src/utils/units.rs:215 msgid "{} B/s" msgstr "{} B/s" #: src/utils/units.rs:199 msgid "{} kB/s" msgstr "{} kB/s" #: src/utils/units.rs:200 msgid "{} MB/s" msgstr "{} MB/s" #: src/utils/units.rs:201 msgid "{} GB/s" msgstr "{} GB/s" #: src/utils/units.rs:202 msgid "{} TB/s" msgstr "{} TB/s" #: src/utils/units.rs:203 msgid "{} PB/s" msgstr "{} PB/s" #: src/utils/units.rs:204 msgid "{} EB/s" msgstr "{} EB/s" #: src/utils/units.rs:205 msgid "{} ZB/s" msgstr "{} ZB/s" #: src/utils/units.rs:206 msgid "{} YB/s" msgstr "{} YB/s" #: src/utils/units.rs:207 msgid "{} RB/s" msgstr "{} RB/s" #: src/utils/units.rs:208 msgid "{} QB/s" msgstr "{} QB/s" #: src/utils/units.rs:216 msgid "{} KiB/s" msgstr "{} KiB/s" #: src/utils/units.rs:217 msgid "{} MiB/s" msgstr "{} MiB/s" #: src/utils/units.rs:218 msgid "{} GiB/s" msgstr "{} GiB/s" #: src/utils/units.rs:219 msgid "{} TiB/s" msgstr "{} TiB/s" #: src/utils/units.rs:220 msgid "{} PiB/s" msgstr "{} PiB/s" #: src/utils/units.rs:221 msgid "{} EiB/s" msgstr "{} EiB/s" #: src/utils/units.rs:222 msgid "{} ZiB/s" msgstr "{} ZiB/s" #: src/utils/units.rs:223 msgid "{} YiB/s" msgstr "{} YiB/s" #: src/utils/units.rs:224 msgid "{} RiB/s" msgstr "{} RiB/s" #: src/utils/units.rs:225 msgid "{} QiB/s" msgstr "{} QiB/s" #: src/utils/units.rs:239 src/utils/units.rs:256 msgid "{} b/s" msgstr "{} b/s" #: src/utils/units.rs:240 msgid "{} kb/s" msgstr "{} kb/s" #: src/utils/units.rs:241 msgid "{} Mb/s" msgstr "{} Mb/s" #: src/utils/units.rs:242 msgid "{} Gb/s" msgstr "{} Gb/s" #: src/utils/units.rs:243 msgid "{} Tb/s" msgstr "{} Tb/s" #: src/utils/units.rs:244 msgid "{} Pb/s" msgstr "{} Pb/s" #: src/utils/units.rs:245 msgid "{} Eb/s" msgstr "{} Eb/s" #: src/utils/units.rs:246 msgid "{} Zb/s" msgstr "{} Zb/s" #: src/utils/units.rs:247 msgid "{} Yb/s" msgstr "{} Yb/s" #: src/utils/units.rs:248 msgid "{} Rb/s" msgstr "{} Rb/s" #: src/utils/units.rs:249 msgid "{} Qb/s" msgstr "{} Qb/s" #: src/utils/units.rs:257 msgid "{} Kib/s" msgstr "{} Kib/s" #: src/utils/units.rs:258 msgid "{} Mib/s" msgstr "{} Mib/s" #: src/utils/units.rs:259 msgid "{} Gib/s" msgstr "{} Gib/s" #: src/utils/units.rs:260 msgid "{} Tib/s" msgstr "{} Tib/s" #: src/utils/units.rs:261 msgid "{} Pib/s" msgstr "{} Pib/s" #: src/utils/units.rs:262 msgid "{} Eib/s" msgstr "{} Eib/s" #: src/utils/units.rs:263 msgid "{} Zib/s" msgstr "{} Zib/s" #: src/utils/units.rs:264 msgid "{} Yib/s" msgstr "{} Yib/s" #: src/utils/units.rs:265 msgid "{} Rib/s" msgstr "{} Rib/s" #: src/utils/units.rs:266 msgid "{} Qib/s" msgstr "{} Qib/s" #: src/utils/units.rs:273 msgid "{} Hz" msgstr "{} Hz" #: src/utils/units.rs:274 msgid "{} kHz" msgstr "{} kHz" #: src/utils/units.rs:275 msgid "{} MHz" msgstr "{} MHz" #: src/utils/units.rs:276 msgid "{} GHz" msgstr "{} GHz" #: src/utils/units.rs:277 msgid "{} THz" msgstr "{} THz" #: src/utils/units.rs:278 msgid "{} PHz" msgstr "{} PHz" #: src/utils/units.rs:279 msgid "{} EHz" msgstr "{} EHz" #: src/utils/units.rs:280 msgid "{} ZHz" msgstr "{} ZHz" #: src/utils/units.rs:281 msgid "{} YHz" msgstr "{} YHz" #: src/utils/units.rs:282 msgid "{} RHz" msgstr "{} RHz" #: src/utils/units.rs:283 msgid "{} QHz" msgstr "{} QHz" #: src/utils/units.rs:290 msgid "{} W" msgstr "{} W" #: src/utils/units.rs:291 msgid "{} kW" msgstr "{} kW" #: src/utils/units.rs:292 msgid "{} MW" msgstr "{} MW" #: src/utils/units.rs:293 msgid "{} GW" msgstr "{} GW" #: src/utils/units.rs:294 msgid "{} TW" msgstr "{} TW" #: src/utils/units.rs:295 msgid "{} PW" msgstr "{} PW" #: src/utils/units.rs:296 msgid "{} EW" msgstr "{} EW" #: src/utils/units.rs:297 msgid "{} ZW" msgstr "{} ZW" #: src/utils/units.rs:298 msgid "{} YW" msgstr "{} YW" #: src/utils/units.rs:299 msgid "{} RW" msgstr "{} RW" #: src/utils/units.rs:300 msgid "{} QW" msgstr "{} QW" #: src/utils/units.rs:309 src/utils/units.rs:323 msgid "{} Wh" msgstr "{} Wh" #: src/utils/units.rs:310 src/utils/units.rs:324 msgid "{} kWh" msgstr "{} kWh" #: src/utils/units.rs:311 src/utils/units.rs:325 msgid "{} MWh" msgstr "{} MWh" #: src/utils/units.rs:312 src/utils/units.rs:326 msgid "{} GWh" msgstr "{} GWh" #: src/utils/units.rs:313 src/utils/units.rs:327 msgid "{} TWh" msgstr "{} TWh" #: src/utils/units.rs:314 src/utils/units.rs:328 msgid "{} PWh" msgstr "{} PWh" #: src/utils/units.rs:315 src/utils/units.rs:329 msgid "{} EWh" msgstr "{} EWh" #: src/utils/units.rs:316 src/utils/units.rs:330 msgid "{} ZWh" msgstr "{} ZWh" #: src/utils/units.rs:317 src/utils/units.rs:331 msgid "{} YWh" msgstr "{} YWh" #: src/utils/units.rs:318 src/utils/units.rs:332 msgid "{} RWh" msgstr "{} RWh" #: src/utils/units.rs:319 src/utils/units.rs:333 msgid "{} QWh" msgstr "{} QWh" #: src/utils/drive.rs:129 src/utils/drive.rs:208 msgid "CD/DVD/Blu-ray Drive" msgstr "Unidad CD/DVD/Blu-ray" #: src/utils/drive.rs:130 msgid "eMMC Storage" msgstr "memoria eMMC" #: src/utils/drive.rs:131 msgid "Flash Storage" msgstr "Memoria Flash" #: src/utils/drive.rs:132 src/utils/drive.rs:209 msgid "Floppy Drive" msgstr "Disco floppy" #: src/utils/drive.rs:133 msgid "Hard Disk Drive" msgstr "Disco duro" #: src/utils/drive.rs:134 msgid "Loop Device" msgstr "Dispositivo de bucle" #: src/utils/drive.rs:135 msgid "Mapped Device" msgstr "Dispositivo mapeado" #: src/utils/drive.rs:136 msgid "NVMe Drive" msgstr "Memoria NVMe" #: src/utils/drive.rs:138 msgid "Software Raid" msgstr "RAID de Software" #: src/utils/drive.rs:139 msgid "RAM Disk" msgstr "Disco RAM" #: src/utils/drive.rs:140 msgid "Solid State Drive" msgstr "Disco de estado sólido" #: src/utils/drive.rs:141 msgid "ZFS Volume" msgstr "Volumen ZFS" #: src/utils/drive.rs:142 msgid "Compressed RAM Disk (zram)" msgstr "Disco RAM comprimido (zram)" #: src/utils/drive.rs:210 msgid "{} Loop Device" msgstr "{} Dispositivo de bucle" #: src/utils/drive.rs:211 msgid "{} Mapped Device" msgstr "{} Dispositivo mapeado" #: src/utils/drive.rs:212 msgid "{} RAID" msgstr "{} RAID" #: src/utils/drive.rs:213 msgid "{} RAM Disk" msgstr "{} Disco RAM" #: src/utils/drive.rs:214 msgid "{} zram Device" msgstr "{} Dispositivo zram" #: src/utils/drive.rs:215 msgid "{} ZFS Volume" msgstr "{} Volumen ZFS" #: src/utils/drive.rs:216 msgid "{} Drive" msgstr "Unidad {}" #: src/utils/network.rs:123 msgid "Bluetooth Tether" msgstr "Anclaje Bluetooth" #: src/utils/network.rs:124 msgid "Network Bridge" msgstr "Puente de red" #: src/utils/network.rs:125 msgid "Ethernet Connection" msgstr "Conexión Ethernet" #: src/utils/network.rs:126 msgid "Docker Bridge" msgstr "Puente Docker" #: src/utils/network.rs:127 msgid "InfiniBand Connection" msgstr "Conexión InfiniBand" #: src/utils/network.rs:128 msgid "Serial Line IP Connection" msgstr "Conexión Serial Line IP" #: src/utils/network.rs:129 msgid "Virtual Ethernet Device" msgstr "Dispositivo Ethernet virtual" #: src/utils/network.rs:130 msgid "VM Network Bridge" msgstr "Puente de red de máquinas virtuales" #: src/utils/network.rs:131 msgid "VPN Tunnel" msgstr "Túnel VPN" #: src/utils/network.rs:132 msgid "VPN Tunnel (WireGuard)" msgstr "Túnel VPN (WireGuard)" #: src/utils/network.rs:133 msgid "Wi-Fi Connection" msgstr "Conexión Wi-Fi" #: src/utils/network.rs:134 msgid "WWAN Connection" msgstr "Connexión WWAN" #~ msgid "Memory Usage" #~ msgstr "Uso de la memoria" #~ msgid "Show Search Fields on Launch" #~ msgstr "Mostrar campos de búsqueda al iniciar" #~ msgid "VRAM: {}" #~ msgstr "VRAM: {}" #~ msgid "End app" #~ msgstr "Finalizar aplicación" #~ msgid "Halt app" #~ msgstr "Detener aplicación" #~ msgid "Kill app" #~ msgstr "Matar aplicación" #~ msgid "Continue app" #~ msgstr "Reanudar aplicación" #~ msgid "Continue process" #~ msgstr "Reanudar proceso" #~ msgid "Application" #~ msgstr "Aplicación" #~ msgctxt "shortcut window" #~ msgid "End Application/Process" #~ msgstr "Terminar aplicación/proceso" #~ msgctxt "shortcut window" #~ msgid "Kill Application/Process" #~ msgstr "Matar aplicación/proceso" #~ msgctxt "shortcut window" #~ msgid "Halt Application/Process" #~ msgstr "Detener aplicación/proceso" #~ msgctxt "shortcut window" #~ msgid "Continue Application/Process" #~ msgstr "Reanudar aplicación/proceso" #~ msgid "root" #~ msgstr "root" #~ msgid "Monitor your system resources and processes" #~ msgstr "Monitoree los procesos y recursos del sistema" #~ msgid "Window width" #~ msgstr "Ancho de ventana" #~ msgid "Window height" #~ msgstr "Alto de ventana" #~ msgid "Window maximized state" #~ msgstr "Estado de ventana maximizada" #~ msgid "Temperature unit" #~ msgstr "Unidad para temperatura" #~ msgid "Unit Prefix Base" #~ msgstr "Base para prefijo de unidad" #~ msgid "GPU Usage" #~ msgstr "Uso GPU" #~ msgid "Current Power Cap" #~ msgstr "Límite actual de energía" resources-1.9.1/po/eu.po000066400000000000000000001415121510634446000151320ustar00rootroot00000000000000# Basque translation for resources. # Copyright (C) 2025 resources's COPYRIGHT HOLDER # This file is distributed under the same license as the resources package. # Asier Saratsua Garmendia , 2025. # msgid "" msgstr "Project-Id-Version: resources main\n" "Report-Msgid-Bugs-To: https://github.com/nokyan/resources/issues/\n" "POT-Creation-Date: 2025-09-14 03:37+0000\n" "PO-Revision-Date: 2025-09-14 19:58+0000\n" "Last-Translator: Asier Saratsua Garmendia \n" "Language-Team: Basque \n" "Language: eu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: data/net.nokyan.Resources.desktop.in.in:2 #: data/net.nokyan.Resources.metainfo.xml.in.in:4 #: data/resources/ui/window.ui:22 src/application.rs:272 msgid "Resources" msgstr "Baliabideak" #. Translators: The summary should be 35 characters or less according to Flathub appstream guidelines #: data/net.nokyan.Resources.desktop.in.in:3 #: data/net.nokyan.Resources.metainfo.xml.in.in:5 msgid "Keep an eye on system resources" msgstr "Begiratu sistemaren baliabideak" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/net.nokyan.Resources.desktop.in.in:9 msgid "System;Resources;Monitor;Processes;Usage;Task;Manager;CPU;RAM;Memory;GPU;" msgstr "Sisteam;Baliabideak;Monitorea;Prozesuak;Erabilera;Zeregina;Kudeatzailea;PUZ;RAM;Memoria;PUG;" #: data/net.nokyan.Resources.metainfo.xml.in.in:17 msgid "" "Resources allows you to check the utilization of your system resources and " "control your running processes and apps. It’s designed to be user-friendly " "and feel right at home on a modern desktop by using GNOME’s libadwaita." msgstr "Baliabideak aplikazioari esker, zure sistemaren baliabideen erabilera monitorizatu dezakezu eta exekuzioan dauden prozesuak eta aplikazioak kontrolatu ditzakezu. Erabilerraza izateko diseinatuta dago eta ongi integratzen da GNOMEren mahaigain modernoarekin." #: data/net.nokyan.Resources.metainfo.xml.in.in:20 msgid "Resources supports monitoring the following components:" msgstr "Baliabideak aplikazioak honako osagaiak monitorizatzea ahalbidetzen du:" #: data/net.nokyan.Resources.metainfo.xml.in.in:24 msgid "CPU" msgstr "PUZa" #: data/net.nokyan.Resources.metainfo.xml.in.in:25 #: data/resources/ui/dialogs/app_dialog.ui:82 #: data/resources/ui/dialogs/process_dialog.ui:64 #: data/resources/ui/dialogs/settings_dialog.ui:128 #: data/resources/ui/dialogs/settings_dialog.ui:220 #: data/resources/ui/window.ui:176 data/resources/ui/window.ui:183 #: src/ui/pages/applications/mod.rs:803 src/ui/pages/memory.rs:106 #: src/ui/pages/memory.rs:192 src/ui/pages/processes/mod.rs:1079 msgid "Memory" msgstr "Memoria" #: data/net.nokyan.Resources.metainfo.xml.in.in:26 #: data/resources/ui/dialogs/app_dialog.ui:140 #: data/resources/ui/dialogs/process_dialog.ui:118 #: data/resources/ui/dialogs/settings_dialog.ui:158 #: data/resources/ui/dialogs/settings_dialog.ui:250 #: src/ui/pages/applications/mod.rs:1181 src/ui/pages/gpu.rs:118 #: src/ui/pages/processes/mod.rs:1469 src/ui/window.rs:468 msgid "GPU" msgstr "PUZa" #: data/net.nokyan.Resources.metainfo.xml.in.in:27 #: data/resources/ui/dialogs/settings_dialog.ui:319 msgid "Network Interfaces" msgstr "Sareko interfazeak" #: data/net.nokyan.Resources.metainfo.xml.in.in:28 msgid "Storage Devices" msgstr "Biltegiratze-gailuak" #: data/net.nokyan.Resources.metainfo.xml.in.in:29 msgid "Batteries" msgstr "Bateriak" #: data/net.nokyan.Resources.metainfo.xml.in.in:51 msgid "Apps page in light theme" msgstr "Aplikazioen orria gai argiarekin" #: data/net.nokyan.Resources.metainfo.xml.in.in:55 msgid "Processes page in dark theme" msgstr "Prozesuen orria gai ilunarekin" #: data/net.nokyan.Resources.metainfo.xml.in.in:59 msgid "Processor page in light theme" msgstr "Prozesatzailearen orria gai argiarekin" #: data/net.nokyan.Resources.metainfo.xml.in.in:63 msgid "Memory page in dark theme" msgstr "Memoriaren orria gai ilunarekin" #: data/net.nokyan.Resources.metainfo.xml.in.in:67 msgid "GPU page in light theme" msgstr "PUGaren orria gai argiarekin" #: data/net.nokyan.Resources.metainfo.xml.in.in:71 msgid "Drive page in dark theme" msgstr "Unitateen orria gai ilunarekin" #: data/net.nokyan.Resources.metainfo.xml.in.in:75 msgid "Network Interface page in light theme" msgstr "Sareko interfazearen orria gai argiarekin" #: data/net.nokyan.Resources.metainfo.xml.in.in:79 msgid "Battery page in dark theme" msgstr "Bateriaren orria gai ilunarekin" #: data/net.nokyan.Resources.policy.in.in:9 msgid "Control Process" msgstr "Prozesu-kontrola" #: data/net.nokyan.Resources.policy.in.in:10 msgid "" "Authentication is required to control superuser’s or other users’ processes" msgstr "Autentifikazioa behar da supererabiltzailearen edo beste erabiltzaileen prozesuak kontrolatzeko" #: data/resources/ui/dialogs/app_dialog.ui:7 msgid "App Information" msgstr "Aplikazio-informazioa" #: data/resources/ui/dialogs/app_dialog.ui:70 #: data/resources/ui/dialogs/process_dialog.ui:48 #: data/resources/ui/pages/battery.ui:22 data/resources/ui/pages/cpu.ui:37 #: data/resources/ui/pages/cpu.ui:50 data/resources/ui/pages/drive.ui:22 #: data/resources/ui/pages/gpu.ui:22 data/resources/ui/pages/memory.ui:31 #: data/resources/ui/pages/network.ui:22 data/resources/ui/pages/npu.ui:22 msgid "Usage" msgstr "Erabilera" #: data/resources/ui/dialogs/app_dialog.ui:73 #: data/resources/ui/dialogs/process_dialog.ui:55 #: data/resources/ui/dialogs/settings_dialog.ui:133 #: data/resources/ui/dialogs/settings_dialog.ui:225 #: data/resources/ui/window.ui:145 data/resources/ui/window.ui:152 #: src/ui/pages/applications/mod.rs:862 src/ui/pages/cpu.rs:128 #: src/ui/pages/processes/mod.rs:1138 src/ui/window.rs:290 msgid "Processor" msgstr "Prozesadorea" #: data/resources/ui/dialogs/app_dialog.ui:91 #: data/resources/ui/dialogs/process_dialog.ui:73 #: data/resources/ui/dialogs/settings_dialog.ui:178 #: data/resources/ui/dialogs/settings_dialog.ui:290 #: src/ui/pages/applications/mod.rs:1420 src/ui/pages/memory.rs:198 #: src/ui/pages/processes/mod.rs:1954 msgid "Swap" msgstr "Trukatze-espazioa" #: data/resources/ui/dialogs/app_dialog.ui:100 #: data/resources/ui/dialogs/process_dialog.ui:78 #: data/resources/ui/dialogs/settings_dialog.ui:138 #: data/resources/ui/dialogs/settings_dialog.ui:230 #: src/ui/pages/applications/mod.rs:926 src/ui/pages/processes/mod.rs:1202 msgid "Drive Read" msgstr "Unitatetik irakurrita" #: data/resources/ui/dialogs/app_dialog.ui:109 #: data/resources/ui/dialogs/process_dialog.ui:87 #: data/resources/ui/dialogs/settings_dialog.ui:143 #: data/resources/ui/dialogs/settings_dialog.ui:235 #: src/ui/pages/applications/mod.rs:991 src/ui/pages/processes/mod.rs:1269 msgid "Drive Read Total" msgstr "Unitatetik irakurrita guztira" #: data/resources/ui/dialogs/app_dialog.ui:118 #: data/resources/ui/dialogs/process_dialog.ui:96 #: data/resources/ui/dialogs/settings_dialog.ui:148 #: data/resources/ui/dialogs/settings_dialog.ui:240 #: src/ui/pages/applications/mod.rs:1052 src/ui/pages/processes/mod.rs:1336 msgid "Drive Write" msgstr "Unitatean idatzita" #: data/resources/ui/dialogs/app_dialog.ui:127 #: data/resources/ui/dialogs/process_dialog.ui:105 #: data/resources/ui/dialogs/settings_dialog.ui:153 #: data/resources/ui/dialogs/settings_dialog.ui:245 #: src/ui/pages/applications/mod.rs:1119 src/ui/pages/processes/mod.rs:1403 msgid "Drive Write Total" msgstr "Unitatean idatzita guztira" #: data/resources/ui/dialogs/app_dialog.ui:149 #: data/resources/ui/dialogs/process_dialog.ui:127 #: data/resources/ui/dialogs/settings_dialog.ui:163 #: data/resources/ui/dialogs/settings_dialog.ui:255 #: src/ui/pages/applications/mod.rs:1361 src/ui/pages/processes/mod.rs:1650 msgid "Video Memory" msgstr "Bideo-memoria" #: data/resources/ui/dialogs/app_dialog.ui:158 #: data/resources/ui/dialogs/process_dialog.ui:136 #: data/resources/ui/dialogs/settings_dialog.ui:168 #: data/resources/ui/dialogs/settings_dialog.ui:260 #: src/ui/pages/applications/mod.rs:1240 src/ui/pages/processes/mod.rs:1528 msgid "Video Encoder" msgstr "Bideo-kodetzailea" #: data/resources/ui/dialogs/app_dialog.ui:167 #: data/resources/ui/dialogs/process_dialog.ui:145 #: data/resources/ui/dialogs/settings_dialog.ui:173 #: data/resources/ui/dialogs/settings_dialog.ui:265 #: src/ui/pages/applications/mod.rs:1301 src/ui/pages/processes/mod.rs:1589 msgid "Video Decoder" msgstr "Bideo-deskodetzailea" #: data/resources/ui/dialogs/app_dialog.ui:174 #: data/resources/ui/dialogs/process_dialog.ui:179 #: data/resources/ui/pages/battery.ui:33 data/resources/ui/pages/cpu.ui:83 #: data/resources/ui/pages/drive.ui:54 data/resources/ui/pages/gpu.ui:74 #: data/resources/ui/pages/memory.ui:42 data/resources/ui/pages/network.ui:51 #: data/resources/ui/pages/npu.ui:68 msgid "Properties" msgstr "Propietateak" #: data/resources/ui/dialogs/app_dialog.ui:180 msgid "ID" msgstr "IDa" #: data/resources/ui/dialogs/app_dialog.ui:190 #: data/resources/ui/dialogs/process_dialog.ui:195 msgid "Running Since" msgstr "Exekuzioa noiztik" #: data/resources/ui/dialogs/app_dialog.ui:198 msgid "Running Processes" msgstr "Exekuzioan dauden prozesuak" #: data/resources/ui/dialogs/app_dialog.ui:207 #: data/resources/ui/dialogs/process_dialog.ui:231 msgid "Containerized" msgstr "Edukiontzian" #: data/resources/ui/dialogs/process_dialog.ui:7 msgid "Process Information" msgstr "Prozesu-informazioa" #: data/resources/ui/dialogs/process_dialog.ui:154 #: data/resources/ui/dialogs/settings_dialog.ui:270 #: src/ui/pages/processes/mod.rs:1710 msgid "Total CPU Time" msgstr "PUZ denbora guztira" #: data/resources/ui/dialogs/process_dialog.ui:163 #: data/resources/ui/dialogs/settings_dialog.ui:275 #: src/ui/pages/processes/mod.rs:1769 msgid "User CPU Time" msgstr "Erabiltzailearen PUZ denbora" #: data/resources/ui/dialogs/process_dialog.ui:172 #: data/resources/ui/dialogs/settings_dialog.ui:280 #: src/ui/pages/processes/mod.rs:1828 msgid "System CPU Time" msgstr "Sistemaren PUZ denbora" #: data/resources/ui/dialogs/process_dialog.ui:186 #: data/resources/ui/dialogs/settings_dialog.ui:210 #: src/ui/pages/processes/mod.rs:972 msgid "Process ID" msgstr "Prozesuaren IDa" #: data/resources/ui/dialogs/process_dialog.ui:204 msgid "Commandline" msgstr "Komando-lerroa" #: data/resources/ui/dialogs/process_dialog.ui:213 #: data/resources/ui/dialogs/settings_dialog.ui:215 #: src/ui/pages/processes/mod.rs:1025 msgid "User" msgstr "Erabiltzailea" #: data/resources/ui/dialogs/process_dialog.ui:222 msgid "Control Group" msgstr "Kontrol taldea" #: data/resources/ui/dialogs/process_options_dialog.ui:7 #: data/resources/ui/dialogs/process_options_dialog.ui:69 msgid "Process Options" msgstr "Prozesu-aukerak" #: data/resources/ui/dialogs/process_options_dialog.ui:29 msgid "Apply" msgstr "Aplikatu" #: data/resources/ui/dialogs/process_options_dialog.ui:72 msgid "Niceness" msgstr "Jatortasuna" #: data/resources/ui/dialogs/process_options_dialog.ui:73 msgid "" "The priority of a process is given by its niceness. A lower niceness value " "correspond to a higher priority." msgstr "Prozesu baten lehentasuna bere jatortasunaren araberakoa da. Jatortasun-balioa baxuagoa bada, lehentasuna altuagoa da." #: data/resources/ui/dialogs/process_options_dialog.ui:87 #: data/resources/ui/dialogs/settings_dialog.ui:285 #: src/ui/pages/processes/mod.rs:1887 msgid "Priority" msgstr "Lehentasuna" #: data/resources/ui/dialogs/process_options_dialog.ui:91 msgctxt "process priority" msgid "Very High" msgstr "Oso altua" #: data/resources/ui/dialogs/process_options_dialog.ui:92 msgctxt "process priority" msgid "High" msgstr "Altua" #: data/resources/ui/dialogs/process_options_dialog.ui:93 msgctxt "process priority" msgid "Normal" msgstr "Arrunta" #: data/resources/ui/dialogs/process_options_dialog.ui:94 msgctxt "process priority" msgid "Low" msgstr "Baxua" #: data/resources/ui/dialogs/process_options_dialog.ui:95 msgctxt "process priority" msgid "Very Low" msgstr "Oso baxu" #: data/resources/ui/dialogs/process_options_dialog.ui:103 msgid "Processor Affinity" msgstr "Prozesatzaile-afinitatea" #: data/resources/ui/dialogs/process_options_dialog.ui:108 msgid "Toggle All" msgstr "Txandakatu dena" #: data/resources/ui/dialogs/process_options_dialog.ui:111 msgid "Select which processor cores the process is allowed to run on" msgstr "Hautatu zein prozesatzaile-nukleotan exekutatu daitekeen prozesua" #: data/resources/ui/dialogs/settings_dialog.ui:7 msgid "General" msgstr "Orokorra" #: data/resources/ui/dialogs/settings_dialog.ui:10 msgid "Units" msgstr "Unitateak" #: data/resources/ui/dialogs/settings_dialog.ui:13 msgid "Data Unit Prefix" msgstr "Data-unitatearen aurrizkia" #: data/resources/ui/dialogs/settings_dialog.ui:17 msgid "Decimal" msgstr "Hamartarra" #: data/resources/ui/dialogs/settings_dialog.ui:18 msgid "Binary" msgstr "Bitarra" #: data/resources/ui/dialogs/settings_dialog.ui:26 msgid "Show Network Speeds in Bits per Second" msgstr "Erakutsi sareko abiadura bite segundotan" #: data/resources/ui/dialogs/settings_dialog.ui:31 msgid "Temperature Unit" msgstr "Tenperatura-unitatea" #: data/resources/ui/dialogs/settings_dialog.ui:35 msgid "Celsius" msgstr "Celsius" #: data/resources/ui/dialogs/settings_dialog.ui:36 msgid "Kelvin" msgstr "Kelvin" #: data/resources/ui/dialogs/settings_dialog.ui:37 msgid "Fahrenheit" msgstr "Fahrenheit" #: data/resources/ui/dialogs/settings_dialog.ui:47 msgid "User Interface" msgstr "Erabiltzaile-interfazea" #: data/resources/ui/dialogs/settings_dialog.ui:50 msgid "Refresh Speed" msgstr "Freskatu abiadura" #: data/resources/ui/dialogs/settings_dialog.ui:51 msgid "Higher refresh speeds can lead to higher processor usage" msgstr "Freskatze-abiadura altuagoek prozesatzaile-erabilera handiagoa eragin dezakete" #: data/resources/ui/dialogs/settings_dialog.ui:55 msgctxt "UI refresh speed" msgid "Very Slow" msgstr "Oso motela" #: data/resources/ui/dialogs/settings_dialog.ui:56 msgctxt "UI refresh speed" msgid "Slow" msgstr "Motela" #: data/resources/ui/dialogs/settings_dialog.ui:57 msgctxt "UI refresh speed" msgid "Normal" msgstr "Arrunta" #: data/resources/ui/dialogs/settings_dialog.ui:58 msgctxt "UI refresh speed" msgid "Fast" msgstr "Azkarra" #: data/resources/ui/dialogs/settings_dialog.ui:59 msgctxt "UI refresh speed" msgid "Very Fast" msgstr "Oso azkarra" #: data/resources/ui/dialogs/settings_dialog.ui:67 msgid "Show Graph Grids" msgstr "Erakutsi grafiko-saretak" #: data/resources/ui/dialogs/settings_dialog.ui:72 msgid "Graph Data Points" msgstr "Datu-puntuen grafikoa" #: data/resources/ui/dialogs/settings_dialog.ui:86 msgid "Show Usage Details in Sidebar" msgstr "Erakutsi erabilera-xehetasunak alboko barran" #: data/resources/ui/dialogs/settings_dialog.ui:87 msgid "If enabled, the usage along with other information will be displayed" msgstr "Gaituta badago, erabilera eta beste datu batzuk bistaratuko dira" #: data/resources/ui/dialogs/settings_dialog.ui:92 msgid "Show Device Descriptions in Sidebar" msgstr "Erakutsi gailu-deskribapenak alboko barran" #: data/resources/ui/dialogs/settings_dialog.ui:93 msgid "" "If enabled, a device identifier like its name or device type will be " "displayed" msgstr "Gaituta badago, gailu-identifikatzaile bat, adibidez izena edo gailu mota, bistaratuko dira" #: data/resources/ui/dialogs/settings_dialog.ui:98 msgid "Sidebar Meter Type" msgstr "Alboko barraren metro mota" #: data/resources/ui/dialogs/settings_dialog.ui:102 msgid "Bar" msgstr "Barrak" #: data/resources/ui/dialogs/settings_dialog.ui:103 msgid "Graph" msgstr "Grafikoa" #: data/resources/ui/dialogs/settings_dialog.ui:111 msgid "Normalize Processor Usage" msgstr "Normalizatu prozesatzaile-erabilera" #: data/resources/ui/dialogs/settings_dialog.ui:112 msgid "" "If enabled, the total usage of all cores will be divided by the amount of " "cores" msgstr "Gaituta badago, nukleo guztien erabilera osoa nukleo kopuruarekin zatituko da" #: data/resources/ui/dialogs/settings_dialog.ui:122 #: data/resources/ui/window.ui:65 data/resources/ui/window.ui:72 #: src/ui/pages/applications/mod.rs:131 msgid "Apps" msgstr "Aplikazioak" #: data/resources/ui/dialogs/settings_dialog.ui:125 #: data/resources/ui/dialogs/settings_dialog.ui:207 msgid "Information Columns" msgstr "Informazio-zutabeak" #: data/resources/ui/dialogs/settings_dialog.ui:183 #: data/resources/ui/dialogs/settings_dialog.ui:295 #: src/ui/pages/applications/mod.rs:1479 src/ui/pages/processes/mod.rs:2013 msgid "Combined Memory" msgstr "Memoria konbinatua" #: data/resources/ui/dialogs/settings_dialog.ui:193 #: data/resources/ui/window.ui:105 data/resources/ui/window.ui:112 #: src/ui/pages/processes/mod.rs:175 msgid "Processes" msgstr "Prozesuak" #: data/resources/ui/dialogs/settings_dialog.ui:196 #: data/resources/ui/pages/cpu.ui:22 data/resources/ui/pages/processes.ui:56 msgid "Options" msgstr "Aukerak" #: data/resources/ui/dialogs/settings_dialog.ui:199 msgid "Show Niceness Values" msgstr "Erakutsi jatortasun-balioak" #: data/resources/ui/dialogs/settings_dialog.ui:200 msgid "" "Display priorities as niceness to allow for more fine-grained adjustments" msgstr "Bistaratu lehentasunak jatortasun gisa, doikuntza finagoak egin ahal izateko" #: data/resources/ui/dialogs/settings_dialog.ui:305 msgid "Devices" msgstr "Gailuak" #: data/resources/ui/dialogs/settings_dialog.ui:308 msgid "Drives" msgstr "Unitateak" #: data/resources/ui/dialogs/settings_dialog.ui:311 msgid "Show Virtual Drives" msgstr "Erakutsi unitate birtualak" #: data/resources/ui/dialogs/settings_dialog.ui:312 msgid "Virtual drives are for example ZFS volumes or mapped devices" msgstr "Unitate birtualak dira, adibidez, ZFS bolumenak edo mapatutako gailuak" #: data/resources/ui/dialogs/settings_dialog.ui:322 msgid "Show Virtual Network Interfaces" msgstr "Erakutsi sareko interfaze birtualak" #: data/resources/ui/dialogs/settings_dialog.ui:323 msgid "Virtual network interfaces are for example bridges or VPN tunnels" msgstr "Sareko interfaze birtualak dira, adibidez, zugiak edo VPN tunelak" #: data/resources/ui/pages/applications.ui:6 #: data/resources/ui/pages/applications.ui:26 #: src/ui/pages/applications/mod.rs:1563 msgid "Kill App" msgstr "Hil aplikazioa" #: data/resources/ui/pages/applications.ui:10 #: data/resources/ui/pages/applications.ui:30 #: src/ui/pages/applications/mod.rs:1562 msgid "Halt App" msgstr "Gelditu aplikazioa" #: data/resources/ui/pages/applications.ui:14 #: data/resources/ui/pages/applications.ui:34 #: src/ui/pages/applications/mod.rs:1564 msgid "Continue App" msgstr "Jarraitu aplikazioa" #: data/resources/ui/pages/applications.ui:22 #: data/resources/ui/pages/applications.ui:98 #: src/ui/pages/applications/mod.rs:1561 msgid "End App" msgstr "Amaitu aplikazioa" #: data/resources/ui/pages/applications.ui:40 #: data/resources/ui/pages/processes.ui:62 msgid "Information" msgstr "Informazioa" #: data/resources/ui/pages/applications.ui:57 msgid "Search applications" msgstr "Bilatu aplikazioak" #: data/resources/ui/pages/applications.ui:87 #: data/resources/ui/pages/applications.ui:89 msgid "Show App Information" msgstr "Erakutsi aplikazio-informazioa" #: data/resources/ui/pages/battery.ui:36 msgid "Battery Health" msgstr "Bateriaren osasuna" #: data/resources/ui/pages/battery.ui:45 msgid "Design Capacity" msgstr "Diseinu-edukiera" #: data/resources/ui/pages/battery.ui:54 msgid "Charge Cycles" msgstr "Karga-zikloak" #: data/resources/ui/pages/battery.ui:63 msgid "Technology" msgstr "Teknologia" #: data/resources/ui/pages/battery.ui:72 data/resources/ui/pages/gpu.ui:81 #: data/resources/ui/pages/network.ui:58 data/resources/ui/pages/npu.ui:75 msgid "Manufacturer" msgstr "Fabrikatzailea" #: data/resources/ui/pages/battery.ui:81 msgid "Model Name" msgstr "Modeloaren izena" #: data/resources/ui/pages/battery.ui:90 data/resources/ui/pages/drive.ui:66 msgid "Device" msgstr "Gailua" #: data/resources/ui/pages/cpu.ui:26 msgid "Show Usages of Logical CPUs" msgstr "Erakutsi PUZ logikoen erabilerak" #: data/resources/ui/pages/cpu.ui:75 data/resources/ui/pages/gpu.ui:66 #: data/resources/ui/pages/npu.ui:60 msgid "Sensors" msgstr "Sentsoreak" #: data/resources/ui/pages/cpu.ui:90 msgid "Max Frequency" msgstr "Gehieneko maiztasuna" #: data/resources/ui/pages/cpu.ui:99 msgid "Logical Cores" msgstr "Nukleo logikoak" #: data/resources/ui/pages/cpu.ui:108 msgid "Physical Cores" msgstr "Nukleo fisikoak" #: data/resources/ui/pages/cpu.ui:117 msgid "Sockets" msgstr "Socket-ak" #: data/resources/ui/pages/cpu.ui:126 msgid "Uptime" msgstr "Jarduera-denbora" #: data/resources/ui/pages/cpu.ui:135 msgid "Virtualization" msgstr "Birtualizazioa" #: data/resources/ui/pages/cpu.ui:144 msgid "Architecture" msgstr "Arkitektura" #: data/resources/ui/pages/drive.ui:38 msgid "Total Read" msgstr "Irakurrita guztira" #: data/resources/ui/pages/drive.ui:47 msgid "Total Written" msgstr "Idatzita guztira" #: data/resources/ui/pages/drive.ui:57 data/resources/ui/pages/memory.ui:72 msgid "Type" msgstr "Mota" #: data/resources/ui/pages/drive.ui:75 msgid "Capacity" msgstr "Edukiera" #: data/resources/ui/pages/drive.ui:84 msgid "Writable" msgstr "Idazgarria" #: data/resources/ui/pages/drive.ui:93 msgid "Removable" msgstr "Kengarria" #. Translators: "Link" refers to something like "PCIe 4.0 ×16" #: data/resources/ui/pages/drive.ui:102 data/resources/ui/pages/gpu.ui:113 #: data/resources/ui/pages/network.ui:103 data/resources/ui/pages/npu.ui:107 msgid "Link" msgstr "Esteka" #: data/resources/ui/pages/gpu.ui:37 msgid "GPU Frequency" msgstr "PUG maiztasuna" #: data/resources/ui/pages/gpu.ui:50 msgid "Video Memory Frequency" msgstr "Bideo-memoriaren maiztasuna" #: data/resources/ui/pages/gpu.ui:55 data/resources/ui/pages/npu.ui:49 #: src/ui/pages/battery.rs:217 msgid "Power Usage" msgstr "Energia-erabilera" #: data/resources/ui/pages/gpu.ui:90 data/resources/ui/pages/npu.ui:84 msgid "PCI Slot" msgstr "PCI arteka" #: data/resources/ui/pages/gpu.ui:99 data/resources/ui/pages/network.ui:67 #: data/resources/ui/pages/npu.ui:93 msgid "Driver Used" msgstr "Erabilitako kontrolatzailea" #: data/resources/ui/pages/gpu.ui:108 data/resources/ui/pages/npu.ui:102 msgid "Max Power Cap" msgstr "Gehieneko potentzia-kapazitatea" #: data/resources/ui/pages/memory.ui:9 msgid "You need to authenticate to see memory properties" msgstr "Autentifikatu behar duzu memoria-propietateak ikusteko" #: data/resources/ui/pages/memory.ui:10 msgid "Authenticate" msgstr "Autentifikatu" #: data/resources/ui/pages/memory.ui:45 msgid "Slots Used" msgstr "Erabilitako artekak" #: data/resources/ui/pages/memory.ui:54 msgid "Speed" msgstr "Abiadura" #: data/resources/ui/pages/memory.ui:63 msgid "Form Factor" msgstr "Forma-faktorea" #: data/resources/ui/pages/memory.ui:81 msgid "Type Detail" msgstr "Motaren xehetasuna" #: data/resources/ui/pages/network.ui:35 msgid "Total Received" msgstr "Jasotakoak guztira" #: data/resources/ui/pages/network.ui:44 msgid "Total Sent" msgstr "Bidalitakoak guztira" #: data/resources/ui/pages/network.ui:76 msgid "Interface" msgstr "Interfazea" #: data/resources/ui/pages/network.ui:85 msgid "Hardware Address" msgstr "Hardwarearen helbidea" #: data/resources/ui/pages/network.ui:94 msgid "Network Name" msgstr "Sarearen izena" #: data/resources/ui/pages/network.ui:112 msgid "Link Speed" msgstr "Esteka-abiadura" #: data/resources/ui/pages/npu.ui:31 msgid "NPU Frequency" msgstr "NPU maiztasuna" #: data/resources/ui/pages/npu.ui:44 msgid "Memory Frequency" msgstr "Memoria-maiztasuna" #: data/resources/ui/pages/processes.ui:6 #: data/resources/ui/pages/processes.ui:42 src/ui/pages/processes/mod.rs:2126 msgid "Kill Process" msgstr "Hil prozesua" #: data/resources/ui/pages/processes.ui:10 #: data/resources/ui/pages/processes.ui:46 src/ui/pages/processes/mod.rs:2125 msgid "Halt Process" msgstr "Gelditu prozesua" #: data/resources/ui/pages/processes.ui:14 #: data/resources/ui/pages/processes.ui:50 src/ui/pages/processes/mod.rs:2127 msgid "Continue Process" msgstr "Jarraitu prozesuarekin" #: data/resources/ui/pages/processes.ui:22 #: data/resources/ui/pages/processes.ui:74 msgid "Kill Processes" msgstr "Hil prozesuak" #: data/resources/ui/pages/processes.ui:26 #: data/resources/ui/pages/processes.ui:78 msgid "Halt Processes" msgstr "Gelditu prozesuak" #: data/resources/ui/pages/processes.ui:30 #: data/resources/ui/pages/processes.ui:82 msgid "Continue Processes" msgstr "Jarraitu prozesuekin" #: data/resources/ui/pages/processes.ui:38 #: data/resources/ui/pages/processes.ui:157 src/ui/pages/processes/mod.rs:523 #: src/ui/pages/processes/mod.rs:2124 msgid "End Process" msgstr "Amaitu prozesua" #: data/resources/ui/pages/processes.ui:70 src/ui/pages/processes/mod.rs:527 msgid "End Processes" msgstr "Amaitu prozesuak" #: data/resources/ui/pages/processes.ui:103 msgid "Search processes" msgstr "Bilatu prozesuak" #: data/resources/ui/pages/processes.ui:133 #: data/resources/ui/pages/processes.ui:135 msgid "Show Process Options" msgstr "Erakutsi prozesu-aukerak" #: data/resources/ui/pages/processes.ui:146 #: data/resources/ui/pages/processes.ui:148 msgid "Show Process Information" msgstr "Erakutsi prozesu-informazioa" #: data/resources/ui/shortcuts.ui:11 msgctxt "shortcut window" msgid "General" msgstr "Orokorra" #: data/resources/ui/shortcuts.ui:14 msgctxt "shortcut window" msgid "Preferences" msgstr "Hobespenak" #: data/resources/ui/shortcuts.ui:20 msgctxt "shortcut window" msgid "Show Shortcuts" msgstr "Erakutsi lasterbideak" #: data/resources/ui/shortcuts.ui:26 msgctxt "shortcut window" msgid "Quit" msgstr "Irten" #: data/resources/ui/shortcuts.ui:32 msgctxt "shortcut window" msgid "Toggle Search Field" msgstr "Erakutsi/ezkutatu bilaketa-eremua" #: data/resources/ui/shortcuts.ui:38 msgctxt "shortcut window" msgid "End App/Process" msgstr "Amaitu aplikazioa/prozesua" #: data/resources/ui/shortcuts.ui:44 msgctxt "shortcut window" msgid "Kill App/Process" msgstr "Hil aplikazioa/prozesua" #: data/resources/ui/shortcuts.ui:50 msgctxt "shortcut window" msgid "Halt App/Process" msgstr "Gelditu aplikazioa/prozesua" #: data/resources/ui/shortcuts.ui:56 msgctxt "shortcut window" msgid "Continue App/Process" msgstr "Jarraitu aplikazioarekin/prozesuarekin" #: data/resources/ui/shortcuts.ui:62 msgctxt "shortcut window" msgid "Show Information for App/Process" msgstr "Erakutsi aplikazioaren/prozesuaren informazioa" #: data/resources/ui/shortcuts.ui:68 msgctxt "shortcut window" msgid "Show Process Options" msgstr "Erakutsi prozesu-aukerak" #: data/resources/ui/window.ui:6 msgid "Preferences" msgstr "Hobespenak" #: data/resources/ui/window.ui:10 msgid "Keyboard Shortcuts" msgstr "Laster-teklak" #: data/resources/ui/window.ui:14 msgid "About Resources" msgstr "Baliabideak aplikazioari buruz" #: data/resources/ui/window.ui:88 data/resources/ui/window.ui:128 msgid "Search" msgstr "Bilatu" #: data/resources/ui/window.ui:90 data/resources/ui/window.ui:130 msgid "Toggle search field" msgstr "Erakutsi/ezkutatu bilaketa-eremua" #: src/application.rs:274 msgid "The Nalux Team" msgstr "Nalux taldea" #: src/application.rs:282 msgid "Report Issues" msgstr "Jakinarazi akatsak" #. Translator credits. Replace "translator-credits" with your name/username, and optionally an email or URL. #. One name per line, please do not remove previous names. #: src/application.rs:288 msgid "translator-credits" msgstr "Asier Saratsua Garmendia " #: src/application.rs:289 msgid "Icon by" msgstr "Ikonoa:" #: src/ui/dialogs/app_dialog.rs:155 src/ui/dialogs/process_dialog.rs:133 #: src/ui/dialogs/process_dialog.rs:137 src/ui/dialogs/process_dialog.rs:146 #: src/ui/dialogs/process_dialog.rs:148 src/ui/dialogs/process_dialog.rs:171 #: src/ui/dialogs/process_dialog.rs:178 src/ui/dialogs/process_dialog.rs:185 #: src/ui/dialogs/process_dialog.rs:192 src/ui/pages/applications/mod.rs:948 #: src/ui/pages/applications/mod.rs:1074 src/ui/pages/battery.rs:205 #: src/ui/pages/battery.rs:225 src/ui/pages/battery.rs:231 #: src/ui/pages/battery.rs:234 src/ui/pages/battery.rs:265 #: src/ui/pages/battery.rs:289 src/ui/pages/battery.rs:291 #: src/ui/pages/battery.rs:301 src/ui/pages/cpu.rs:243 src/ui/pages/cpu.rs:258 #: src/ui/pages/cpu.rs:277 src/ui/pages/cpu.rs:283 src/ui/pages/cpu.rs:289 #: src/ui/pages/cpu.rs:295 src/ui/pages/cpu.rs:299 src/ui/pages/cpu.rs:302 #: src/ui/pages/cpu.rs:340 src/ui/pages/cpu.rs:447 src/ui/pages/drive.rs:319 #: src/ui/pages/drive.rs:350 src/ui/pages/drive.rs:352 #: src/ui/pages/drive.rs:381 src/ui/pages/drive.rs:383 #: src/ui/pages/drive.rs:399 src/ui/pages/drive.rs:400 #: src/ui/pages/drive.rs:407 src/ui/pages/drive.rs:417 #: src/ui/pages/drive.rs:427 src/ui/pages/drive.rs:433 src/ui/pages/gpu.rs:244 #: src/ui/pages/gpu.rs:251 src/ui/pages/gpu.rs:296 src/ui/pages/gpu.rs:321 #: src/ui/pages/gpu.rs:324 src/ui/pages/gpu.rs:335 src/ui/pages/gpu.rs:355 #: src/ui/pages/gpu.rs:367 src/ui/pages/gpu.rs:378 src/ui/pages/gpu.rs:390 #: src/ui/pages/gpu.rs:397 src/ui/pages/gpu.rs:401 src/ui/pages/gpu.rs:431 #: src/ui/pages/gpu.rs:437 src/ui/pages/memory.rs:227 #: src/ui/pages/memory.rs:228 src/ui/pages/memory.rs:232 #: src/ui/pages/memory.rs:233 src/ui/pages/memory.rs:237 #: src/ui/pages/memory.rs:238 src/ui/pages/memory.rs:266 #: src/ui/pages/memory.rs:327 src/ui/pages/network.rs:252 #: src/ui/pages/network.rs:259 src/ui/pages/network.rs:266 #: src/ui/pages/network.rs:272 src/ui/pages/network.rs:275 #: src/ui/pages/network.rs:285 src/ui/pages/network.rs:292 #: src/ui/pages/network.rs:302 src/ui/pages/network.rs:370 #: src/ui/pages/network.rs:373 src/ui/pages/network.rs:375 #: src/ui/pages/network.rs:404 src/ui/pages/network.rs:407 #: src/ui/pages/network.rs:409 src/ui/pages/network.rs:417 #: src/ui/pages/network.rs:424 src/ui/pages/network.rs:434 #: src/ui/pages/processes/mod.rs:1224 src/ui/pages/processes/mod.rs:1291 #: src/ui/pages/processes/mod.rs:1358 src/ui/pages/processes/mod.rs:1425 #: src/ui/pages/processes/mod.rs:1911 src/ui/pages/processes/mod.rs:1913 #: src/utils/battery.rs:149 src/utils/drive.rs:136 src/utils/gpu/mod.rs:275 #: src/utils/gpu/mod.rs:287 src/utils/link/mod.rs:61 src/utils/npu/mod.rs:243 #: src/utils/npu/mod.rs:249 msgid "N/A" msgstr "E/E" #: src/ui/dialogs/process_options_dialog.rs:147 src/ui/pages/cpu.rs:257 #: src/ui/pages/cpu.rs:416 src/ui/pages/cpu.rs:420 msgid "CPU {}" msgstr "PUZ {}" #: src/ui/pages/applications/application_entry.rs:190 src/ui/pages/drive.rs:414 #: src/ui/pages/drive.rs:424 src/ui/pages/processes/process_entry.rs:211 msgid "No" msgstr "Ez" #: src/ui/pages/applications/application_entry.rs:191 #: src/ui/pages/processes/process_entry.rs:212 msgid "Yes (Flatpak)" msgstr "Bai (Flatpak)" #: src/ui/pages/applications/application_entry.rs:192 #: src/ui/pages/processes/process_entry.rs:213 msgid "Yes (Snap)" msgstr "Bai (Snap)" #: src/ui/pages/applications/mod.rs:660 msgid "Running Apps: {}" msgstr "Exekuzioan dauden aplikazioak: {}" #: src/ui/pages/applications/mod.rs:700 src/ui/pages/processes/mod.rs:862 msgid "Cancel" msgstr "Utzi" #: src/ui/pages/applications/mod.rs:746 msgid "App" msgstr "Aplikazioa" #: src/ui/pages/applications/mod.rs:1539 src/ui/pages/processes/mod.rs:2073 msgid "End {}?" msgstr "Amaitu {}?" #: src/ui/pages/applications/mod.rs:1540 src/ui/pages/processes/mod.rs:2074 msgid "Halt {}?" msgstr "Gelditu {}?" #: src/ui/pages/applications/mod.rs:1541 src/ui/pages/processes/mod.rs:2075 msgid "Kill {}?" msgstr "Hil {}?" #: src/ui/pages/applications/mod.rs:1542 src/ui/pages/processes/mod.rs:2076 msgid "Continue {}?" msgstr "Jarraitu {}?" #: src/ui/pages/applications/mod.rs:1548 src/ui/pages/processes/mod.rs:2111 msgid "Unsaved work might be lost." msgstr "Gorde gabeko lana galdu egin daiteke." #: src/ui/pages/applications/mod.rs:1550 msgid "" "Halting an app can come with serious risks such as losing data and security " "implications. Use with caution." msgstr "Aplikazioa gelditzen bada, datuak galdu daitezke eta segurtasuna murriztu daiteke. Erabili kontuz." #: src/ui/pages/applications/mod.rs:1553 msgid "" "Killing an app can come with serious risks such as losing data and security " "implications. Use with caution." msgstr "Aplikazioa hiltzen bada, datuak galdu daitezke eta segurtasuna murriztu daiteke. Erabili kontuz." #: src/ui/pages/battery.rs:102 src/utils/battery.rs:261 msgid "Battery" msgstr "Bateria" #: src/ui/pages/battery.rs:210 msgid "Battery Charge" msgstr "Bateria-karga" #: src/ui/pages/battery.rs:279 src/ui/pages/cpu.rs:437 #: src/ui/pages/drive.rs:344 src/ui/pages/drive.rs:375 src/ui/pages/gpu.rs:423 #: src/ui/pages/network.rs:362 src/ui/pages/network.rs:396 msgid "Highest:" msgstr "Altuena:" #: src/ui/pages/cpu.rs:242 src/ui/pages/gpu.rs:211 msgid "Total Usage" msgstr "Erabilera guztira" #: src/ui/pages/cpu.rs:270 src/ui/pages/gpu.rs:238 msgid "Temperature" msgstr "Tenperatura" #: src/ui/pages/drive.rs:126 msgid "Drive" msgstr "Unitatea" #: src/ui/pages/drive.rs:236 msgid "Drive Activity" msgstr "Unitate-jarduera" #: src/ui/pages/drive.rs:243 msgid "Read Speed" msgstr "Irakurtze-abiadura" #: src/ui/pages/drive.rs:247 msgid "Write Speed" msgstr "Idazte-abiadura" #: src/ui/pages/drive.rs:412 src/ui/pages/drive.rs:422 msgid "Yes" msgstr "Bai" #. Translators: This is an abbreviation for "Read" and "Write". This is displayed in the sidebar so your #. translation should preferably be quite short or an abbreviation #: src/ui/pages/drive.rs:440 msgid "R: {} · W: {}" msgstr "R: {} · W: {}" #: src/ui/pages/gpu.rs:219 msgid "Video Encoder/Decoder Usage" msgstr "Bideo-kodetzailearen/deskodetzailearen erabilera" #: src/ui/pages/gpu.rs:225 msgid "Video Encoder Usage" msgstr "Bideo-kodetzailearen erabilera" #: src/ui/pages/gpu.rs:230 msgid "Video Decoder Usage" msgstr "Bideo-deskodetzailearen erabilera" #: src/ui/pages/gpu.rs:235 msgid "Video Memory Usage" msgstr "Bideo-memoriaren erabilera" #. Translators: This will be displayed in the sidebar, please try to keep your translation as short as (or even #. shorter than) 'Memory' #: src/ui/pages/gpu.rs:409 msgid "Memory: {}" msgstr "Memoria: {}" #: src/ui/pages/memory.rs:262 msgid "{} of {}" msgstr "{} / {}" #: src/ui/pages/memory.rs:265 msgid "{} MT/s" msgstr "{} MT/s" #. Translators: This will be displayed in the sidebar, so your translation for "Swap" should #. preferably be quite short or an abbreviation #: src/ui/pages/memory.rs:346 msgid "{} / {} · Swap: {} %" msgstr "{} / {} · Trukatze-espazioa: {} %" #: src/ui/pages/network.rs:127 src/utils/network.rs:135 msgid "Network Interface" msgstr "Sareko interfazea" #: src/ui/pages/network.rs:241 msgid "Receiving" msgstr "Jasotzen" #: src/ui/pages/network.rs:245 msgid "Sending" msgstr "Bidaltzen" #. Translators: This is an abbreviation for "Receive" and "Send". This is displayed in the sidebar so #. your translation should preferably be quite short or an abbreviation #: src/ui/pages/network.rs:445 msgid "R: {} · S: {}" msgstr "B: {} · J: {}" #: src/ui/pages/processes/mod.rs:813 msgid "Running Processes: {}" msgstr "Exekuzioan dauden prozesuak: {}" #: src/ui/pages/processes/mod.rs:911 msgid "Process" msgstr "Prozesua" #: src/ui/pages/processes/mod.rs:2083 msgid "End process?" msgid_plural "End {} processes?" msgstr[0] "Amaitu prozesua?" msgstr[1] "Amaitu {} prozesu?" #: src/ui/pages/processes/mod.rs:2089 msgid "Halt process?" msgid_plural "Halt {} processes?" msgstr[0] "Gelditu prozesua?" msgstr[1] "Gelditu {} prozesu?" #: src/ui/pages/processes/mod.rs:2095 src/ui/pages/processes/mod.rs:2101 msgid "Kill process?" msgid_plural "Kill {} processes?" msgstr[0] "Hil prozesua?" msgstr[1] "Hil {} prozesu?" #: src/ui/pages/processes/mod.rs:2113 msgid "" "Halting a process can come with serious risks such as losing data and " "security implications. Use with caution." msgstr "Prozesua gelditzen bada, datuak galdu daitezke eta segurtasuna murriztu daiteke. Erabili kontuz." #: src/ui/pages/processes/mod.rs:2116 msgid "" "Killing a process can come with serious risks such as losing data and " "security implications. Use with caution." msgstr "Prozesua hiltzen bada, datuak galdu daitezke eta segurtasuna murriztu daiteke. Erabili kontuz." #: src/ui/window.rs:466 msgid "GPU {}" msgstr "PUG {}" #: src/ui/window.rs:496 msgid "NPU {}" msgstr "NPU {}" #: src/ui/window.rs:498 msgid "NPU" msgstr "NPU" #: src/ui/window.rs:1167 msgid "Successfully adjusted {}" msgstr "{} ongi doitu da" #: src/ui/window.rs:1168 msgid "There was a problem adjusting {}" msgstr "Arazoa gertatu da {} doitzean" #: src/ui/window.rs:1250 msgid "Successfully ended {}" msgstr "{} ongi amaitu da" #: src/ui/window.rs:1251 msgid "Successfully halted {}" msgstr "{} ongi gelditu da" #: src/ui/window.rs:1252 msgid "Successfully killed {}" msgstr "{} ongi hil da" #: src/ui/window.rs:1253 msgid "Successfully continued {}" msgstr "{} ongi jarraitu da" #: src/ui/window.rs:1260 msgid "Successfully ended the process" msgid_plural "Successfully ended {} processes" msgstr[0] "Prozesua ongi amaitu da" msgstr[1] "{} prozesu ongi amaitu dira" #: src/ui/window.rs:1266 msgid "Successfully halted the process" msgid_plural "Successfully halted {} processes" msgstr[0] "Prozesua ongi gelditu da" msgstr[1] "{} prozesu ongi gelditu dira" #: src/ui/window.rs:1272 msgid "Successfully killed the process" msgid_plural "Successfully killed {} processes" msgstr[0] "Prozesua ongi hil da" msgstr[1] "{} prozesu ongi hil dira" #: src/ui/window.rs:1278 msgid "Successfully continued the process" msgid_plural "Successfully continued {} processes" msgstr[0] "Prozesua ongi jarraitu da" msgstr[1] "{} prozesu ongi jarraitu dira" #: src/ui/window.rs:1289 msgid "There was a problem ending a process" msgid_plural "There were problems ending {} processes" msgstr[0] "Arazoa gertatu da prozesu bat amaitzean" msgstr[1] "Arazoa gertatu da {} prozesu amaitzean" #: src/ui/window.rs:1295 msgid "There was a problem halting a process" msgid_plural "There were problems halting {} processes" msgstr[0] "Arazoa gertatu da prozesu bat gelditzean" msgstr[1] "Arazoa gertatu da {} prozesu gelditzean" #: src/ui/window.rs:1301 msgid "There was a problem killing a process" msgid_plural "There were problems killing {} processes" msgstr[0] "Arazoa gertatu da prozesu bat hiltzean" msgstr[1] "Arazoa gertatu da {} prozesu hiltzean" #: src/ui/window.rs:1307 msgid "There was a problem continuing a process" msgid_plural "There were problems continuing {} processes" msgstr[0] "Arazoa gertatu da prozesu bat jarraitzean" msgstr[1] "Arazoa gertatu da {} prozesu jarraitzean" #: src/ui/window.rs:1317 msgid "There was a problem ending {}" msgstr "Arazoa gertatu da {} amaitzean" #: src/ui/window.rs:1318 msgid "There was a problem halting {}" msgstr "Arazoa gertatu da {} gelditzean" #: src/ui/window.rs:1319 msgid "There was a problem killing {}" msgstr "Arazoa gertatu da {} hiltzean" #: src/ui/window.rs:1320 msgid "There was a problem continuing {}" msgstr "Arazoa gertatu da {} jarraitzean" #: src/utils/app.rs:219 msgid "System Processes" msgstr "Sistema-prozesuak" #: src/utils/battery.rs:90 msgid "Charging" msgstr "Kargatzen" #: src/utils/battery.rs:91 msgid "Discharging" msgstr "Deskargatzen" #: src/utils/battery.rs:92 msgid "Empty" msgstr "Hutsa" #: src/utils/battery.rs:93 msgid "Full" msgstr "Osoa" #: src/utils/battery.rs:94 msgid "Unknown" msgstr "Ezezaguna" #: src/utils/battery.rs:140 msgid "Nickel-Metal Hydride" msgstr "Nikel-metal hibridoa" #: src/utils/battery.rs:141 msgid "Nickel-Cadmium" msgstr "Nikel-kacmioa" #: src/utils/battery.rs:142 msgid "Nickel-Zinc" msgstr "Nikel-zinka" #: src/utils/battery.rs:143 msgid "Lead-Acid" msgstr "Berun-azidoa" #: src/utils/battery.rs:144 msgid "Lithium-Ion" msgstr "Litio-ioia" #: src/utils/battery.rs:145 msgid "Lithium Iron Phosphate" msgstr "Litio-ioi fosfatoa" #: src/utils/battery.rs:146 msgid "Lithium Polymer" msgstr "Litiozko polimeroa" #: src/utils/battery.rs:148 msgid "Rechargeable Alkaline Managanese" msgstr "Alkalino manganeso birkargagarria" #: src/utils/battery.rs:259 msgid "{} Battery" msgstr "{} bateria" #: src/utils/units.rs:91 msgid "{} K" msgstr "{} K" #: src/utils/units.rs:93 msgid "{} °C" msgstr "{} °C" #: src/utils/units.rs:95 msgid "{} °F" msgstr "{} °F" #: src/utils/units.rs:113 src/utils/units.rs:127 src/utils/units.rs:147 #: src/utils/units.rs:161 msgid "{} B" msgstr "{} B" #: src/utils/units.rs:114 src/utils/units.rs:128 msgid "{} kB" msgstr "{} kB" #: src/utils/units.rs:115 src/utils/units.rs:129 msgid "{} MB" msgstr "{} MB" #: src/utils/units.rs:116 src/utils/units.rs:130 msgid "{} GB" msgstr "{} GB" #: src/utils/units.rs:117 src/utils/units.rs:131 msgid "{} TB" msgstr "{} TB" #: src/utils/units.rs:118 src/utils/units.rs:132 msgid "{} PB" msgstr "{} PB" #: src/utils/units.rs:119 src/utils/units.rs:133 msgid "{} EB" msgstr "{} EB" #: src/utils/units.rs:120 src/utils/units.rs:134 msgid "{} ZB" msgstr "{} ZB" #: src/utils/units.rs:121 src/utils/units.rs:135 msgid "{} YB" msgstr "{} YB" #: src/utils/units.rs:122 src/utils/units.rs:136 msgid "{} RB" msgstr "{} RB" #: src/utils/units.rs:123 src/utils/units.rs:137 msgid "{} QB" msgstr "{} QB" #: src/utils/units.rs:148 src/utils/units.rs:162 msgid "{} KiB" msgstr "{} KiB" #: src/utils/units.rs:149 src/utils/units.rs:163 msgid "{} MiB" msgstr "{} MiB" #: src/utils/units.rs:150 src/utils/units.rs:164 msgid "{} GiB" msgstr "{} GiB" #: src/utils/units.rs:151 src/utils/units.rs:165 msgid "{} TiB" msgstr "{} TiB" #: src/utils/units.rs:152 src/utils/units.rs:166 msgid "{} PiB" msgstr "{} PiB" #: src/utils/units.rs:153 src/utils/units.rs:167 msgid "{} EiB" msgstr "{} EiB" #: src/utils/units.rs:154 src/utils/units.rs:168 msgid "{} ZiB" msgstr "{} ZiB" #: src/utils/units.rs:155 src/utils/units.rs:169 msgid "{} YiB" msgstr "{} YiB" #: src/utils/units.rs:156 src/utils/units.rs:170 msgid "{} RiB" msgstr "{} RiB" #: src/utils/units.rs:157 src/utils/units.rs:171 msgid "{} QiB" msgstr "{} QiB" #: src/utils/units.rs:198 src/utils/units.rs:215 msgid "{} B/s" msgstr "{} B/s" #: src/utils/units.rs:199 msgid "{} kB/s" msgstr "{} kB/s" #: src/utils/units.rs:200 msgid "{} MB/s" msgstr "{} MB/s" #: src/utils/units.rs:201 msgid "{} GB/s" msgstr "{} GB/s" #: src/utils/units.rs:202 msgid "{} TB/s" msgstr "{} TB/s" #: src/utils/units.rs:203 msgid "{} PB/s" msgstr "{} PB/s" #: src/utils/units.rs:204 msgid "{} EB/s" msgstr "{} EB/s" #: src/utils/units.rs:205 msgid "{} ZB/s" msgstr "{} ZB/s" #: src/utils/units.rs:206 msgid "{} YB/s" msgstr "{} YB/s" #: src/utils/units.rs:207 msgid "{} RB/s" msgstr "{} RB/s" #: src/utils/units.rs:208 msgid "{} QB/s" msgstr "{} QB/s" #: src/utils/units.rs:216 msgid "{} KiB/s" msgstr "{} KiB/s" #: src/utils/units.rs:217 msgid "{} MiB/s" msgstr "{} MiB/s" #: src/utils/units.rs:218 msgid "{} GiB/s" msgstr "{} GiB/s" #: src/utils/units.rs:219 msgid "{} TiB/s" msgstr "{} TiB/s" #: src/utils/units.rs:220 msgid "{} PiB/s" msgstr "{} PiB/s" #: src/utils/units.rs:221 msgid "{} EiB/s" msgstr "{} EiB/s" #: src/utils/units.rs:222 msgid "{} ZiB/s" msgstr "{} ZiB/s" #: src/utils/units.rs:223 msgid "{} YiB/s" msgstr "{} YiB/s" #: src/utils/units.rs:224 msgid "{} RiB/s" msgstr "{} RiB/s" #: src/utils/units.rs:225 msgid "{} QiB/s" msgstr "{} QiB/s" #: src/utils/units.rs:239 src/utils/units.rs:256 msgid "{} b/s" msgstr "{} b/s" #: src/utils/units.rs:240 msgid "{} kb/s" msgstr "{} kb/s" #: src/utils/units.rs:241 msgid "{} Mb/s" msgstr "{} MB/s" #: src/utils/units.rs:242 msgid "{} Gb/s" msgstr "{} Gb/s" #: src/utils/units.rs:243 msgid "{} Tb/s" msgstr "{} TB/s" #: src/utils/units.rs:244 msgid "{} Pb/s" msgstr "{} Pb/s" #: src/utils/units.rs:245 msgid "{} Eb/s" msgstr "{} Eb/s" #: src/utils/units.rs:246 msgid "{} Zb/s" msgstr "{} Zb/s" #: src/utils/units.rs:247 msgid "{} Yb/s" msgstr "{} Yb/s" #: src/utils/units.rs:248 msgid "{} Rb/s" msgstr "{} Rb/s" #: src/utils/units.rs:249 msgid "{} Qb/s" msgstr "{} Qb/s" #: src/utils/units.rs:257 msgid "{} Kib/s" msgstr "{} KiB/s" #: src/utils/units.rs:258 msgid "{} Mib/s" msgstr "{} Mib/s" #: src/utils/units.rs:259 msgid "{} Gib/s" msgstr "{} GiB/s" #: src/utils/units.rs:260 msgid "{} Tib/s" msgstr "{} TiB/s" #: src/utils/units.rs:261 msgid "{} Pib/s" msgstr "{} PiB/s" #: src/utils/units.rs:262 msgid "{} Eib/s" msgstr "{} Eib/s" #: src/utils/units.rs:263 msgid "{} Zib/s" msgstr "{} Zib/s" #: src/utils/units.rs:264 msgid "{} Yib/s" msgstr "{} YiB/s" #: src/utils/units.rs:265 msgid "{} Rib/s" msgstr "{} RiB/s" #: src/utils/units.rs:266 msgid "{} Qib/s" msgstr "{} QiB/s" #: src/utils/units.rs:273 msgid "{} Hz" msgstr "{} Hz" #: src/utils/units.rs:274 msgid "{} kHz" msgstr "{} kHz" #: src/utils/units.rs:275 msgid "{} MHz" msgstr "{} MHz" #: src/utils/units.rs:276 msgid "{} GHz" msgstr "{} GHz" #: src/utils/units.rs:277 msgid "{} THz" msgstr "{} THz" #: src/utils/units.rs:278 msgid "{} PHz" msgstr "{} PHz" #: src/utils/units.rs:279 msgid "{} EHz" msgstr "{} EHz" #: src/utils/units.rs:280 msgid "{} ZHz" msgstr "{} ZHz" #: src/utils/units.rs:281 msgid "{} YHz" msgstr "{} YHz" #: src/utils/units.rs:282 msgid "{} RHz" msgstr "{} RHz" #: src/utils/units.rs:283 msgid "{} QHz" msgstr "{} QHz" #: src/utils/units.rs:290 msgid "{} W" msgstr "{} W" #: src/utils/units.rs:291 msgid "{} kW" msgstr "{} kW" #: src/utils/units.rs:292 msgid "{} MW" msgstr "{} MW" #: src/utils/units.rs:293 msgid "{} GW" msgstr "{} GW" #: src/utils/units.rs:294 msgid "{} TW" msgstr "{} TW" #: src/utils/units.rs:295 msgid "{} PW" msgstr "{} PW" #: src/utils/units.rs:296 msgid "{} EW" msgstr "{} EW" #: src/utils/units.rs:297 msgid "{} ZW" msgstr "{} ZW" #: src/utils/units.rs:298 msgid "{} YW" msgstr "{} YW" #: src/utils/units.rs:299 msgid "{} RW" msgstr "{} RW" #: src/utils/units.rs:300 msgid "{} QW" msgstr "{} QW" #: src/utils/units.rs:309 src/utils/units.rs:323 msgid "{} Wh" msgstr "{} Wh" #: src/utils/units.rs:310 src/utils/units.rs:324 msgid "{} kWh" msgstr "{} kWh" #: src/utils/units.rs:311 src/utils/units.rs:325 msgid "{} MWh" msgstr "{} MWh" #: src/utils/units.rs:312 src/utils/units.rs:326 msgid "{} GWh" msgstr "{} GWh" #: src/utils/units.rs:313 src/utils/units.rs:327 msgid "{} TWh" msgstr "{} TWh" #: src/utils/units.rs:314 src/utils/units.rs:328 msgid "{} PWh" msgstr "{} PWh" #: src/utils/units.rs:315 src/utils/units.rs:329 msgid "{} EWh" msgstr "{} EWh" #: src/utils/units.rs:316 src/utils/units.rs:330 msgid "{} ZWh" msgstr "{} ZWh" #: src/utils/units.rs:317 src/utils/units.rs:331 msgid "{} YWh" msgstr "{} YWh" #: src/utils/units.rs:318 src/utils/units.rs:332 msgid "{} RWh" msgstr "{} RWh" #: src/utils/units.rs:319 src/utils/units.rs:333 msgid "{} QWh" msgstr "{} QWh" #: src/utils/drive.rs:128 src/utils/drive.rs:207 msgid "CD/DVD/Blu-ray Drive" msgstr "CD/DVD/Blu-ray unitatea" #: src/utils/drive.rs:129 msgid "eMMC Storage" msgstr "eMMC biltegiratzea" #: src/utils/drive.rs:130 msgid "Flash Storage" msgstr "Flash biltegiratzea" #: src/utils/drive.rs:131 src/utils/drive.rs:208 msgid "Floppy Drive" msgstr "Disketea" #: src/utils/drive.rs:132 msgid "Hard Disk Drive" msgstr "Disko gogorra" #: src/utils/drive.rs:133 msgid "Loop Device" msgstr "Begizta-gailua" #: src/utils/drive.rs:134 msgid "Mapped Device" msgstr "Mapatutako gailua" #: src/utils/drive.rs:135 msgid "NVMe Drive" msgstr "NVMe unitatea" #: src/utils/drive.rs:137 msgid "Software Raid" msgstr "Software bidezko raid-a" #: src/utils/drive.rs:138 msgid "RAM Disk" msgstr "RAM diskoa" #: src/utils/drive.rs:139 msgid "Solid State Drive" msgstr "Egoerako solidoko unitatea" #: src/utils/drive.rs:140 msgid "ZFS Volume" msgstr "ZFS bolumena" #: src/utils/drive.rs:141 msgid "Compressed RAM Disk (zram)" msgstr "Konprimatutako RAM diskoa (zram)" #: src/utils/drive.rs:209 msgid "{} Loop Device" msgstr "{} begizta-gailua" #: src/utils/drive.rs:210 msgid "{} Mapped Device" msgstr "{} mapatutako gailua" #: src/utils/drive.rs:211 msgid "{} RAID" msgstr "{} RAID" #: src/utils/drive.rs:212 msgid "{} RAM Disk" msgstr "{} RAM diskoa" #: src/utils/drive.rs:213 msgid "{} zram Device" msgstr "{} zram gailua" #: src/utils/drive.rs:214 msgid "{} ZFS Volume" msgstr "{} ZFS bolumena" #: src/utils/drive.rs:215 msgid "{} Drive" msgstr "{} unitatea" #: src/utils/network.rs:123 msgid "Bluetooth Tether" msgstr "Bluetooth aingura" #: src/utils/network.rs:124 msgid "Network Bridge" msgstr "Sareko zubia" #: src/utils/network.rs:125 msgid "Ethernet Connection" msgstr "Ethernet konexioa" #: src/utils/network.rs:126 msgid "Docker Bridge" msgstr "Docker zubia" #: src/utils/network.rs:127 msgid "InfiniBand Connection" msgstr "InfiniBand konexioa" #: src/utils/network.rs:128 msgid "Serial Line IP Connection" msgstr "Serieko lineako IP konexioa" #: src/utils/network.rs:129 msgid "Virtual Ethernet Device" msgstr "Ethernet gailu birtuala" #: src/utils/network.rs:130 msgid "VM Network Bridge" msgstr "VM sareko zubia" #: src/utils/network.rs:131 msgid "VPN Tunnel" msgstr "VPN tunela" #: src/utils/network.rs:132 msgid "VPN Tunnel (WireGuard)" msgstr "VPN tunela (WireGuard)" #: src/utils/network.rs:133 msgid "Wi-Fi Connection" msgstr "Wifi konexioa" #: src/utils/network.rs:134 msgid "WWAN Connection" msgstr "WWAN konexioa" resources-1.9.1/po/fa.po000066400000000000000000001524361510634446000151160ustar00rootroot00000000000000# Persian translations for PACKAGE package. # Copyright (C) 2025 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # sobhan , 2025. # Danial Behzadi , 2025. # msgid "" msgstr "" "Project-Id-Version: 1\n" "Report-Msgid-Bugs-To: https://github.com/nokyan/resources/issues/\n" "POT-Creation-Date: 2025-10-11 03:36+0000\n" "PO-Revision-Date: 2025-10-11 14:24+0330\n" "Last-Translator: Danial Behzadi \n" "Language-Team: Persian\n" "Language: fa\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: Gtranslator 48.0\n" #: data/net.nokyan.Resources.desktop.in.in:2 #: data/net.nokyan.Resources.metainfo.xml.in.in:4 #: data/resources/ui/window.ui:22 src/application.rs:272 msgid "Resources" msgstr "منابع" #. Translators: The summary should be 35 characters or less according to Flathub appstream guidelines #: data/net.nokyan.Resources.desktop.in.in:3 #: data/net.nokyan.Resources.metainfo.xml.in.in:5 msgid "Keep an eye on system resources" msgstr "نگاهی به منابع سامانه" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/net.nokyan.Resources.desktop.in.in:9 msgid "System;Resources;Monitor;Processes;Usage;Task;Manager;CPU;RAM;Memory;GPU;" msgstr "System;Resources;Monitor;Processes;Usage;Task;Manager;CPU;RAM;Memory;GPU;سامانه;منابع;پایش;فرایند;مصرف;وظیفه;مدیر;پردازنده;رم;حافظه;گرافیک;" #: data/net.nokyan.Resources.metainfo.xml.in.in:17 msgid "" "Resources allows you to check the utilization of your system resources and " "control your running processes and apps. It’s designed to be user-friendly " "and feel right at home on a modern desktop by using GNOME’s libadwaita." msgstr "" "منابع می‌گذارد استفاده از منابع سامانه‌تان را بررسی کرده و کاره‌ها و فرایندهای " "در حال اجرا را وابپایید. این برنامه با استفاده از libadwiataی گنوم برای " "کاربرپسند بودن و دادن حس بودن در خانه روی میزکارهای نوین طرّاحی شده." #: data/net.nokyan.Resources.metainfo.xml.in.in:20 msgid "Resources supports monitoring the following components:" msgstr "منابع از پایش مولّفه‌های زیر پشتیبانی می‌کند:" #: data/net.nokyan.Resources.metainfo.xml.in.in:24 msgid "CPU" msgstr "پردازنده" #: data/net.nokyan.Resources.metainfo.xml.in.in:25 #: data/resources/ui/dialogs/app_dialog.ui:82 #: data/resources/ui/dialogs/process_dialog.ui:64 #: data/resources/ui/dialogs/settings_dialog.ui:128 #: data/resources/ui/dialogs/settings_dialog.ui:220 #: data/resources/ui/window.ui:176 data/resources/ui/window.ui:183 #: src/ui/pages/applications/mod.rs:803 src/ui/pages/memory.rs:106 #: src/ui/pages/memory.rs:192 src/ui/pages/processes/mod.rs:1080 msgid "Memory" msgstr "حافظه" #: data/net.nokyan.Resources.metainfo.xml.in.in:26 #: data/resources/ui/dialogs/app_dialog.ui:140 #: data/resources/ui/dialogs/process_dialog.ui:118 #: data/resources/ui/dialogs/settings_dialog.ui:158 #: data/resources/ui/dialogs/settings_dialog.ui:250 #: src/ui/pages/applications/mod.rs:1181 src/ui/pages/gpu.rs:119 #: src/ui/pages/processes/mod.rs:1470 src/ui/window.rs:468 msgid "GPU" msgstr "شتاب‌دهندهٔ گرافیکی" #: data/net.nokyan.Resources.metainfo.xml.in.in:27 #: data/resources/ui/dialogs/settings_dialog.ui:324 msgid "Network Interfaces" msgstr "میاناهای شبکه" #: data/net.nokyan.Resources.metainfo.xml.in.in:28 msgid "Storage Devices" msgstr "افزاره‌های ذخیره‌سازی" #: data/net.nokyan.Resources.metainfo.xml.in.in:29 msgid "Batteries" msgstr "باتری‌ها" #: data/net.nokyan.Resources.metainfo.xml.in.in:51 msgid "Apps page in light theme" msgstr "صفحهٔ کاره‌ها در زمینهٔ روشن" #: data/net.nokyan.Resources.metainfo.xml.in.in:55 msgid "Processes page in dark theme" msgstr "صفحهٔ فرایندها در زمینهٔ تیره" #: data/net.nokyan.Resources.metainfo.xml.in.in:59 msgid "Processor page in light theme" msgstr "صفحهٔ فرایندها در زمینهٔ روشن" #: data/net.nokyan.Resources.metainfo.xml.in.in:63 msgid "Memory page in dark theme" msgstr "صفحهٔ حافظه در زمینهٔ تیره" #: data/net.nokyan.Resources.metainfo.xml.in.in:67 msgid "GPU page in light theme" msgstr "صفحهٔ گرافیک در زمینهٔ روشن" #: data/net.nokyan.Resources.metainfo.xml.in.in:71 msgid "Drive page in dark theme" msgstr "صفحهٔ گرداننده در زمینهٔ تیره" #: data/net.nokyan.Resources.metainfo.xml.in.in:75 msgid "Network Interface page in light theme" msgstr "صفحهٔ میانای شبکه در زمینهٔ روشن" #: data/net.nokyan.Resources.metainfo.xml.in.in:79 msgid "Battery page in dark theme" msgstr "صفحهٔ باتری در زمینهٔ تیره" #: data/net.nokyan.Resources.policy.in.in:9 msgid "Control Process" msgstr "واپایش فرایند" #: data/net.nokyan.Resources.policy.in.in:10 msgid "" "Authentication is required to control superuser’s or other users’ processes" msgstr "نیازمند هویت‌سنجی برای واپایش فرایند‌های ابرکاربر یا دیگر کاربران" #: data/resources/ui/dialogs/app_dialog.ui:7 msgid "App Information" msgstr "اطّلاعات کاره" #: data/resources/ui/dialogs/app_dialog.ui:70 #: data/resources/ui/dialogs/process_dialog.ui:48 #: data/resources/ui/pages/battery.ui:22 data/resources/ui/pages/cpu.ui:37 #: data/resources/ui/pages/cpu.ui:50 data/resources/ui/pages/drive.ui:22 #: data/resources/ui/pages/gpu.ui:22 data/resources/ui/pages/memory.ui:31 #: data/resources/ui/pages/network.ui:22 data/resources/ui/pages/npu.ui:22 msgid "Usage" msgstr "استفاده" #: data/resources/ui/dialogs/app_dialog.ui:73 #: data/resources/ui/dialogs/process_dialog.ui:55 #: data/resources/ui/dialogs/settings_dialog.ui:133 #: data/resources/ui/dialogs/settings_dialog.ui:225 #: data/resources/ui/window.ui:145 data/resources/ui/window.ui:152 #: src/ui/pages/applications/mod.rs:862 src/ui/pages/cpu.rs:128 #: src/ui/pages/processes/mod.rs:1139 src/ui/window.rs:290 msgid "Processor" msgstr "پردازنده" #: data/resources/ui/dialogs/app_dialog.ui:91 #: data/resources/ui/dialogs/process_dialog.ui:73 #: data/resources/ui/dialogs/settings_dialog.ui:178 #: data/resources/ui/dialogs/settings_dialog.ui:290 #: src/ui/pages/applications/mod.rs:1420 src/ui/pages/memory.rs:198 #: src/ui/pages/processes/mod.rs:1955 msgid "Swap" msgstr "مبادله" #: data/resources/ui/dialogs/app_dialog.ui:100 #: data/resources/ui/dialogs/process_dialog.ui:78 #: data/resources/ui/dialogs/settings_dialog.ui:138 #: data/resources/ui/dialogs/settings_dialog.ui:230 #: src/ui/pages/applications/mod.rs:926 src/ui/pages/processes/mod.rs:1203 msgid "Drive Read" msgstr "خواندن گرداننده" #: data/resources/ui/dialogs/app_dialog.ui:109 #: data/resources/ui/dialogs/process_dialog.ui:87 #: data/resources/ui/dialogs/settings_dialog.ui:143 #: data/resources/ui/dialogs/settings_dialog.ui:235 #: src/ui/pages/applications/mod.rs:991 src/ui/pages/processes/mod.rs:1270 msgid "Drive Read Total" msgstr "مجموع خواندن گرداننده" #: data/resources/ui/dialogs/app_dialog.ui:118 #: data/resources/ui/dialogs/process_dialog.ui:96 #: data/resources/ui/dialogs/settings_dialog.ui:148 #: data/resources/ui/dialogs/settings_dialog.ui:240 #: src/ui/pages/applications/mod.rs:1052 src/ui/pages/processes/mod.rs:1337 msgid "Drive Write" msgstr "نوشتن گرداننده" #: data/resources/ui/dialogs/app_dialog.ui:127 #: data/resources/ui/dialogs/process_dialog.ui:105 #: data/resources/ui/dialogs/settings_dialog.ui:153 #: data/resources/ui/dialogs/settings_dialog.ui:245 #: src/ui/pages/applications/mod.rs:1119 src/ui/pages/processes/mod.rs:1404 msgid "Drive Write Total" msgstr "مجموع نوشتن گرداننده" #: data/resources/ui/dialogs/app_dialog.ui:149 #: data/resources/ui/dialogs/process_dialog.ui:127 #: data/resources/ui/dialogs/settings_dialog.ui:163 #: data/resources/ui/dialogs/settings_dialog.ui:255 #: src/ui/pages/applications/mod.rs:1361 src/ui/pages/processes/mod.rs:1651 msgid "Video Memory" msgstr "حافظهٔ ویدیویی" #: data/resources/ui/dialogs/app_dialog.ui:158 #: data/resources/ui/dialogs/process_dialog.ui:136 #: data/resources/ui/dialogs/settings_dialog.ui:168 #: data/resources/ui/dialogs/settings_dialog.ui:260 #: src/ui/pages/applications/mod.rs:1240 src/ui/pages/processes/mod.rs:1529 msgid "Video Encoder" msgstr "کدگذار ویدیوی" #: data/resources/ui/dialogs/app_dialog.ui:167 #: data/resources/ui/dialogs/process_dialog.ui:145 #: data/resources/ui/dialogs/settings_dialog.ui:173 #: data/resources/ui/dialogs/settings_dialog.ui:265 #: src/ui/pages/applications/mod.rs:1301 src/ui/pages/processes/mod.rs:1590 msgid "Video Decoder" msgstr "کدگشای ویدیویی" #: data/resources/ui/dialogs/app_dialog.ui:174 #: data/resources/ui/dialogs/process_dialog.ui:179 #: data/resources/ui/pages/battery.ui:33 data/resources/ui/pages/cpu.ui:83 #: data/resources/ui/pages/drive.ui:54 data/resources/ui/pages/gpu.ui:74 #: data/resources/ui/pages/memory.ui:42 data/resources/ui/pages/network.ui:51 #: data/resources/ui/pages/npu.ui:68 msgid "Properties" msgstr "ویژگی‌ها" #: data/resources/ui/dialogs/app_dialog.ui:180 msgid "ID" msgstr "شناسه" #: data/resources/ui/dialogs/app_dialog.ui:190 #: data/resources/ui/dialogs/process_dialog.ui:195 msgid "Running Since" msgstr "در حال اجرا از" #: data/resources/ui/dialogs/app_dialog.ui:198 msgid "Running Processes" msgstr "فرایندهای در حال اجرا" #: data/resources/ui/dialogs/app_dialog.ui:207 #: data/resources/ui/dialogs/process_dialog.ui:231 msgid "Containerized" msgstr "بارگنجیده" #: data/resources/ui/dialogs/process_dialog.ui:7 msgid "Process Information" msgstr "اطّلاعات فرایند" #: data/resources/ui/dialogs/process_dialog.ui:154 #: data/resources/ui/dialogs/settings_dialog.ui:270 #: src/ui/pages/processes/mod.rs:1711 msgid "Total CPU Time" msgstr "مجموع زمان پردازنده" #: data/resources/ui/dialogs/process_dialog.ui:163 #: data/resources/ui/dialogs/settings_dialog.ui:275 #: src/ui/pages/processes/mod.rs:1770 msgid "User CPU Time" msgstr "زمان پردازندهٔ کاربر" #: data/resources/ui/dialogs/process_dialog.ui:172 #: data/resources/ui/dialogs/settings_dialog.ui:280 #: src/ui/pages/processes/mod.rs:1829 msgid "System CPU Time" msgstr "زمان پردازندهٔ سامانه" #: data/resources/ui/dialogs/process_dialog.ui:186 #: data/resources/ui/dialogs/settings_dialog.ui:210 #: src/ui/pages/processes/mod.rs:973 msgid "Process ID" msgstr "شناسهٔ فرایند" #: data/resources/ui/dialogs/process_dialog.ui:204 #: data/resources/ui/dialogs/settings_dialog.ui:300 #: src/ui/pages/processes/mod.rs:2075 msgid "Commandline" msgstr "خط فرمان" #: data/resources/ui/dialogs/process_dialog.ui:213 #: data/resources/ui/dialogs/settings_dialog.ui:215 #: src/ui/pages/processes/mod.rs:1026 msgid "User" msgstr "کاربر" #: data/resources/ui/dialogs/process_dialog.ui:222 msgid "Control Group" msgstr "گروه واپایشی" #: data/resources/ui/dialogs/process_options_dialog.ui:7 #: data/resources/ui/dialogs/process_options_dialog.ui:69 msgid "Process Options" msgstr "گزینه‌های فرایند" #: data/resources/ui/dialogs/process_options_dialog.ui:29 msgid "Apply" msgstr "اِعمال" #: data/resources/ui/dialogs/process_options_dialog.ui:72 msgid "Niceness" msgstr "خوبی" #: data/resources/ui/dialogs/process_options_dialog.ui:73 msgid "" "The priority of a process is given by its niceness. A lower niceness value " "correspond to a higher priority." msgstr "" "اولویت فرایند بر اساس خوبیش داده می‌شود. مقدار خوبی کم‌تر معادل اولویت بیش‌تر " "است." #: data/resources/ui/dialogs/process_options_dialog.ui:87 #: data/resources/ui/dialogs/settings_dialog.ui:285 #: src/ui/pages/processes/mod.rs:1888 msgid "Priority" msgstr "اولویت" #: data/resources/ui/dialogs/process_options_dialog.ui:91 msgctxt "process priority" msgid "Very High" msgstr "خیلی زیاد" #: data/resources/ui/dialogs/process_options_dialog.ui:92 msgctxt "process priority" msgid "High" msgstr "زیاد" #: data/resources/ui/dialogs/process_options_dialog.ui:93 msgctxt "process priority" msgid "Normal" msgstr "معمول" #: data/resources/ui/dialogs/process_options_dialog.ui:94 msgctxt "process priority" msgid "Low" msgstr "کم" #: data/resources/ui/dialogs/process_options_dialog.ui:95 msgctxt "process priority" msgid "Very Low" msgstr "خیلی کم" #: data/resources/ui/dialogs/process_options_dialog.ui:103 msgid "Processor Affinity" msgstr "تخصیص پردازنده" #: data/resources/ui/dialogs/process_options_dialog.ui:108 msgid "Toggle All" msgstr "تغییر وضعیت همه" #: data/resources/ui/dialogs/process_options_dialog.ui:111 msgid "Select which processor cores the process is allowed to run on" msgstr "گزینش هسته‌های پردازنده‌ای که فرایند مجاز به اجرا رویشان است" #: data/resources/ui/dialogs/settings_dialog.ui:7 msgid "General" msgstr "عمومی" #: data/resources/ui/dialogs/settings_dialog.ui:10 msgid "Units" msgstr "یکاها" #: data/resources/ui/dialogs/settings_dialog.ui:13 msgid "Data Unit Prefix" msgstr "پیشوند یکای داده" #: data/resources/ui/dialogs/settings_dialog.ui:17 msgid "Decimal" msgstr "ده‌دهی" #: data/resources/ui/dialogs/settings_dialog.ui:18 msgid "Binary" msgstr "دودویی" #: data/resources/ui/dialogs/settings_dialog.ui:26 msgid "Show Network Speeds in Bits per Second" msgstr "نمایش سرعت شبکه بر اساس بیت بر ثانیه" #: data/resources/ui/dialogs/settings_dialog.ui:31 msgid "Temperature Unit" msgstr "یکای دما" #: data/resources/ui/dialogs/settings_dialog.ui:35 msgid "Celsius" msgstr "سلسیوس" #: data/resources/ui/dialogs/settings_dialog.ui:36 msgid "Kelvin" msgstr "کلوین" #: data/resources/ui/dialogs/settings_dialog.ui:37 msgid "Fahrenheit" msgstr "فارنهایت" #: data/resources/ui/dialogs/settings_dialog.ui:47 msgid "User Interface" msgstr "میانای کاربری" #: data/resources/ui/dialogs/settings_dialog.ui:50 msgid "Refresh Speed" msgstr "سرعت تازه‌سازی" #: data/resources/ui/dialogs/settings_dialog.ui:51 msgid "Higher refresh speeds can lead to higher processor usage" msgstr "سرعت‌های تازه‌سازی بیش‌تر می‌تواند موجب استفادهٔ بیش‌تر از پردازنده شوند" #: data/resources/ui/dialogs/settings_dialog.ui:55 msgctxt "UI refresh speed" msgid "Very Slow" msgstr "خیلی کند" #: data/resources/ui/dialogs/settings_dialog.ui:56 msgctxt "UI refresh speed" msgid "Slow" msgstr "کند" #: data/resources/ui/dialogs/settings_dialog.ui:57 msgctxt "UI refresh speed" msgid "Normal" msgstr "معمولی" #: data/resources/ui/dialogs/settings_dialog.ui:58 msgctxt "UI refresh speed" msgid "Fast" msgstr "تند" #: data/resources/ui/dialogs/settings_dialog.ui:59 msgctxt "UI refresh speed" msgid "Very Fast" msgstr "خیلی تند" #: data/resources/ui/dialogs/settings_dialog.ui:67 msgid "Show Graph Grids" msgstr "نمایش توری نمودار" #: data/resources/ui/dialogs/settings_dialog.ui:72 msgid "Graph Data Points" msgstr "نقاط دادهٔ نمودار" #: data/resources/ui/dialogs/settings_dialog.ui:86 msgid "Show Usage Details in Sidebar" msgstr "نمایش جزییات استفاده در نوار کناری" #: data/resources/ui/dialogs/settings_dialog.ui:87 msgid "If enabled, the usage along with other information will be displayed" msgstr "در صورت به کار افتادن استفاده با دیگر اطّلاعات نمایش داده خواهد شد" #: data/resources/ui/dialogs/settings_dialog.ui:92 msgid "Show Device Descriptions in Sidebar" msgstr "نمایش شرح‌های افزاره در نوار کناری" #: data/resources/ui/dialogs/settings_dialog.ui:93 msgid "" "If enabled, a device identifier like its name or device type will be " "displayed" msgstr "" "در صورت به کار افتادن شناساگری از افزاره چون گونه یا نامش نمایش داده خواهد شد" #: data/resources/ui/dialogs/settings_dialog.ui:98 msgid "Sidebar Meter Type" msgstr "گونهٔ معیار نوار کناری" #: data/resources/ui/dialogs/settings_dialog.ui:102 msgid "Bar" msgstr "نوار" #: data/resources/ui/dialogs/settings_dialog.ui:103 msgid "Graph" msgstr "نمودار" #: data/resources/ui/dialogs/settings_dialog.ui:111 msgid "Normalize Processor Usage" msgstr "نرمال کردن استفادهٔ پردازنده" #: data/resources/ui/dialogs/settings_dialog.ui:112 msgid "" "If enabled, the total usage of all cores will be divided by the amount of " "cores" msgstr "" "در صورت به کار افتادن مجموع استفادهٔ همهٔ هسته‌های برای تعدادشان تقسیم خواهد شد" #: data/resources/ui/dialogs/settings_dialog.ui:122 #: data/resources/ui/window.ui:65 data/resources/ui/window.ui:72 #: src/ui/pages/applications/mod.rs:131 msgid "Apps" msgstr "کاره‌ها" #: data/resources/ui/dialogs/settings_dialog.ui:125 #: data/resources/ui/dialogs/settings_dialog.ui:207 msgid "Information Columns" msgstr "ستون‌های اطلاعات" #: data/resources/ui/dialogs/settings_dialog.ui:183 #: data/resources/ui/dialogs/settings_dialog.ui:295 #: src/ui/pages/applications/mod.rs:1479 src/ui/pages/processes/mod.rs:2014 msgid "Combined Memory" msgstr "حافظهٔ ترکیبی" #: data/resources/ui/dialogs/settings_dialog.ui:193 #: data/resources/ui/window.ui:105 data/resources/ui/window.ui:112 #: src/ui/pages/processes/mod.rs:175 msgid "Processes" msgstr "فرایندها" #: data/resources/ui/dialogs/settings_dialog.ui:196 #: data/resources/ui/pages/cpu.ui:22 data/resources/ui/pages/processes.ui:56 msgid "Options" msgstr "گزینه‌ها" #: data/resources/ui/dialogs/settings_dialog.ui:199 msgid "Show Niceness Values" msgstr "نمایش مقدارهای خوبی" #: data/resources/ui/dialogs/settings_dialog.ui:200 msgid "" "Display priorities as niceness to allow for more fine-grained adjustments" msgstr "نمایش اولویت‌ها به صورت خوبی برای امکان تنظیمات دقیق‌تر" #: data/resources/ui/dialogs/settings_dialog.ui:310 msgid "Devices" msgstr "افزاره‌ها" #: data/resources/ui/dialogs/settings_dialog.ui:313 msgid "Drives" msgstr "گرداننده‌ها" #: data/resources/ui/dialogs/settings_dialog.ui:316 msgid "Show Virtual Drives" msgstr "نمایش گردانندهٔ مجازی" #: data/resources/ui/dialogs/settings_dialog.ui:317 msgid "Virtual drives are for example ZFS volumes or mapped devices" msgstr "افزاره‌های مجاری برای نمونه حجم‌های ZFS یا افزاره‌های نگاشته هستند" #: data/resources/ui/dialogs/settings_dialog.ui:327 msgid "Show Virtual Network Interfaces" msgstr "نمایش میانای شبکهٔ مجازی" #: data/resources/ui/dialogs/settings_dialog.ui:328 msgid "Virtual network interfaces are for example bridges or VPN tunnels" msgstr "میاناهای شبکه مجازی برای نمونه پل‌ها و تونل‌های وی‌پی‌ان هستند" #: data/resources/ui/pages/applications.ui:6 #: data/resources/ui/pages/applications.ui:26 #: src/ui/pages/applications/mod.rs:1563 msgid "Kill App" msgstr "کشتن کاره" #: data/resources/ui/pages/applications.ui:10 #: data/resources/ui/pages/applications.ui:30 #: src/ui/pages/applications/mod.rs:1562 msgid "Halt App" msgstr "بستن کاره" #: data/resources/ui/pages/applications.ui:14 #: data/resources/ui/pages/applications.ui:34 #: src/ui/pages/applications/mod.rs:1564 msgid "Continue App" msgstr "ادامهٔ کاره" #: data/resources/ui/pages/applications.ui:22 #: data/resources/ui/pages/applications.ui:98 #: src/ui/pages/applications/mod.rs:1561 msgid "End App" msgstr "اتمام کاره" #: data/resources/ui/pages/applications.ui:40 #: data/resources/ui/pages/processes.ui:62 msgid "Information" msgstr "اطّلاعات" #: data/resources/ui/pages/applications.ui:57 msgid "Search applications" msgstr "جست‌وجوی برنامه‌ها" #: data/resources/ui/pages/applications.ui:87 #: data/resources/ui/pages/applications.ui:89 msgid "Show App Information" msgstr "نمایش اطّلاعات کاره" #: data/resources/ui/pages/battery.ui:36 msgid "Battery Health" msgstr "سلامت باتری" #: data/resources/ui/pages/battery.ui:45 msgid "Design Capacity" msgstr "ظرفیت طراحی" #: data/resources/ui/pages/battery.ui:54 msgid "Charge Cycles" msgstr "چرخهٔ پر شدن" #: data/resources/ui/pages/battery.ui:63 msgid "Technology" msgstr "فناوری" #: data/resources/ui/pages/battery.ui:72 data/resources/ui/pages/gpu.ui:81 #: data/resources/ui/pages/network.ui:58 data/resources/ui/pages/npu.ui:75 msgid "Manufacturer" msgstr "سازنده" #: data/resources/ui/pages/battery.ui:81 msgid "Model Name" msgstr "نام مدل" #: data/resources/ui/pages/battery.ui:90 data/resources/ui/pages/drive.ui:66 msgid "Device" msgstr "افزاره" #: data/resources/ui/pages/cpu.ui:26 msgid "Show Usages of Logical CPUs" msgstr "نمایش مصرف پردازنده های منطقی" #: data/resources/ui/pages/cpu.ui:75 data/resources/ui/pages/gpu.ui:66 #: data/resources/ui/pages/npu.ui:60 msgid "Sensors" msgstr "حسگرها" #: data/resources/ui/pages/cpu.ui:90 msgid "Max Frequency" msgstr "بیشینهٔ بسامد" #: data/resources/ui/pages/cpu.ui:99 msgid "Logical Cores" msgstr "هسته‌های منطقی" #: data/resources/ui/pages/cpu.ui:108 msgid "Physical Cores" msgstr "هسته‌های فیزیکی" #: data/resources/ui/pages/cpu.ui:117 msgid "Sockets" msgstr "سوکت‌ها" #: data/resources/ui/pages/cpu.ui:126 msgid "Uptime" msgstr "زمان کارکرد" #: data/resources/ui/pages/cpu.ui:135 msgid "Virtualization" msgstr "مجازی‌سازی" #: data/resources/ui/pages/cpu.ui:144 msgid "Architecture" msgstr "معماری" #: data/resources/ui/pages/drive.ui:38 msgid "Total Read" msgstr "کل خواندن" #: data/resources/ui/pages/drive.ui:47 msgid "Total Written" msgstr "کل نوشتن" #: data/resources/ui/pages/drive.ui:57 data/resources/ui/pages/memory.ui:72 msgid "Type" msgstr "گونه" #: data/resources/ui/pages/drive.ui:75 msgid "Capacity" msgstr "ظرفیت" #: data/resources/ui/pages/drive.ui:84 msgid "Writable" msgstr "قابل نوشتن" #: data/resources/ui/pages/drive.ui:93 msgid "Removable" msgstr "برداشتنی" #. Translators: "Link" refers to something like "PCIe 4.0 ×16" #: data/resources/ui/pages/drive.ui:102 data/resources/ui/pages/gpu.ui:113 #: data/resources/ui/pages/network.ui:103 data/resources/ui/pages/npu.ui:107 msgid "Link" msgstr "پیوند" #: data/resources/ui/pages/gpu.ui:37 msgid "GPU Frequency" msgstr "بسامد شتاب‌دهندهٔ گرافیکی" #: data/resources/ui/pages/gpu.ui:50 msgid "Video Memory Frequency" msgstr "بسامد حافظهٔ ویدیویی" #: data/resources/ui/pages/gpu.ui:55 data/resources/ui/pages/npu.ui:49 #: src/ui/pages/battery.rs:217 msgid "Power Usage" msgstr "مصرف نیرو" #: data/resources/ui/pages/gpu.ui:90 data/resources/ui/pages/npu.ui:84 msgid "PCI Slot" msgstr "شکاف PCI" #: data/resources/ui/pages/gpu.ui:99 data/resources/ui/pages/network.ui:67 #: data/resources/ui/pages/npu.ui:93 msgid "Driver Used" msgstr "راه‌انداز استفاده شده" #: data/resources/ui/pages/gpu.ui:108 data/resources/ui/pages/npu.ui:102 msgid "Max Power Cap" msgstr "بیشینه ظرفیت نیرو" #: data/resources/ui/pages/memory.ui:9 msgid "You need to authenticate to see memory properties" msgstr "دیدن ویژگی‌های حافظه نیازمند هویت‌سنجی" #: data/resources/ui/pages/memory.ui:10 msgid "Authenticate" msgstr "هویت‌سنجی" #: data/resources/ui/pages/memory.ui:45 msgid "Slots Used" msgstr "شکاف‌های استفاده شده" #: data/resources/ui/pages/memory.ui:54 msgid "Speed" msgstr "سرعت" #: data/resources/ui/pages/memory.ui:63 msgid "Form Factor" msgstr "قالب ریخت" #: data/resources/ui/pages/memory.ui:81 msgid "Type Detail" msgstr "جزییات گونه" #: data/resources/ui/pages/network.ui:35 msgid "Total Received" msgstr "کل دریافت" #: data/resources/ui/pages/network.ui:44 msgid "Total Sent" msgstr "کل ارسال" #: data/resources/ui/pages/network.ui:76 msgid "Interface" msgstr "میانا" #: data/resources/ui/pages/network.ui:85 msgid "Hardware Address" msgstr "نشانی سخت‌افزاری" #: data/resources/ui/pages/network.ui:94 msgid "Network Name" msgstr "نام شبکه" #: data/resources/ui/pages/network.ui:112 msgid "Link Speed" msgstr "سرعت پیوند" #: data/resources/ui/pages/npu.ui:31 msgid "NPU Frequency" msgstr "بسامد پرداشگر عصبی" #: data/resources/ui/pages/npu.ui:44 msgid "Memory Frequency" msgstr "بسامد حافظه" #: data/resources/ui/pages/processes.ui:6 #: data/resources/ui/pages/processes.ui:42 src/ui/pages/processes/mod.rs:2184 msgid "Kill Process" msgstr "کشتن فرایند" #: data/resources/ui/pages/processes.ui:10 #: data/resources/ui/pages/processes.ui:46 src/ui/pages/processes/mod.rs:2183 msgid "Halt Process" msgstr "بستن فرایند" #: data/resources/ui/pages/processes.ui:14 #: data/resources/ui/pages/processes.ui:50 src/ui/pages/processes/mod.rs:2185 msgid "Continue Process" msgstr "ادامهٔ فرایند" #: data/resources/ui/pages/processes.ui:22 #: data/resources/ui/pages/processes.ui:74 msgid "Kill Processes" msgstr "کشتن فرایندها" #: data/resources/ui/pages/processes.ui:26 #: data/resources/ui/pages/processes.ui:78 msgid "Halt Processes" msgstr "بستن فرایندها" #: data/resources/ui/pages/processes.ui:30 #: data/resources/ui/pages/processes.ui:82 msgid "Continue Processes" msgstr "ادامهٔ فرایندها" #: data/resources/ui/pages/processes.ui:38 #: data/resources/ui/pages/processes.ui:157 src/ui/pages/processes/mod.rs:524 #: src/ui/pages/processes/mod.rs:2182 msgid "End Process" msgstr "اتمام فرایند" #: data/resources/ui/pages/processes.ui:70 src/ui/pages/processes/mod.rs:528 msgid "End Processes" msgstr "اتمام فرایندها" #: data/resources/ui/pages/processes.ui:103 msgid "Search processes" msgstr "جست‌وجوی فرایندها" #: data/resources/ui/pages/processes.ui:133 #: data/resources/ui/pages/processes.ui:135 msgid "Show Process Options" msgstr "نمایش گزینه‌های فرایند" #: data/resources/ui/pages/processes.ui:146 #: data/resources/ui/pages/processes.ui:148 msgid "Show Process Information" msgstr "نمایش اطلاعات فرایند" #: data/resources/ui/shortcuts.ui:6 msgctxt "shortcut window" msgid "General" msgstr "عمومی" #: data/resources/ui/shortcuts.ui:9 msgctxt "shortcut window" msgid "Preferences" msgstr "ترجیحات" #: data/resources/ui/shortcuts.ui:15 msgctxt "shortcut window" msgid "Show Shortcuts" msgstr "نمایش میان‌برها" #: data/resources/ui/shortcuts.ui:21 msgctxt "shortcut window" msgid "Quit" msgstr "خروج" #: data/resources/ui/shortcuts.ui:29 msgctxt "shortcut window" msgid "Apps/Processes" msgstr "کاره‌ها و فرایندها" #: data/resources/ui/shortcuts.ui:32 msgctxt "shortcut window" msgid "Toggle Search Field" msgstr "تغییر وضعیت زمینهٔ جست‌وجو" #: data/resources/ui/shortcuts.ui:38 msgctxt "shortcut window" msgid "End App/Process" msgstr "اتمام کاره یا فرایند" #: data/resources/ui/shortcuts.ui:44 msgctxt "shortcut window" msgid "Kill App/Process" msgstr "کشتن کاره یا فرایند" #: data/resources/ui/shortcuts.ui:50 msgctxt "shortcut window" msgid "Halt App/Process" msgstr "بستن کاره یا فرایند" #: data/resources/ui/shortcuts.ui:56 msgctxt "shortcut window" msgid "Continue App/Process" msgstr "ادامهٔ کاره یا فرایند" #: data/resources/ui/shortcuts.ui:62 msgctxt "shortcut window" msgid "Show Information for App/Process" msgstr "نمایش اطّلاعات کاره یا فرایند" #: data/resources/ui/shortcuts.ui:68 msgctxt "shortcut window" msgid "Show Process Options" msgstr "نمایش گزینه‌های فرایند" #: data/resources/ui/window.ui:6 msgid "Preferences" msgstr "ترجیحات" #: data/resources/ui/window.ui:10 msgid "Keyboard Shortcuts" msgstr "میان‌برهای صفحه‌کلید" #: data/resources/ui/window.ui:14 msgid "About Resources" msgstr "دربارهٔ منابع" #: data/resources/ui/window.ui:88 data/resources/ui/window.ui:128 msgid "Search" msgstr "جست‌وجو" #: data/resources/ui/window.ui:90 data/resources/ui/window.ui:130 msgid "Toggle search field" msgstr "تغییر وضعیت زمینهٔ جست‌وجو" #: src/application.rs:274 msgid "The Nalux Team" msgstr "گروه نالوکس" #: src/application.rs:282 msgid "Report Issues" msgstr "گزارش مسئله‌ها" #. Translator credits. Replace "translator-credits" with your name/username, and optionally an email or URL. #. One name per line, please do not remove previous names. #: src/application.rs:288 msgid "translator-credits" msgstr "" "دانیال بهزادی \n" "میسانو t.me/mirsobhan" #: src/application.rs:289 msgid "Icon by" msgstr "نقشک به دست" #: src/ui/dialogs/app_dialog.rs:155 src/ui/dialogs/process_dialog.rs:133 #: src/ui/dialogs/process_dialog.rs:137 src/ui/dialogs/process_dialog.rs:146 #: src/ui/dialogs/process_dialog.rs:148 src/ui/dialogs/process_dialog.rs:171 #: src/ui/dialogs/process_dialog.rs:178 src/ui/dialogs/process_dialog.rs:185 #: src/ui/dialogs/process_dialog.rs:192 src/ui/pages/applications/mod.rs:948 #: src/ui/pages/applications/mod.rs:1074 src/ui/pages/battery.rs:205 #: src/ui/pages/battery.rs:225 src/ui/pages/battery.rs:231 #: src/ui/pages/battery.rs:234 src/ui/pages/battery.rs:265 #: src/ui/pages/battery.rs:289 src/ui/pages/battery.rs:291 #: src/ui/pages/battery.rs:301 src/ui/pages/cpu.rs:243 src/ui/pages/cpu.rs:258 #: src/ui/pages/cpu.rs:278 src/ui/pages/cpu.rs:284 src/ui/pages/cpu.rs:290 #: src/ui/pages/cpu.rs:296 src/ui/pages/cpu.rs:300 src/ui/pages/cpu.rs:303 #: src/ui/pages/cpu.rs:341 src/ui/pages/cpu.rs:448 src/ui/pages/drive.rs:319 #: src/ui/pages/drive.rs:350 src/ui/pages/drive.rs:352 #: src/ui/pages/drive.rs:381 src/ui/pages/drive.rs:383 #: src/ui/pages/drive.rs:399 src/ui/pages/drive.rs:400 #: src/ui/pages/drive.rs:407 src/ui/pages/drive.rs:417 #: src/ui/pages/drive.rs:427 src/ui/pages/drive.rs:433 src/ui/pages/gpu.rs:245 #: src/ui/pages/gpu.rs:252 src/ui/pages/gpu.rs:297 src/ui/pages/gpu.rs:322 #: src/ui/pages/gpu.rs:325 src/ui/pages/gpu.rs:336 src/ui/pages/gpu.rs:377 #: src/ui/pages/gpu.rs:384 src/ui/pages/gpu.rs:396 src/ui/pages/gpu.rs:403 #: src/ui/pages/gpu.rs:407 src/ui/pages/gpu.rs:437 src/ui/pages/gpu.rs:443 #: src/ui/pages/memory.rs:227 src/ui/pages/memory.rs:228 #: src/ui/pages/memory.rs:232 src/ui/pages/memory.rs:233 #: src/ui/pages/memory.rs:237 src/ui/pages/memory.rs:238 #: src/ui/pages/memory.rs:266 src/ui/pages/memory.rs:327 #: src/ui/pages/network.rs:252 src/ui/pages/network.rs:259 #: src/ui/pages/network.rs:266 src/ui/pages/network.rs:272 #: src/ui/pages/network.rs:275 src/ui/pages/network.rs:285 #: src/ui/pages/network.rs:292 src/ui/pages/network.rs:302 #: src/ui/pages/network.rs:370 src/ui/pages/network.rs:373 #: src/ui/pages/network.rs:375 src/ui/pages/network.rs:404 #: src/ui/pages/network.rs:407 src/ui/pages/network.rs:409 #: src/ui/pages/network.rs:417 src/ui/pages/network.rs:424 #: src/ui/pages/network.rs:434 src/ui/pages/processes/mod.rs:1225 #: src/ui/pages/processes/mod.rs:1292 src/ui/pages/processes/mod.rs:1359 #: src/ui/pages/processes/mod.rs:1426 src/ui/pages/processes/mod.rs:1912 #: src/ui/pages/processes/mod.rs:1914 src/utils/battery.rs:152 #: src/utils/drive.rs:137 src/utils/gpu/mod.rs:279 src/utils/gpu/mod.rs:291 #: src/utils/link/mod.rs:61 src/utils/npu/mod.rs:244 src/utils/npu/mod.rs:250 msgid "N/A" msgstr "نامربوط" #: src/ui/dialogs/process_options_dialog.rs:147 src/ui/pages/cpu.rs:257 #: src/ui/pages/cpu.rs:417 src/ui/pages/cpu.rs:421 msgid "CPU {}" msgstr "پردازندهٔ {}" #: src/ui/pages/applications/application_entry.rs:190 src/ui/pages/drive.rs:414 #: src/ui/pages/drive.rs:424 src/ui/pages/processes/process_entry.rs:211 msgid "No" msgstr "نه" #: src/ui/pages/applications/application_entry.rs:191 #: src/ui/pages/processes/process_entry.rs:212 msgid "Yes (Flatpak)" msgstr "بله (فلت‌پک)" #: src/ui/pages/applications/application_entry.rs:192 #: src/ui/pages/processes/process_entry.rs:213 msgid "Yes (Snap)" msgstr "بله (اسنپ)" #: src/ui/pages/applications/mod.rs:660 msgid "Running Apps: {}" msgstr "کاره‌های درحال اجرا: {}" #: src/ui/pages/applications/mod.rs:700 src/ui/pages/processes/mod.rs:863 msgid "Cancel" msgstr "لغو" #: src/ui/pages/applications/mod.rs:746 msgid "App" msgstr "کاره" #: src/ui/pages/applications/mod.rs:1539 src/ui/pages/processes/mod.rs:2131 msgid "End {}?" msgstr "پایان دادن {}؟" #: src/ui/pages/applications/mod.rs:1540 src/ui/pages/processes/mod.rs:2132 msgid "Halt {}?" msgstr "بستن {}؟" #: src/ui/pages/applications/mod.rs:1541 src/ui/pages/processes/mod.rs:2133 msgid "Kill {}?" msgstr "کشتن {}؟" #: src/ui/pages/applications/mod.rs:1542 src/ui/pages/processes/mod.rs:2134 msgid "Continue {}?" msgstr "ادامهٔ {}؟" #: src/ui/pages/applications/mod.rs:1548 src/ui/pages/processes/mod.rs:2169 msgid "Unsaved work might be lost." msgstr "ممکن است کارهای ذخیره نشده از دست بروند." #: src/ui/pages/applications/mod.rs:1550 msgid "" "Halting an app can come with serious risks such as losing data and security " "implications. Use with caution." msgstr "" "بستن کاره می‌تواند با خطرهای جدی چون از دست دادن داده‌ها و مسائل امنیتی همراه " "باشد. با احتیاط استفاده شود." #: src/ui/pages/applications/mod.rs:1553 msgid "" "Killing an app can come with serious risks such as losing data and security " "implications. Use with caution." msgstr "" "کشتن کاره می‌تواند با خطرهای جدی چون از دست دادن داده‌ها و مسائل امنیتی همراه " "باشد. با احتیاط استفاده شود." #: src/ui/pages/battery.rs:102 src/utils/battery.rs:258 msgid "Battery" msgstr "باتری" #: src/ui/pages/battery.rs:210 msgid "Battery Charge" msgstr "شارژ باتری" #: src/ui/pages/battery.rs:279 src/ui/pages/cpu.rs:438 #: src/ui/pages/drive.rs:344 src/ui/pages/drive.rs:375 src/ui/pages/gpu.rs:429 #: src/ui/pages/network.rs:362 src/ui/pages/network.rs:396 msgid "Highest:" msgstr "بیش‌ترین:" #: src/ui/pages/cpu.rs:242 src/ui/pages/gpu.rs:212 msgid "Total Usage" msgstr "مصرف کل" #: src/ui/pages/cpu.rs:271 src/ui/pages/gpu.rs:239 msgid "Temperature" msgstr "دما" #: src/ui/pages/drive.rs:126 msgid "Drive" msgstr "گرداننده" #: src/ui/pages/drive.rs:236 msgid "Drive Activity" msgstr "فعّالیت گرداننده" #: src/ui/pages/drive.rs:243 msgid "Read Speed" msgstr "سرعت خواندن" #: src/ui/pages/drive.rs:247 msgid "Write Speed" msgstr "سرعت نوشتن" #: src/ui/pages/drive.rs:412 src/ui/pages/drive.rs:422 msgid "Yes" msgstr "بله" #. Translators: This is an abbreviation for "Read" and "Write". This is displayed in the sidebar so your #. translation should preferably be quite short or an abbreviation #: src/ui/pages/drive.rs:440 msgid "R: {} · W: {}" msgstr "خ: {} · ن: {}" #: src/ui/pages/gpu.rs:220 msgid "Video Encoder/Decoder Usage" msgstr "مصرف کدگشا/کدگذار ویدیو" #: src/ui/pages/gpu.rs:226 msgid "Video Encoder Usage" msgstr "مصرف کدگذار ویدیو" #: src/ui/pages/gpu.rs:231 msgid "Video Decoder Usage" msgstr "مصرف کدگشای ویدیو" #: src/ui/pages/gpu.rs:236 msgid "Video Memory Usage" msgstr "مصرف حافظهٔ ویدیویی" #. Translators: This will be displayed in the sidebar, please try to keep your translation as short as (or even #. shorter than) 'Memory' #: src/ui/pages/gpu.rs:415 msgid "Memory: {}" msgstr "حافظه: {}" #: src/ui/pages/memory.rs:262 msgid "{} of {}" msgstr "{} از {}" #: src/ui/pages/memory.rs:265 msgid "{} MT/s" msgstr "{} MT/s" #. Translators: This will be displayed in the sidebar, so your translation for "Swap" should #. preferably be quite short or an abbreviation #: src/ui/pages/memory.rs:346 msgid "{} / {} · Swap: {} %" msgstr "{} / {} · مبادله: {} %" #: src/ui/pages/network.rs:127 src/utils/network.rs:135 msgid "Network Interface" msgstr "میانای شبکه" #: src/ui/pages/network.rs:241 msgid "Receiving" msgstr "گرفتن" #: src/ui/pages/network.rs:245 msgid "Sending" msgstr "فرستادن" #. Translators: This is an abbreviation for "Receive" and "Send". This is displayed in the sidebar so #. your translation should preferably be quite short or an abbreviation #: src/ui/pages/network.rs:445 msgid "R: {} · S: {}" msgstr "گ: {} · ف: {}" #: src/ui/pages/processes/mod.rs:814 msgid "Running Processes: {}" msgstr "فرایندهای درحال اجرا: {}" #: src/ui/pages/processes/mod.rs:912 msgid "Process" msgstr "فرایند" #: src/ui/pages/processes/mod.rs:2141 msgid "End process?" msgid_plural "End {} processes?" msgstr[0] "اتمام فرایند؟" msgstr[1] "اتمام {} فرایند؟" #: src/ui/pages/processes/mod.rs:2147 msgid "Halt process?" msgid_plural "Halt {} processes?" msgstr[0] "بستن فرایند؟" msgstr[1] "بستن {} فرایند؟" #: src/ui/pages/processes/mod.rs:2153 src/ui/pages/processes/mod.rs:2159 msgid "Kill process?" msgid_plural "Kill {} processes?" msgstr[0] "کشتن فرایند؟" msgstr[1] "کشتن {} فرایند؟" #: src/ui/pages/processes/mod.rs:2171 msgid "" "Halting a process can come with serious risks such as losing data and " "security implications. Use with caution." msgstr "" "بستن فرایند می‌تواند با خطرهای جدی چون از دست دادن داده‌ها و مسائل امنیتی " "همراه باشد. با احتیاط استفاده شود." #: src/ui/pages/processes/mod.rs:2174 msgid "" "Killing a process can come with serious risks such as losing data and " "security implications. Use with caution." msgstr "" "کشتن فرایند می‌تواند با خطرهای جدی چون از دست دادن داده‌ها و مسائل امنیتی " "همراه باشد. با احتیاط استفاده شود." #: src/ui/window.rs:466 msgid "GPU {}" msgstr "شتاب‌دهندهٔ گرافیکی {}" #: src/ui/window.rs:496 msgid "NPU {}" msgstr "پردازندهٔ عصبی {}" #: src/ui/window.rs:498 msgid "NPU" msgstr "پردازندهٔ عصبی" #: src/ui/window.rs:1174 msgid "Successfully adjusted {}" msgstr "{} با موفّقیت تنظیم شد" #: src/ui/window.rs:1175 msgid "There was a problem adjusting {}" msgstr "مشکلی در تنظیم {} وجود داشت" #: src/ui/window.rs:1257 msgid "Successfully ended {}" msgstr "{} با موفّقیت اتمام یافت" #: src/ui/window.rs:1258 msgid "Successfully halted {}" msgstr "{} با موفّقیت بسته شد" #: src/ui/window.rs:1259 msgid "Successfully killed {}" msgstr "{} با موفّقیت کشته شد" #: src/ui/window.rs:1260 msgid "Successfully continued {}" msgstr "{} با موفّقیت ادامه یافت" #: src/ui/window.rs:1267 msgid "Successfully ended the process" msgid_plural "Successfully ended {} processes" msgstr[0] "فرایند با موفقیت پایان یافت" msgstr[1] "{} فرایند با موفقیت پایان یافتند" #: src/ui/window.rs:1273 msgid "Successfully halted the process" msgid_plural "Successfully halted {} processes" msgstr[0] "فرایند با موفقیت بسته شد" msgstr[1] "{} فرایند با موفقیت بسته شدند" #: src/ui/window.rs:1279 msgid "Successfully killed the process" msgid_plural "Successfully killed {} processes" msgstr[0] "فرایند با موفقیت کشته شد" msgstr[1] "{} فرایند با موفقیت کشته شد" #: src/ui/window.rs:1285 msgid "Successfully continued the process" msgid_plural "Successfully continued {} processes" msgstr[0] "فرایند با موفقیت ادامه یافت" msgstr[1] "{} فرایند با موفقیت ادامه یافت" #: src/ui/window.rs:1296 msgid "There was a problem ending a process" msgid_plural "There were problems ending {} processes" msgstr[0] "مشکلی در اتمام فرایند وجود داشت" msgstr[1] "مشکلی در اتمام {} فرایند وجود داشت" #: src/ui/window.rs:1302 msgid "There was a problem halting a process" msgid_plural "There were problems halting {} processes" msgstr[0] "مشکلی در بستن فرایند وجود داشت" msgstr[1] "مشکلی در بستن {} فرایند وجود داشت" #: src/ui/window.rs:1308 msgid "There was a problem killing a process" msgid_plural "There were problems killing {} processes" msgstr[0] "مشکلی در کشتن فرایند وجود داشت" msgstr[1] "مشکلی در کشتن {} فرایند وجود داشت" #: src/ui/window.rs:1314 msgid "There was a problem continuing a process" msgid_plural "There were problems continuing {} processes" msgstr[0] "مشکلی در ادامهٔ فرایند وجود داشت" msgstr[1] "مشکلی در ادامهٔ {} فرایند وجود داشت" #: src/ui/window.rs:1324 msgid "There was a problem ending {}" msgstr "مشکلی در اتمام {} وجود داشت" #: src/ui/window.rs:1325 msgid "There was a problem halting {}" msgstr "مشکلی در بستن {} وجود داشت" #: src/ui/window.rs:1326 msgid "There was a problem killing {}" msgstr "مشکلی در کشتن {} وجود داشت" #: src/ui/window.rs:1327 msgid "There was a problem continuing {}" msgstr "مشکلی در ادامهٔ {} وجود داشت" #: src/utils/app.rs:222 msgid "System Processes" msgstr "فرایندهای سامانه" #: src/utils/battery.rs:93 msgid "Charging" msgstr "پر شدن" #: src/utils/battery.rs:94 msgid "Discharging" msgstr "خالی شدن" #: src/utils/battery.rs:95 msgid "Empty" msgstr "خالی" #: src/utils/battery.rs:96 msgid "Full" msgstr "پر" #: src/utils/battery.rs:97 msgid "Unknown" msgstr "نامشخص" #: src/utils/battery.rs:143 msgid "Nickel-Metal Hydride" msgstr "نیکل-متال هیدرید" #: src/utils/battery.rs:144 msgid "Nickel-Cadmium" msgstr "نیکل-کادمیم" #: src/utils/battery.rs:145 msgid "Nickel-Zinc" msgstr "نیکل-زینک" #: src/utils/battery.rs:146 msgid "Lead-Acid" msgstr "سرب-اسید" #: src/utils/battery.rs:147 msgid "Lithium-Ion" msgstr "لیتیوم-یون" #: src/utils/battery.rs:148 msgid "Lithium Iron Phosphate" msgstr "فسفات آهن لیتیوم" #: src/utils/battery.rs:149 msgid "Lithium Polymer" msgstr "پلیمر لیتیوم" #: src/utils/battery.rs:151 msgid "Rechargeable Alkaline Managanese" msgstr "قلیایی قابل شارژ" #: src/utils/battery.rs:256 msgid "{} Battery" msgstr "{} باتری" #: src/utils/units.rs:91 msgid "{} K" msgstr "{} K" #: src/utils/units.rs:93 msgid "{} °C" msgstr "{} °C" #: src/utils/units.rs:95 msgid "{} °F" msgstr "{} °F" #: src/utils/units.rs:113 src/utils/units.rs:127 src/utils/units.rs:147 #: src/utils/units.rs:161 msgid "{} B" msgstr "{} B" #: src/utils/units.rs:114 src/utils/units.rs:128 msgid "{} kB" msgstr "{} ک‌ب" #: src/utils/units.rs:115 src/utils/units.rs:129 msgid "{} MB" msgstr "{} م‌ب" #: src/utils/units.rs:116 src/utils/units.rs:130 msgid "{} GB" msgstr "{} گ‌ب" #: src/utils/units.rs:117 src/utils/units.rs:131 msgid "{} TB" msgstr "{} ت‌ب" #: src/utils/units.rs:118 src/utils/units.rs:132 msgid "{} PB" msgstr "{} پ‌ب" #: src/utils/units.rs:119 src/utils/units.rs:133 msgid "{} EB" msgstr "{} اِب" #: src/utils/units.rs:120 src/utils/units.rs:134 msgid "{} ZB" msgstr "{} زب" #: src/utils/units.rs:121 src/utils/units.rs:135 msgid "{} YB" msgstr "{} ی‌ب" #: src/utils/units.rs:122 src/utils/units.rs:136 msgid "{} RB" msgstr "{} رب" #: src/utils/units.rs:123 src/utils/units.rs:137 msgid "{} QB" msgstr "{} کوب" #: src/utils/units.rs:148 src/utils/units.rs:162 msgid "{} KiB" msgstr "{} کی‌ب" #: src/utils/units.rs:149 src/utils/units.rs:163 msgid "{} MiB" msgstr "{} می‌ب" #: src/utils/units.rs:150 src/utils/units.rs:164 msgid "{} GiB" msgstr "{} گی‌ب" #: src/utils/units.rs:151 src/utils/units.rs:165 msgid "{} TiB" msgstr "{} تی‌ب" #: src/utils/units.rs:152 src/utils/units.rs:166 msgid "{} PiB" msgstr "{} پی‌ب" #: src/utils/units.rs:153 src/utils/units.rs:167 msgid "{} EiB" msgstr "{} ای‌ب" #: src/utils/units.rs:154 src/utils/units.rs:168 msgid "{} ZiB" msgstr "{} زی‌ب" #: src/utils/units.rs:155 src/utils/units.rs:169 msgid "{} YiB" msgstr "{} یی‌ب" #: src/utils/units.rs:156 src/utils/units.rs:170 msgid "{} RiB" msgstr "{} ری‌ب" #: src/utils/units.rs:157 src/utils/units.rs:171 msgid "{} QiB" msgstr "{} کوی‌ب" #: src/utils/units.rs:198 src/utils/units.rs:215 msgid "{} B/s" msgstr "{} ب/ث" #: src/utils/units.rs:199 msgid "{} kB/s" msgstr "{} ک‌ب/ث" #: src/utils/units.rs:200 msgid "{} MB/s" msgstr "{} م‌ب/ث" #: src/utils/units.rs:201 msgid "{} GB/s" msgstr "{} گ‌ب/ث" #: src/utils/units.rs:202 msgid "{} TB/s" msgstr "{} ت‌ب/ث" #: src/utils/units.rs:203 msgid "{} PB/s" msgstr "{} پ‌ب/ث" #: src/utils/units.rs:204 msgid "{} EB/s" msgstr "{} اِب/ث" #: src/utils/units.rs:205 msgid "{} ZB/s" msgstr "{} زب/ث" #: src/utils/units.rs:206 msgid "{} YB/s" msgstr "{} ی‌ب/ث" #: src/utils/units.rs:207 msgid "{} RB/s" msgstr "{} رب/ث" #: src/utils/units.rs:208 msgid "{} QB/s" msgstr "{} کوب/ث" #: src/utils/units.rs:216 msgid "{} KiB/s" msgstr "{} کی‌ب/ث" #: src/utils/units.rs:217 msgid "{} MiB/s" msgstr "{} می‌ب/ث" #: src/utils/units.rs:218 msgid "{} GiB/s" msgstr "{} گی‌ب/ث" #: src/utils/units.rs:219 msgid "{} TiB/s" msgstr "{} تی‌ب/ث" #: src/utils/units.rs:220 msgid "{} PiB/s" msgstr "{} پی‌ب/ث" #: src/utils/units.rs:221 msgid "{} EiB/s" msgstr "{} ای‌ب/ث" #: src/utils/units.rs:222 msgid "{} ZiB/s" msgstr "{} زی‌ب/ث" #: src/utils/units.rs:223 msgid "{} YiB/s" msgstr "{} یی‌ب/ث" #: src/utils/units.rs:224 msgid "{} RiB/s" msgstr "{} ری‌ب/ث" #: src/utils/units.rs:225 msgid "{} QiB/s" msgstr "{} کوی‌ب/ث" #: src/utils/units.rs:239 src/utils/units.rs:256 msgid "{} b/s" msgstr "{} بی/ث" #: src/utils/units.rs:240 msgid "{} kb/s" msgstr "{} ک‌بی/ث" #: src/utils/units.rs:241 msgid "{} Mb/s" msgstr "{} م‌بی/ث" #: src/utils/units.rs:242 msgid "{} Gb/s" msgstr "{} گ‌بی/ث" #: src/utils/units.rs:243 msgid "{} Tb/s" msgstr "{} ت‌بی/ث" #: src/utils/units.rs:244 msgid "{} Pb/s" msgstr "{} پ‌بی/ث" #: src/utils/units.rs:245 msgid "{} Eb/s" msgstr "{} اِبی/ث" #: src/utils/units.rs:246 msgid "{} Zb/s" msgstr "{} زبی/ث" #: src/utils/units.rs:247 msgid "{} Yb/s" msgstr "{} ی‌بی/ث" #: src/utils/units.rs:248 msgid "{} Rb/s" msgstr "{} ربی/ث" #: src/utils/units.rs:249 msgid "{} Qb/s" msgstr "{} کوبی/ث" #: src/utils/units.rs:257 msgid "{} Kib/s" msgstr "{} کی‌بی/ث" #: src/utils/units.rs:258 msgid "{} Mib/s" msgstr "{} می‌بی/ث" #: src/utils/units.rs:259 msgid "{} Gib/s" msgstr "{} گی‌بی/ث" #: src/utils/units.rs:260 msgid "{} Tib/s" msgstr "{} تی‌بی/ث" #: src/utils/units.rs:261 msgid "{} Pib/s" msgstr "{} پی‌بی/ث" #: src/utils/units.rs:262 msgid "{} Eib/s" msgstr "{} ای‌بی/ث" #: src/utils/units.rs:263 msgid "{} Zib/s" msgstr "{} زی‌بی/ث" #: src/utils/units.rs:264 msgid "{} Yib/s" msgstr "{} یی‌بی/ث" #: src/utils/units.rs:265 msgid "{} Rib/s" msgstr "{} ری‌بی/ث" #: src/utils/units.rs:266 msgid "{} Qib/s" msgstr "{} کوی‌بی/ث" #: src/utils/units.rs:273 msgid "{} Hz" msgstr "{} ه" #: src/utils/units.rs:274 msgid "{} kHz" msgstr "{} ک‌ه" #: src/utils/units.rs:275 msgid "{} MHz" msgstr "{} م‌ه" #: src/utils/units.rs:276 msgid "{} GHz" msgstr "{}گ‌ه" #: src/utils/units.rs:277 msgid "{} THz" msgstr "{} ت‌ه" #: src/utils/units.rs:278 msgid "{} PHz" msgstr "{} پ‌ه" #: src/utils/units.rs:279 msgid "{} EHz" msgstr "{} اِه" #: src/utils/units.rs:280 msgid "{} ZHz" msgstr "{} زه" #: src/utils/units.rs:281 msgid "{} YHz" msgstr "{} ی‌ه" #: src/utils/units.rs:282 msgid "{} RHz" msgstr "{} ره" #: src/utils/units.rs:283 msgid "{} QHz" msgstr "{} کوه" #: src/utils/units.rs:290 msgid "{} W" msgstr "{} و" #: src/utils/units.rs:291 msgid "{} kW" msgstr "{} ک‌و" #: src/utils/units.rs:292 msgid "{} MW" msgstr "{} م‌و" #: src/utils/units.rs:293 msgid "{} GW" msgstr "{} گ‌و" #: src/utils/units.rs:294 msgid "{} TW" msgstr "{} ت‌و" #: src/utils/units.rs:295 msgid "{} PW" msgstr "{} پ‌و" #: src/utils/units.rs:296 msgid "{} EW" msgstr "{} اِو" #: src/utils/units.rs:297 msgid "{} ZW" msgstr "{} زو" #: src/utils/units.rs:298 msgid "{} YW" msgstr "{} ی‌و" #: src/utils/units.rs:299 msgid "{} RW" msgstr "{} رو" #: src/utils/units.rs:300 msgid "{} QW" msgstr "{} کوو" #: src/utils/units.rs:309 src/utils/units.rs:323 msgid "{} Wh" msgstr "{} وس" #: src/utils/units.rs:310 src/utils/units.rs:324 msgid "{} kWh" msgstr "{} ک‌وس" #: src/utils/units.rs:311 src/utils/units.rs:325 msgid "{} MWh" msgstr "{} م‌وس" #: src/utils/units.rs:312 src/utils/units.rs:326 msgid "{} GWh" msgstr "{} گ‌وس" #: src/utils/units.rs:313 src/utils/units.rs:327 msgid "{} TWh" msgstr "{} ت‌وس" #: src/utils/units.rs:314 src/utils/units.rs:328 msgid "{} PWh" msgstr "{} پ‌وس" #: src/utils/units.rs:315 src/utils/units.rs:329 msgid "{} EWh" msgstr "{} اِوس" #: src/utils/units.rs:316 src/utils/units.rs:330 msgid "{} ZWh" msgstr "{} زوس" #: src/utils/units.rs:317 src/utils/units.rs:331 msgid "{} YWh" msgstr "{} ی‌وس" #: src/utils/units.rs:318 src/utils/units.rs:332 msgid "{} RWh" msgstr "{} روس" #: src/utils/units.rs:319 src/utils/units.rs:333 msgid "{} QWh" msgstr "{} کووس" #: src/utils/drive.rs:129 src/utils/drive.rs:208 msgid "CD/DVD/Blu-ray Drive" msgstr "گردانندهٔ سی‌دی/دی‌وی‌دی/بلو‌ری" #: src/utils/drive.rs:130 msgid "eMMC Storage" msgstr "ذخیره‌ساز eMMC" #: src/utils/drive.rs:131 msgid "Flash Storage" msgstr "حافظهٔ فلش" #: src/utils/drive.rs:132 src/utils/drive.rs:209 msgid "Floppy Drive" msgstr "گردانندهٔ فلاپی" #: src/utils/drive.rs:133 msgid "Hard Disk Drive" msgstr "گردانندهٔ دیسک سخت" #: src/utils/drive.rs:134 msgid "Loop Device" msgstr "افزارهٔ حلقه‌ای" #: src/utils/drive.rs:135 msgid "Mapped Device" msgstr "افزارهٔ نگاشته" #: src/utils/drive.rs:136 msgid "NVMe Drive" msgstr "گردانندهٔ NVMe" #: src/utils/drive.rs:138 msgid "Software Raid" msgstr "رید نرم‌افزاری" #: src/utils/drive.rs:139 msgid "RAM Disk" msgstr "دیسک رم" #: src/utils/drive.rs:140 msgid "Solid State Drive" msgstr "گردانندهٔ حالت جامد" #: src/utils/drive.rs:141 msgid "ZFS Volume" msgstr "حجم ZFS" #: src/utils/drive.rs:142 msgid "Compressed RAM Disk (zram)" msgstr "دیسک رم فشرده (zram)" #: src/utils/drive.rs:210 msgid "{} Loop Device" msgstr "{} افزارهٔ حلقه‌ای" #: src/utils/drive.rs:211 msgid "{} Mapped Device" msgstr "{} دستگاه نگاشته" #: src/utils/drive.rs:212 msgid "{} RAID" msgstr "{} رید" #: src/utils/drive.rs:213 msgid "{} RAM Disk" msgstr "{} دیسک رم" #: src/utils/drive.rs:214 msgid "{} zram Device" msgstr "{} افزارهٔ zram" #: src/utils/drive.rs:215 msgid "{} ZFS Volume" msgstr "{} حجم ZFS" #: src/utils/drive.rs:216 msgid "{} Drive" msgstr "{} گرداننده" #: src/utils/network.rs:123 msgid "Bluetooth Tether" msgstr "چتر بلوتوثی" #: src/utils/network.rs:124 msgid "Network Bridge" msgstr "پل شبکه" #: src/utils/network.rs:125 msgid "Ethernet Connection" msgstr "اتّصال اترنت" #: src/utils/network.rs:126 msgid "Docker Bridge" msgstr "پل داکر" #: src/utils/network.rs:127 msgid "InfiniBand Connection" msgstr "اتصال InfiniBand" #: src/utils/network.rs:128 msgid "Serial Line IP Connection" msgstr "اتصال اینترنتی خط سریال" #: src/utils/network.rs:129 msgid "Virtual Ethernet Device" msgstr "افزارهٔ اترنت مجازی" #: src/utils/network.rs:130 msgid "VM Network Bridge" msgstr "پل شبکهٔ ماشین مجازی" #: src/utils/network.rs:131 msgid "VPN Tunnel" msgstr "تونل VPN" #: src/utils/network.rs:132 msgid "VPN Tunnel (WireGuard)" msgstr "تونل VPN (وایرگارد)" #: src/utils/network.rs:133 msgid "Wi-Fi Connection" msgstr "اتصال وای‌فای" #: src/utils/network.rs:134 msgid "WWAN Connection" msgstr "اتّصال WWAN" resources-1.9.1/po/fi.po000066400000000000000000001406041510634446000151200ustar00rootroot00000000000000# Finnish translation for resources. # Copyright (C) 2025 resources's COPYRIGHT HOLDER # This file is distributed under the same license as the resources package. # Jiri Grönroos , 2025. # msgid "" msgstr "" "Project-Id-Version: resources main\n" "Report-Msgid-Bugs-To: https://github.com/nokyan/resources/issues/\n" "POT-Creation-Date: 2025-09-07 03:34+0000\n" "PO-Revision-Date: 2025-09-07 16:22+0300\n" "Last-Translator: Jiri Grönroos \n" "Language-Team: Finnish \n" "Language: fi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.7\n" #: data/net.nokyan.Resources.desktop.in.in:2 data/net.nokyan.Resources.metainfo.xml.in.in:4 data/resources/ui/window.ui:22 src/application.rs:272 msgid "Resources" msgstr "Resurssit" #. Translators: The summary should be 35 characters or less according to Flathub appstream guidelines #: data/net.nokyan.Resources.desktop.in.in:3 data/net.nokyan.Resources.metainfo.xml.in.in:5 msgid "Keep an eye on system resources" msgstr "Tarkkaile järjestelmän resursseja" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/net.nokyan.Resources.desktop.in.in:9 msgid "System;Resources;Monitor;Processes;Usage;Task;Manager;CPU;RAM;Memory;GPU;" msgstr "System;Resources;Monitor;Processes;Usage;Task;Manager;CPU;RAM;Memory;GPU;järjestelmä;resurssit;valvonta;prosessit;käyttö;tehtävähallinta;suoritin;muisti;" #: data/net.nokyan.Resources.metainfo.xml.in.in:17 msgid "" "Resources allows you to check the utilization of your system resources and control your running processes and apps. It’s designed to be user-friendly and feel " "right at home on a modern desktop by using GNOME’s libadwaita." msgstr "" "Resurssit mahdollistaa järjestelmän resurssien käytön tarkkailemisen sekä käynnissä olevien prosessien ja sovellusten hallinnan. Se on helppokäyttöinen, ja se " "on kuin kotonaan modernilla työpöydällä Gnomen libadwaitaa käyttäen." #: data/net.nokyan.Resources.metainfo.xml.in.in:20 msgid "Resources supports monitoring the following components:" msgstr "Resurssit tukee seuraavien komponenttien tarkkailun:" #: data/net.nokyan.Resources.metainfo.xml.in.in:24 msgid "CPU" msgstr "Suoritin" #: data/net.nokyan.Resources.metainfo.xml.in.in:25 data/resources/ui/dialogs/app_dialog.ui:82 data/resources/ui/dialogs/process_dialog.ui:64 #: data/resources/ui/dialogs/settings_dialog.ui:128 data/resources/ui/dialogs/settings_dialog.ui:220 data/resources/ui/window.ui:176 #: data/resources/ui/window.ui:183 src/ui/pages/applications/mod.rs:803 src/ui/pages/memory.rs:106 src/ui/pages/memory.rs:192 src/ui/pages/processes/mod.rs:1079 msgid "Memory" msgstr "Muisti" #: data/net.nokyan.Resources.metainfo.xml.in.in:26 data/resources/ui/dialogs/app_dialog.ui:140 data/resources/ui/dialogs/process_dialog.ui:118 #: data/resources/ui/dialogs/settings_dialog.ui:158 data/resources/ui/dialogs/settings_dialog.ui:250 src/ui/pages/applications/mod.rs:1181 src/ui/pages/gpu.rs:118 #: src/ui/pages/processes/mod.rs:1469 src/ui/window.rs:468 msgid "GPU" msgstr "Näytönohjain" #: data/net.nokyan.Resources.metainfo.xml.in.in:27 data/resources/ui/dialogs/settings_dialog.ui:319 msgid "Network Interfaces" msgstr "Verkkoliitännät" #: data/net.nokyan.Resources.metainfo.xml.in.in:28 msgid "Storage Devices" msgstr "Tallennustilalaitteet" #: data/net.nokyan.Resources.metainfo.xml.in.in:29 msgid "Batteries" msgstr "Akut" #: data/net.nokyan.Resources.metainfo.xml.in.in:51 msgid "Apps page in light theme" msgstr "Sovellukset-näkymä vaalean teeman kera" #: data/net.nokyan.Resources.metainfo.xml.in.in:55 msgid "Processes page in dark theme" msgstr "Prosessit-näkymä tumman teeman kera" #: data/net.nokyan.Resources.metainfo.xml.in.in:59 msgid "Processor page in light theme" msgstr "Suoritinnäkymä vaalean teeman kera" #: data/net.nokyan.Resources.metainfo.xml.in.in:63 msgid "Memory page in dark theme" msgstr "Muistinäkymä tumman teeman kera" #: data/net.nokyan.Resources.metainfo.xml.in.in:67 msgid "GPU page in light theme" msgstr "Näytönohjainnäkymä vaalean teeman kera" #: data/net.nokyan.Resources.metainfo.xml.in.in:71 msgid "Drive page in dark theme" msgstr "Asemanäkymä tumman teeman kera" #: data/net.nokyan.Resources.metainfo.xml.in.in:75 msgid "Network Interface page in light theme" msgstr "Verkkoliitäntänäkymä vaalean teeman kera" #: data/net.nokyan.Resources.metainfo.xml.in.in:79 msgid "Battery page in dark theme" msgstr "Akkunäkymä tumman teeman kera" #: data/net.nokyan.Resources.policy.in.in:9 msgid "Control Process" msgstr "Hallintaprosessi" #: data/net.nokyan.Resources.policy.in.in:10 msgid "Authentication is required to control superuser’s or other users’ processes" msgstr "Tunnistautuminen vaaditaan pääkäyttäjän tai muiden käyttäejien prosessien hallitsemiseksi" #: data/resources/ui/dialogs/app_dialog.ui:7 msgid "App Information" msgstr "Sovelluksen tiedot" #: data/resources/ui/dialogs/app_dialog.ui:70 data/resources/ui/dialogs/process_dialog.ui:48 data/resources/ui/pages/battery.ui:22 #: data/resources/ui/pages/cpu.ui:37 data/resources/ui/pages/cpu.ui:50 data/resources/ui/pages/drive.ui:22 data/resources/ui/pages/gpu.ui:22 #: data/resources/ui/pages/memory.ui:31 data/resources/ui/pages/network.ui:22 data/resources/ui/pages/npu.ui:22 msgid "Usage" msgstr "Käyttö" #: data/resources/ui/dialogs/app_dialog.ui:73 data/resources/ui/dialogs/process_dialog.ui:55 data/resources/ui/dialogs/settings_dialog.ui:133 #: data/resources/ui/dialogs/settings_dialog.ui:225 data/resources/ui/window.ui:145 data/resources/ui/window.ui:152 src/ui/pages/applications/mod.rs:862 #: src/ui/pages/cpu.rs:128 src/ui/pages/processes/mod.rs:1138 src/ui/window.rs:290 msgid "Processor" msgstr "Suoritin" #: data/resources/ui/dialogs/app_dialog.ui:91 data/resources/ui/dialogs/process_dialog.ui:73 data/resources/ui/dialogs/settings_dialog.ui:178 #: data/resources/ui/dialogs/settings_dialog.ui:290 src/ui/pages/applications/mod.rs:1420 src/ui/pages/memory.rs:198 src/ui/pages/processes/mod.rs:1954 msgid "Swap" msgstr "Sivutus" #: data/resources/ui/dialogs/app_dialog.ui:100 data/resources/ui/dialogs/process_dialog.ui:78 data/resources/ui/dialogs/settings_dialog.ui:138 #: data/resources/ui/dialogs/settings_dialog.ui:230 src/ui/pages/applications/mod.rs:926 src/ui/pages/processes/mod.rs:1202 msgid "Drive Read" msgstr "Asemalta lukeminen" #: data/resources/ui/dialogs/app_dialog.ui:109 data/resources/ui/dialogs/process_dialog.ui:87 data/resources/ui/dialogs/settings_dialog.ui:143 #: data/resources/ui/dialogs/settings_dialog.ui:235 src/ui/pages/applications/mod.rs:991 src/ui/pages/processes/mod.rs:1269 msgid "Drive Read Total" msgstr "Asemalta lukeminen yhteensä" #: data/resources/ui/dialogs/app_dialog.ui:118 data/resources/ui/dialogs/process_dialog.ui:96 data/resources/ui/dialogs/settings_dialog.ui:148 #: data/resources/ui/dialogs/settings_dialog.ui:240 src/ui/pages/applications/mod.rs:1052 src/ui/pages/processes/mod.rs:1336 msgid "Drive Write" msgstr "Asemalle kirjoittaminen" #: data/resources/ui/dialogs/app_dialog.ui:127 data/resources/ui/dialogs/process_dialog.ui:105 data/resources/ui/dialogs/settings_dialog.ui:153 #: data/resources/ui/dialogs/settings_dialog.ui:245 src/ui/pages/applications/mod.rs:1119 src/ui/pages/processes/mod.rs:1403 msgid "Drive Write Total" msgstr "Asemalle kirjoittaminen yhteensä" #: data/resources/ui/dialogs/app_dialog.ui:149 data/resources/ui/dialogs/process_dialog.ui:127 data/resources/ui/dialogs/settings_dialog.ui:163 #: data/resources/ui/dialogs/settings_dialog.ui:255 src/ui/pages/applications/mod.rs:1361 src/ui/pages/processes/mod.rs:1650 msgid "Video Memory" msgstr "Videomuisti" #: data/resources/ui/dialogs/app_dialog.ui:158 data/resources/ui/dialogs/process_dialog.ui:136 data/resources/ui/dialogs/settings_dialog.ui:168 #: data/resources/ui/dialogs/settings_dialog.ui:260 src/ui/pages/applications/mod.rs:1240 src/ui/pages/processes/mod.rs:1528 msgid "Video Encoder" msgstr "Videopakkaus" #: data/resources/ui/dialogs/app_dialog.ui:167 data/resources/ui/dialogs/process_dialog.ui:145 data/resources/ui/dialogs/settings_dialog.ui:173 #: data/resources/ui/dialogs/settings_dialog.ui:265 src/ui/pages/applications/mod.rs:1301 src/ui/pages/processes/mod.rs:1589 msgid "Video Decoder" msgstr "Videopurku" #: data/resources/ui/dialogs/app_dialog.ui:174 data/resources/ui/dialogs/process_dialog.ui:179 data/resources/ui/pages/battery.ui:33 #: data/resources/ui/pages/cpu.ui:83 data/resources/ui/pages/drive.ui:54 data/resources/ui/pages/gpu.ui:74 data/resources/ui/pages/memory.ui:42 #: data/resources/ui/pages/network.ui:51 data/resources/ui/pages/npu.ui:68 msgid "Properties" msgstr "Ominaisuudet" #: data/resources/ui/dialogs/app_dialog.ui:180 msgid "ID" msgstr "" #: data/resources/ui/dialogs/app_dialog.ui:190 data/resources/ui/dialogs/process_dialog.ui:195 msgid "Running Since" msgstr "Käynnissä alkaen" #: data/resources/ui/dialogs/app_dialog.ui:198 msgid "Running Processes" msgstr "Prosesseja käynnissä" #: data/resources/ui/dialogs/app_dialog.ui:207 data/resources/ui/dialogs/process_dialog.ui:231 msgid "Containerized" msgstr "Kontitettu" #: data/resources/ui/dialogs/process_dialog.ui:7 msgid "Process Information" msgstr "Prosessin tiedot" #: data/resources/ui/dialogs/process_dialog.ui:154 data/resources/ui/dialogs/settings_dialog.ui:270 src/ui/pages/processes/mod.rs:1710 msgid "Total CPU Time" msgstr "Suoritinaika yhteensä" #: data/resources/ui/dialogs/process_dialog.ui:163 data/resources/ui/dialogs/settings_dialog.ui:275 src/ui/pages/processes/mod.rs:1769 msgid "User CPU Time" msgstr "Käyttäjän suoritinaika" #: data/resources/ui/dialogs/process_dialog.ui:172 data/resources/ui/dialogs/settings_dialog.ui:280 src/ui/pages/processes/mod.rs:1828 msgid "System CPU Time" msgstr "Järjestelmän suoritinaika" #: data/resources/ui/dialogs/process_dialog.ui:186 data/resources/ui/dialogs/settings_dialog.ui:210 src/ui/pages/processes/mod.rs:972 msgid "Process ID" msgstr "Prosessin ID" #: data/resources/ui/dialogs/process_dialog.ui:204 msgid "Commandline" msgstr "Komentorivi" #: data/resources/ui/dialogs/process_dialog.ui:213 data/resources/ui/dialogs/settings_dialog.ui:215 src/ui/pages/processes/mod.rs:1025 msgid "User" msgstr "Käyttäjä" #: data/resources/ui/dialogs/process_dialog.ui:222 msgid "Control Group" msgstr "Kontrolliryhmä" #: data/resources/ui/dialogs/process_options_dialog.ui:7 data/resources/ui/dialogs/process_options_dialog.ui:69 msgid "Process Options" msgstr "Prosessin valinnat" #: data/resources/ui/dialogs/process_options_dialog.ui:29 msgid "Apply" msgstr "Toteuta" #: data/resources/ui/dialogs/process_options_dialog.ui:72 msgid "Niceness" msgstr "Niceness" #: data/resources/ui/dialogs/process_options_dialog.ui:73 msgid "The priority of a process is given by its niceness. A lower niceness value correspond to a higher priority." msgstr "Prosessin prioriteetin määrittää sen niceness-arvo. Mitä pienempi niceness-arvo, sitä suurempi prioriteetti." #: data/resources/ui/dialogs/process_options_dialog.ui:87 data/resources/ui/dialogs/settings_dialog.ui:285 src/ui/pages/processes/mod.rs:1887 msgid "Priority" msgstr "Prioriteetti" #: data/resources/ui/dialogs/process_options_dialog.ui:91 msgctxt "process priority" msgid "Very High" msgstr "Erittäin korkea" #: data/resources/ui/dialogs/process_options_dialog.ui:92 msgctxt "process priority" msgid "High" msgstr "Korkea" #: data/resources/ui/dialogs/process_options_dialog.ui:93 msgctxt "process priority" msgid "Normal" msgstr "Normaali" #: data/resources/ui/dialogs/process_options_dialog.ui:94 msgctxt "process priority" msgid "Low" msgstr "Matala" #: data/resources/ui/dialogs/process_options_dialog.ui:95 msgctxt "process priority" msgid "Very Low" msgstr "Erittäin matala" #: data/resources/ui/dialogs/process_options_dialog.ui:103 msgid "Processor Affinity" msgstr "Suoritinkiinnitys" #: data/resources/ui/dialogs/process_options_dialog.ui:108 msgid "Toggle All" msgstr "Vaihda kaikki" #: data/resources/ui/dialogs/process_options_dialog.ui:111 msgid "Select which processor cores the process is allowed to run on" msgstr "Valitse millä suoritinytimillä prosessi on sallittu suoritettavaksi" #: data/resources/ui/dialogs/settings_dialog.ui:7 msgid "General" msgstr "Yleiset" #: data/resources/ui/dialogs/settings_dialog.ui:10 msgid "Units" msgstr "Yksiköt" #: data/resources/ui/dialogs/settings_dialog.ui:13 msgid "Data Unit Prefix" msgstr "Datayksiköiden etuliite" #: data/resources/ui/dialogs/settings_dialog.ui:17 msgid "Decimal" msgstr "Desimaali" #: data/resources/ui/dialogs/settings_dialog.ui:18 msgid "Binary" msgstr "Binääri" #: data/resources/ui/dialogs/settings_dialog.ui:26 msgid "Show Network Speeds in Bits per Second" msgstr "Näytä verkkonopeudet bitteinä per sekunti" #: data/resources/ui/dialogs/settings_dialog.ui:31 msgid "Temperature Unit" msgstr "Lämpötilayksikkö" #: data/resources/ui/dialogs/settings_dialog.ui:35 msgid "Celsius" msgstr "Celsius" #: data/resources/ui/dialogs/settings_dialog.ui:36 msgid "Kelvin" msgstr "Kelvin" #: data/resources/ui/dialogs/settings_dialog.ui:37 msgid "Fahrenheit" msgstr "Fahrenheit" #: data/resources/ui/dialogs/settings_dialog.ui:47 msgid "User Interface" msgstr "Käyttöliittymä" #: data/resources/ui/dialogs/settings_dialog.ui:50 msgid "Refresh Speed" msgstr "Päivitysnopeus" #: data/resources/ui/dialogs/settings_dialog.ui:51 msgid "Higher refresh speeds can lead to higher processor usage" msgstr "Suurempi päivitysnopeus voi johtaa kasvavaan suoritinkäyttöön" #: data/resources/ui/dialogs/settings_dialog.ui:55 msgctxt "UI refresh speed" msgid "Very Slow" msgstr "Erittäin hidas" #: data/resources/ui/dialogs/settings_dialog.ui:56 msgctxt "UI refresh speed" msgid "Slow" msgstr "Hidas" #: data/resources/ui/dialogs/settings_dialog.ui:57 msgctxt "UI refresh speed" msgid "Normal" msgstr "Normaali" #: data/resources/ui/dialogs/settings_dialog.ui:58 msgctxt "UI refresh speed" msgid "Fast" msgstr "Nopea" #: data/resources/ui/dialogs/settings_dialog.ui:59 msgctxt "UI refresh speed" msgid "Very Fast" msgstr "Erittäin nopea" #: data/resources/ui/dialogs/settings_dialog.ui:67 msgid "Show Graph Grids" msgstr "Näytä kaavion ruudukko" #: data/resources/ui/dialogs/settings_dialog.ui:72 msgid "Graph Data Points" msgstr "Kaavion datapisteet" #: data/resources/ui/dialogs/settings_dialog.ui:86 msgid "Show Usage Details in Sidebar" msgstr "Näytä käyttötiedot sivupalkissa" #: data/resources/ui/dialogs/settings_dialog.ui:87 msgid "If enabled, the usage along with other information will be displayed" msgstr "Jos käytössä, näytetään käyttö ja muita tietoja" #: data/resources/ui/dialogs/settings_dialog.ui:92 msgid "Show Device Descriptions in Sidebar" msgstr "Näytä laitekuvaukset sivupalkissa" #: data/resources/ui/dialogs/settings_dialog.ui:93 msgid "If enabled, a device identifier like its name or device type will be displayed" msgstr "Jos käytössä, näytetään laitetunniste kuten nimi tai laitetyyppi" #: data/resources/ui/dialogs/settings_dialog.ui:98 msgid "Sidebar Meter Type" msgstr "Sivupalkin mittarin tyyppi" #: data/resources/ui/dialogs/settings_dialog.ui:102 msgid "Bar" msgstr "Palkki" #: data/resources/ui/dialogs/settings_dialog.ui:103 msgid "Graph" msgstr "Kaavio" #: data/resources/ui/dialogs/settings_dialog.ui:111 msgid "Normalize Processor Usage" msgstr "Normalisoi suoritinkäyttö" #: data/resources/ui/dialogs/settings_dialog.ui:112 msgid "If enabled, the total usage of all cores will be divided by the amount of cores" msgstr "Jos käytössä, kaikkien ydinten yhteiskäyttö jaetaan ydinten määrällä" #: data/resources/ui/dialogs/settings_dialog.ui:122 data/resources/ui/window.ui:65 data/resources/ui/window.ui:72 src/ui/pages/applications/mod.rs:131 msgid "Apps" msgstr "Sovellukset" #: data/resources/ui/dialogs/settings_dialog.ui:125 data/resources/ui/dialogs/settings_dialog.ui:207 msgid "Information Columns" msgstr "Tietosarakkeet" #: data/resources/ui/dialogs/settings_dialog.ui:183 data/resources/ui/dialogs/settings_dialog.ui:295 src/ui/pages/applications/mod.rs:1479 #: src/ui/pages/processes/mod.rs:2013 msgid "Combined Memory" msgstr "Yhdistetty muisti" #: data/resources/ui/dialogs/settings_dialog.ui:193 data/resources/ui/window.ui:105 data/resources/ui/window.ui:112 src/ui/pages/processes/mod.rs:175 msgid "Processes" msgstr "Prosessit" #: data/resources/ui/dialogs/settings_dialog.ui:196 data/resources/ui/pages/cpu.ui:22 data/resources/ui/pages/processes.ui:56 msgid "Options" msgstr "Valinnat" #: data/resources/ui/dialogs/settings_dialog.ui:199 msgid "Show Niceness Values" msgstr "Näytä Niceness-arvot" #: data/resources/ui/dialogs/settings_dialog.ui:200 msgid "Display priorities as niceness to allow for more fine-grained adjustments" msgstr "Näytä prioriteetit niceness-arvoina, jotta säätöjä voi tehdä yksityiskohtaisesti" #: data/resources/ui/dialogs/settings_dialog.ui:305 msgid "Devices" msgstr "Laitteet" #: data/resources/ui/dialogs/settings_dialog.ui:308 msgid "Drives" msgstr "Asemat" #: data/resources/ui/dialogs/settings_dialog.ui:311 msgid "Show Virtual Drives" msgstr "Näytä virtuaaliasemat" #: data/resources/ui/dialogs/settings_dialog.ui:312 msgid "Virtual drives are for example ZFS volumes or mapped devices" msgstr "Virtuaaliset asemat ovat esimerkiksi ZFS-taltioita tai karkoitettuja (mapped) laitteita" #: data/resources/ui/dialogs/settings_dialog.ui:322 msgid "Show Virtual Network Interfaces" msgstr "Näytä virtuaaliset verkkoliitännät" #: data/resources/ui/dialogs/settings_dialog.ui:323 msgid "Virtual network interfaces are for example bridges or VPN tunnels" msgstr "Virtuaaliset verkkoliitännät ovat esimerkiksi siltoja tai VPN-tunneleita" #: data/resources/ui/pages/applications.ui:6 data/resources/ui/pages/applications.ui:26 src/ui/pages/applications/mod.rs:1563 msgid "Kill App" msgstr "Tapa sovellus" #: data/resources/ui/pages/applications.ui:10 data/resources/ui/pages/applications.ui:30 src/ui/pages/applications/mod.rs:1562 msgid "Halt App" msgstr "Seisauta sovellus" #: data/resources/ui/pages/applications.ui:14 data/resources/ui/pages/applications.ui:34 src/ui/pages/applications/mod.rs:1564 msgid "Continue App" msgstr "Jatka sovellusta" #: data/resources/ui/pages/applications.ui:22 data/resources/ui/pages/applications.ui:98 src/ui/pages/applications/mod.rs:1561 msgid "End App" msgstr "Lopeta sovellus" #: data/resources/ui/pages/applications.ui:40 data/resources/ui/pages/processes.ui:62 msgid "Information" msgstr "Tiedot" #: data/resources/ui/pages/applications.ui:57 msgid "Search applications" msgstr "Etsi sovelluksia" #: data/resources/ui/pages/applications.ui:87 data/resources/ui/pages/applications.ui:89 msgid "Show App Information" msgstr "Näytä sovelluksen tiedot" #: data/resources/ui/pages/battery.ui:36 msgid "Battery Health" msgstr "Akun kunto" #: data/resources/ui/pages/battery.ui:45 msgid "Design Capacity" msgstr "Suunniteltu kapasiteetti" #: data/resources/ui/pages/battery.ui:54 msgid "Charge Cycles" msgstr "Latauskerrat" #: data/resources/ui/pages/battery.ui:63 msgid "Technology" msgstr "Tekniikka" #: data/resources/ui/pages/battery.ui:72 data/resources/ui/pages/gpu.ui:81 data/resources/ui/pages/network.ui:58 data/resources/ui/pages/npu.ui:75 msgid "Manufacturer" msgstr "Valmistaja" #: data/resources/ui/pages/battery.ui:81 msgid "Model Name" msgstr "Mallin nimi" #: data/resources/ui/pages/battery.ui:90 data/resources/ui/pages/drive.ui:66 msgid "Device" msgstr "Laite" #: data/resources/ui/pages/cpu.ui:26 msgid "Show Usages of Logical CPUs" msgstr "Näytä loogisten suorittimien käyttö" #: data/resources/ui/pages/cpu.ui:75 data/resources/ui/pages/gpu.ui:66 data/resources/ui/pages/npu.ui:60 msgid "Sensors" msgstr "Sensorit" #: data/resources/ui/pages/cpu.ui:90 msgid "Max Frequency" msgstr "Suurin taajuus" #: data/resources/ui/pages/cpu.ui:99 msgid "Logical Cores" msgstr "Loogiset ytimet" #: data/resources/ui/pages/cpu.ui:108 msgid "Physical Cores" msgstr "Fyysiset ytimet" #: data/resources/ui/pages/cpu.ui:117 msgid "Sockets" msgstr "Kannat" #: data/resources/ui/pages/cpu.ui:126 msgid "Uptime" msgstr "Käynnissäoloaika" #: data/resources/ui/pages/cpu.ui:135 msgid "Virtualization" msgstr "Virtualisointi" #: data/resources/ui/pages/cpu.ui:144 msgid "Architecture" msgstr "Arkkitehtuuri" #: data/resources/ui/pages/drive.ui:38 msgid "Total Read" msgstr "Luettu yhteensä" #: data/resources/ui/pages/drive.ui:47 msgid "Total Written" msgstr "Kirjoitettu yhteensä" #: data/resources/ui/pages/drive.ui:57 data/resources/ui/pages/memory.ui:72 msgid "Type" msgstr "Tyyppi" #: data/resources/ui/pages/drive.ui:75 msgid "Capacity" msgstr "Kapasiteetti" #: data/resources/ui/pages/drive.ui:84 msgid "Writable" msgstr "Kirjoitettava" #: data/resources/ui/pages/drive.ui:93 msgid "Removable" msgstr "Irrotettava" #. Translators: "Link" refers to something like "PCIe 4.0 ×16" #: data/resources/ui/pages/drive.ui:102 data/resources/ui/pages/gpu.ui:113 data/resources/ui/pages/network.ui:103 data/resources/ui/pages/npu.ui:107 msgid "Link" msgstr "Linkki" #: data/resources/ui/pages/gpu.ui:37 msgid "GPU Frequency" msgstr "Näytönohjaimen kellotaajuus" #: data/resources/ui/pages/gpu.ui:50 msgid "Video Memory Frequency" msgstr "Videomuistin kellotaajuus" #: data/resources/ui/pages/gpu.ui:55 data/resources/ui/pages/npu.ui:49 src/ui/pages/battery.rs:217 msgid "Power Usage" msgstr "Virrankäyttö" #: data/resources/ui/pages/gpu.ui:90 data/resources/ui/pages/npu.ui:84 msgid "PCI Slot" msgstr "PCI-paikka" #: data/resources/ui/pages/gpu.ui:99 data/resources/ui/pages/network.ui:67 data/resources/ui/pages/npu.ui:93 msgid "Driver Used" msgstr "Käytettävä ajuri" #: data/resources/ui/pages/gpu.ui:108 data/resources/ui/pages/npu.ui:102 msgid "Max Power Cap" msgstr "Tehorajoitus enintään" #: data/resources/ui/pages/memory.ui:9 msgid "You need to authenticate to see memory properties" msgstr "Tunnistautuminen vaaditaan muistin ominaisuuksien tarkkailemiseksi" #: data/resources/ui/pages/memory.ui:10 msgid "Authenticate" msgstr "Tunnistaudu" #: data/resources/ui/pages/memory.ui:45 msgid "Slots Used" msgstr "Paikkoja käytössä" #: data/resources/ui/pages/memory.ui:54 msgid "Speed" msgstr "Nopeus" #: data/resources/ui/pages/memory.ui:63 msgid "Form Factor" msgstr "Muoto" #: data/resources/ui/pages/memory.ui:81 msgid "Type Detail" msgstr "Tyyppitiedot" #: data/resources/ui/pages/network.ui:35 msgid "Total Received" msgstr "Vastaanotettu yhteensä" #: data/resources/ui/pages/network.ui:44 msgid "Total Sent" msgstr "Lähetetty yhteensä" #: data/resources/ui/pages/network.ui:76 msgid "Interface" msgstr "Liitäntä" #: data/resources/ui/pages/network.ui:85 msgid "Hardware Address" msgstr "Laiteosoite" #: data/resources/ui/pages/network.ui:94 msgid "Network Name" msgstr "Verkon nimi" #: data/resources/ui/pages/network.ui:112 msgid "Link Speed" msgstr "Linkkinopeus" #: data/resources/ui/pages/npu.ui:31 msgid "NPU Frequency" msgstr "NPU-kellotaajuus" #: data/resources/ui/pages/npu.ui:44 msgid "Memory Frequency" msgstr "Muistin kellotaajuus" #: data/resources/ui/pages/processes.ui:6 data/resources/ui/pages/processes.ui:42 src/ui/pages/processes/mod.rs:2126 msgid "Kill Process" msgstr "Tapa prosessi" #: data/resources/ui/pages/processes.ui:10 data/resources/ui/pages/processes.ui:46 src/ui/pages/processes/mod.rs:2125 msgid "Halt Process" msgstr "Seisauta prosessi" #: data/resources/ui/pages/processes.ui:14 data/resources/ui/pages/processes.ui:50 src/ui/pages/processes/mod.rs:2127 msgid "Continue Process" msgstr "Jatka prosessia" #: data/resources/ui/pages/processes.ui:22 data/resources/ui/pages/processes.ui:74 msgid "Kill Processes" msgstr "Tapa prosessit" #: data/resources/ui/pages/processes.ui:26 data/resources/ui/pages/processes.ui:78 msgid "Halt Processes" msgstr "Seisauta prosessit" #: data/resources/ui/pages/processes.ui:30 data/resources/ui/pages/processes.ui:82 msgid "Continue Processes" msgstr "Jatka prosesseja" #: data/resources/ui/pages/processes.ui:38 data/resources/ui/pages/processes.ui:157 src/ui/pages/processes/mod.rs:523 src/ui/pages/processes/mod.rs:2124 msgid "End Process" msgstr "Lopeta prosessi" #: data/resources/ui/pages/processes.ui:70 src/ui/pages/processes/mod.rs:527 msgid "End Processes" msgstr "Lopeta prosessit" #: data/resources/ui/pages/processes.ui:103 msgid "Search processes" msgstr "Etsi prosesseja" #: data/resources/ui/pages/processes.ui:133 data/resources/ui/pages/processes.ui:135 msgid "Show Process Options" msgstr "Näytä prosessin valinnat" #: data/resources/ui/pages/processes.ui:146 data/resources/ui/pages/processes.ui:148 msgid "Show Process Information" msgstr "Näytä prosessin tiedot" #: data/resources/ui/shortcuts.ui:11 msgctxt "shortcut window" msgid "General" msgstr "Yleiset" #: data/resources/ui/shortcuts.ui:14 msgctxt "shortcut window" msgid "Preferences" msgstr "Asetukset" #: data/resources/ui/shortcuts.ui:20 msgctxt "shortcut window" msgid "Show Shortcuts" msgstr "Näytä pikanäppäimet" #: data/resources/ui/shortcuts.ui:26 msgctxt "shortcut window" msgid "Quit" msgstr "Lopeta" #: data/resources/ui/shortcuts.ui:32 msgctxt "shortcut window" msgid "Toggle Search Field" msgstr "Näytä/piilota hakukenttä" #: data/resources/ui/shortcuts.ui:38 msgctxt "shortcut window" msgid "End App/Process" msgstr "Lopeta sovellus/prosessi" #: data/resources/ui/shortcuts.ui:44 msgctxt "shortcut window" msgid "Kill App/Process" msgstr "Tapa sovellus/prosessi" #: data/resources/ui/shortcuts.ui:50 msgctxt "shortcut window" msgid "Halt App/Process" msgstr "Seisauta sovellus/prosessi" #: data/resources/ui/shortcuts.ui:56 msgctxt "shortcut window" msgid "Continue App/Process" msgstr "Jatka sovellusta/prosessia" #: data/resources/ui/shortcuts.ui:62 msgctxt "shortcut window" msgid "Show Information for App/Process" msgstr "Näytä sovelluksen/prosessin tiedot" #: data/resources/ui/shortcuts.ui:68 msgctxt "shortcut window" msgid "Show Process Options" msgstr "Näytä prosessin valinnat" #: data/resources/ui/window.ui:6 msgid "Preferences" msgstr "Asetukset" #: data/resources/ui/window.ui:10 msgid "Keyboard Shortcuts" msgstr "Pikanäppäimet" #: data/resources/ui/window.ui:14 msgid "About Resources" msgstr "Tietoja - Resurssit" #: data/resources/ui/window.ui:88 data/resources/ui/window.ui:128 msgid "Search" msgstr "Etsi" #: data/resources/ui/window.ui:90 data/resources/ui/window.ui:130 msgid "Toggle search field" msgstr "Näytä/piilota hakukenttä" #: src/application.rs:274 msgid "The Nalux Team" msgstr "Nalux-tiimi" #: src/application.rs:282 msgid "Report Issues" msgstr "Ilmoita ongelmista" #. Translator credits. Replace "translator-credits" with your name/username, and optionally an email or URL. #. One name per line, please do not remove previous names. #: src/application.rs:288 msgid "translator-credits" msgstr "Jiri Grönroos" #: src/application.rs:289 msgid "Icon by" msgstr "Kuvakkeen teki" #: src/ui/dialogs/app_dialog.rs:155 src/ui/dialogs/process_dialog.rs:133 src/ui/dialogs/process_dialog.rs:137 src/ui/dialogs/process_dialog.rs:146 #: src/ui/dialogs/process_dialog.rs:148 src/ui/dialogs/process_dialog.rs:171 src/ui/dialogs/process_dialog.rs:178 src/ui/dialogs/process_dialog.rs:185 #: src/ui/dialogs/process_dialog.rs:192 src/ui/pages/applications/mod.rs:948 src/ui/pages/applications/mod.rs:1074 src/ui/pages/battery.rs:205 #: src/ui/pages/battery.rs:225 src/ui/pages/battery.rs:231 src/ui/pages/battery.rs:234 src/ui/pages/battery.rs:265 src/ui/pages/battery.rs:289 #: src/ui/pages/battery.rs:291 src/ui/pages/battery.rs:301 src/ui/pages/cpu.rs:243 src/ui/pages/cpu.rs:258 src/ui/pages/cpu.rs:277 src/ui/pages/cpu.rs:283 #: src/ui/pages/cpu.rs:289 src/ui/pages/cpu.rs:295 src/ui/pages/cpu.rs:299 src/ui/pages/cpu.rs:302 src/ui/pages/cpu.rs:340 src/ui/pages/cpu.rs:447 #: src/ui/pages/drive.rs:319 src/ui/pages/drive.rs:350 src/ui/pages/drive.rs:352 src/ui/pages/drive.rs:381 src/ui/pages/drive.rs:383 src/ui/pages/drive.rs:399 #: src/ui/pages/drive.rs:400 src/ui/pages/drive.rs:407 src/ui/pages/drive.rs:417 src/ui/pages/drive.rs:427 src/ui/pages/drive.rs:433 src/ui/pages/gpu.rs:244 #: src/ui/pages/gpu.rs:251 src/ui/pages/gpu.rs:296 src/ui/pages/gpu.rs:321 src/ui/pages/gpu.rs:324 src/ui/pages/gpu.rs:335 src/ui/pages/gpu.rs:355 #: src/ui/pages/gpu.rs:367 src/ui/pages/gpu.rs:378 src/ui/pages/gpu.rs:390 src/ui/pages/gpu.rs:397 src/ui/pages/gpu.rs:401 src/ui/pages/gpu.rs:431 #: src/ui/pages/gpu.rs:437 src/ui/pages/memory.rs:227 src/ui/pages/memory.rs:228 src/ui/pages/memory.rs:232 src/ui/pages/memory.rs:233 src/ui/pages/memory.rs:237 #: src/ui/pages/memory.rs:238 src/ui/pages/memory.rs:266 src/ui/pages/memory.rs:327 src/ui/pages/network.rs:252 src/ui/pages/network.rs:259 #: src/ui/pages/network.rs:266 src/ui/pages/network.rs:272 src/ui/pages/network.rs:275 src/ui/pages/network.rs:285 src/ui/pages/network.rs:292 #: src/ui/pages/network.rs:302 src/ui/pages/network.rs:370 src/ui/pages/network.rs:373 src/ui/pages/network.rs:375 src/ui/pages/network.rs:404 #: src/ui/pages/network.rs:407 src/ui/pages/network.rs:409 src/ui/pages/network.rs:417 src/ui/pages/network.rs:424 src/ui/pages/network.rs:434 #: src/ui/pages/processes/mod.rs:1224 src/ui/pages/processes/mod.rs:1291 src/ui/pages/processes/mod.rs:1358 src/ui/pages/processes/mod.rs:1425 #: src/ui/pages/processes/mod.rs:1911 src/ui/pages/processes/mod.rs:1913 src/utils/battery.rs:149 src/utils/drive.rs:136 src/utils/gpu/mod.rs:275 #: src/utils/gpu/mod.rs:287 src/utils/link/mod.rs:61 src/utils/npu/mod.rs:243 src/utils/npu/mod.rs:249 msgid "N/A" msgstr "-" #: src/ui/dialogs/process_options_dialog.rs:147 src/ui/pages/cpu.rs:257 src/ui/pages/cpu.rs:416 src/ui/pages/cpu.rs:420 msgid "CPU {}" msgstr "Suoritin {}" #: src/ui/pages/applications/application_entry.rs:190 src/ui/pages/drive.rs:414 src/ui/pages/drive.rs:424 src/ui/pages/processes/process_entry.rs:211 msgid "No" msgstr "Ei" #: src/ui/pages/applications/application_entry.rs:191 src/ui/pages/processes/process_entry.rs:212 msgid "Yes (Flatpak)" msgstr "Kyllä (Flatpak)" #: src/ui/pages/applications/application_entry.rs:192 src/ui/pages/processes/process_entry.rs:213 msgid "Yes (Snap)" msgstr "Kyllä (Snap)" #: src/ui/pages/applications/mod.rs:660 msgid "Running Apps: {}" msgstr "Sovelluksia käynnissä: {}" #: src/ui/pages/applications/mod.rs:700 src/ui/pages/processes/mod.rs:862 msgid "Cancel" msgstr "Peru" #: src/ui/pages/applications/mod.rs:746 msgid "App" msgstr "Sovellus" #: src/ui/pages/applications/mod.rs:1539 src/ui/pages/processes/mod.rs:2073 msgid "End {}?" msgstr "Lopetetaanko {}?" #: src/ui/pages/applications/mod.rs:1540 src/ui/pages/processes/mod.rs:2074 msgid "Halt {}?" msgstr "Seisautetaanko {}?" #: src/ui/pages/applications/mod.rs:1541 src/ui/pages/processes/mod.rs:2075 msgid "Kill {}?" msgstr "Tapetaanko {}?" #: src/ui/pages/applications/mod.rs:1542 src/ui/pages/processes/mod.rs:2076 msgid "Continue {}?" msgstr "Jatketaanko {}?" #: src/ui/pages/applications/mod.rs:1548 src/ui/pages/processes/mod.rs:2111 msgid "Unsaved work might be lost." msgstr "Tallentamattomat työt saattavat kadota." #: src/ui/pages/applications/mod.rs:1550 msgid "Halting an app can come with serious risks such as losing data and security implications. Use with caution." msgstr "Sovelluksen seisauttaminen saattaa sisältää riskejä kuten tietojen menetyksen tai tietoturvaongelmia. Käytä varoen." #: src/ui/pages/applications/mod.rs:1553 msgid "Killing an app can come with serious risks such as losing data and security implications. Use with caution." msgstr "Sovelluksen tappaminen saattaa sisältää riskejä kuten tietojen menetyksen tai tietoturvaongelmia. Käytä varoen." #: src/ui/pages/battery.rs:102 src/utils/battery.rs:261 msgid "Battery" msgstr "Akku" #: src/ui/pages/battery.rs:210 msgid "Battery Charge" msgstr "Akun varaus" #: src/ui/pages/battery.rs:279 src/ui/pages/cpu.rs:437 src/ui/pages/drive.rs:344 src/ui/pages/drive.rs:375 src/ui/pages/gpu.rs:423 src/ui/pages/network.rs:362 #: src/ui/pages/network.rs:396 msgid "Highest:" msgstr "Korkein:" #: src/ui/pages/cpu.rs:242 src/ui/pages/gpu.rs:211 msgid "Total Usage" msgstr "Käyttö yhteensä" #: src/ui/pages/cpu.rs:270 src/ui/pages/gpu.rs:238 msgid "Temperature" msgstr "Lämpötila" #: src/ui/pages/drive.rs:126 msgid "Drive" msgstr "Asema" #: src/ui/pages/drive.rs:236 msgid "Drive Activity" msgstr "Aseman aktiviteetti" #: src/ui/pages/drive.rs:243 msgid "Read Speed" msgstr "Lukunopeus" #: src/ui/pages/drive.rs:247 msgid "Write Speed" msgstr "Kirjoitusnopeus" #: src/ui/pages/drive.rs:412 src/ui/pages/drive.rs:422 msgid "Yes" msgstr "Kyllä" #. Translators: This is an abbreviation for "Read" and "Write". This is displayed in the sidebar so your #. translation should preferably be quite short or an abbreviation #: src/ui/pages/drive.rs:440 msgid "R: {} · W: {}" msgstr "Lue.: {} · Kir.: {}" #: src/ui/pages/gpu.rs:219 msgid "Video Encoder/Decoder Usage" msgstr "Videon pakkauksen/purun käyttös" #: src/ui/pages/gpu.rs:225 msgid "Video Encoder Usage" msgstr "Videopakkauksen käyttö" #: src/ui/pages/gpu.rs:230 msgid "Video Decoder Usage" msgstr "Videopurun käyttö" #: src/ui/pages/gpu.rs:235 msgid "Video Memory Usage" msgstr "Videomuistin käyttö" #. Translators: This will be displayed in the sidebar, please try to keep your translation as short as (or even #. shorter than) 'Memory' #: src/ui/pages/gpu.rs:409 msgid "Memory: {}" msgstr "Muisti: {}" #: src/ui/pages/memory.rs:262 msgid "{} of {}" msgstr "{}/{}" #: src/ui/pages/memory.rs:265 msgid "{} MT/s" msgstr "{} Mt/s" #. Translators: This will be displayed in the sidebar, so your translation for "Swap" should #. preferably be quite short or an abbreviation #: src/ui/pages/memory.rs:346 msgid "{} / {} · Swap: {} %" msgstr "{} / {} · Sivutus: {} %" #: src/ui/pages/network.rs:127 src/utils/network.rs:135 msgid "Network Interface" msgstr "Verkkoliitäntä" #: src/ui/pages/network.rs:241 msgid "Receiving" msgstr "Vastaanottaa" #: src/ui/pages/network.rs:245 msgid "Sending" msgstr "Lähettää" #. Translators: This is an abbreviation for "Receive" and "Send". This is displayed in the sidebar so #. your translation should preferably be quite short or an abbreviation #: src/ui/pages/network.rs:445 msgid "R: {} · S: {}" msgstr "Vas.: {} · Läh.: {}" #: src/ui/pages/processes/mod.rs:813 msgid "Running Processes: {}" msgstr "Prosesseja käynnissä: {}" #: src/ui/pages/processes/mod.rs:911 msgid "Process" msgstr "Prosessi" #: src/ui/pages/processes/mod.rs:2083 msgid "End process?" msgid_plural "End {} processes?" msgstr[0] "Lopetetaanko prosessi?" msgstr[1] "Lopetetaanko {} prosessia?" #: src/ui/pages/processes/mod.rs:2089 msgid "Halt process?" msgid_plural "Halt {} processes?" msgstr[0] "Seisautetaanko prosessi?" msgstr[1] "Seisautetaanko {} prosessia?" #: src/ui/pages/processes/mod.rs:2095 src/ui/pages/processes/mod.rs:2101 msgid "Kill process?" msgid_plural "Kill {} processes?" msgstr[0] "Tapetaanko prosessi?" msgstr[1] "Tapetaanko {} prosessia?" #: src/ui/pages/processes/mod.rs:2113 msgid "Halting a process can come with serious risks such as losing data and security implications. Use with caution." msgstr "Prosessin seisauttaminen saattaa sisältää riskejä kuten tietojen menetyksen tai tietoturvaongelmia. Käytä varoen." #: src/ui/pages/processes/mod.rs:2116 msgid "Killing a process can come with serious risks such as losing data and security implications. Use with caution." msgstr "Prosessin tappaminen saattaa sisältää riskejä kuten tietojen menetyksen tai tietoturvaongelmia. Käytä varoen." #: src/ui/window.rs:466 msgid "GPU {}" msgstr "Näytönohjain {}" #: src/ui/window.rs:496 msgid "NPU {}" msgstr "NPU {}" #: src/ui/window.rs:498 msgid "NPU" msgstr "NPU" #: src/ui/window.rs:1167 msgid "Successfully adjusted {}" msgstr "Onnistuneesti säädetty {}" #: src/ui/window.rs:1168 msgid "There was a problem adjusting {}" msgstr "Ongelma säätäessä {}" #: src/ui/window.rs:1250 msgid "Successfully ended {}" msgstr "Onnistuneesti lopetettu {}" #: src/ui/window.rs:1251 msgid "Successfully halted {}" msgstr "Onnistuneesti seisautettu {}" #: src/ui/window.rs:1252 msgid "Successfully killed {}" msgstr "Onnistuneesti tapettu {}" #: src/ui/window.rs:1253 msgid "Successfully continued {}" msgstr "Jatkettu onnistuneesti {}" #: src/ui/window.rs:1260 msgid "Successfully ended the process" msgid_plural "Successfully ended {} processes" msgstr[0] "Prosessi lopetettiin onnistuneesti" msgstr[1] "{} prosessia lopetettiin onnistuneesti" #: src/ui/window.rs:1266 msgid "Successfully halted the process" msgid_plural "Successfully halted {} processes" msgstr[0] "Prosessi seisautettu" msgstr[1] "{} prosessia seisautettu" #: src/ui/window.rs:1272 msgid "Successfully killed the process" msgid_plural "Successfully killed {} processes" msgstr[0] "Prosessi tapettiin onnistuneesti" msgstr[1] "{} prosessia tapettiin onnistuneesti" #: src/ui/window.rs:1278 msgid "Successfully continued the process" msgid_plural "Successfully continued {} processes" msgstr[0] "Prosessia jatkettiin onnistuneesti" msgstr[1] "{} prosessia jatkettiin onnistuneesti" #: src/ui/window.rs:1289 msgid "There was a problem ending a process" msgid_plural "There were problems ending {} processes" msgstr[0] "Prosessia lopettaessa ilmeni ongelma" msgstr[1] "{} prosessia lopettaessa ilmeni ongelmia" #: src/ui/window.rs:1295 msgid "There was a problem halting a process" msgid_plural "There were problems halting {} processes" msgstr[0] "Prosessia keskeyttäessä ilmeni ongelma" msgstr[1] "{} prosessia keskeyttäessä ilmeni ongelma" #: src/ui/window.rs:1301 msgid "There was a problem killing a process" msgid_plural "There were problems killing {} processes" msgstr[0] "Prosessia tapettaessa ilmeni ongelma" msgstr[1] "{} prosessia tapettaessa ilmeni ongelmia" #: src/ui/window.rs:1307 msgid "There was a problem continuing a process" msgid_plural "There were problems continuing {} processes" msgstr[0] "Prosessia jatkaessa ilmeni ongelma" msgstr[1] "{} prosessia jatkaessa ilmeni ongelmia" #: src/ui/window.rs:1317 msgid "There was a problem ending {}" msgstr "Ongelma lopettaessa {}" #: src/ui/window.rs:1318 msgid "There was a problem halting {}" msgstr "Ongelma keskeyttäessä {}" #: src/ui/window.rs:1319 msgid "There was a problem killing {}" msgstr "Ongelma tapettaessa {}" #: src/ui/window.rs:1320 msgid "There was a problem continuing {}" msgstr "Ongelma jatkaessa {}" #: src/utils/app.rs:219 msgid "System Processes" msgstr "Järjestelmäprosessit" #: src/utils/battery.rs:90 msgid "Charging" msgstr "Latautuu" #: src/utils/battery.rs:91 msgid "Discharging" msgstr "Purkautuu" #: src/utils/battery.rs:92 msgid "Empty" msgstr "Tyhjä" #: src/utils/battery.rs:93 msgid "Full" msgstr "Täysi" #: src/utils/battery.rs:94 msgid "Unknown" msgstr "Tuntematon" #: src/utils/battery.rs:140 msgid "Nickel-Metal Hydride" msgstr "Nikkeli-metallihydridi" #: src/utils/battery.rs:141 msgid "Nickel-Cadmium" msgstr "Nikkeli-kadmium" #: src/utils/battery.rs:142 msgid "Nickel-Zinc" msgstr "Nikkeli-sinkki" #: src/utils/battery.rs:143 msgid "Lead-Acid" msgstr "Lyijyhappo" #: src/utils/battery.rs:144 msgid "Lithium-Ion" msgstr "Litium-ioni" #: src/utils/battery.rs:145 msgid "Lithium Iron Phosphate" msgstr "Litium-rautafosfaatti" #: src/utils/battery.rs:146 msgid "Lithium Polymer" msgstr "Litium-polymeeri" #: src/utils/battery.rs:148 msgid "Rechargeable Alkaline Managanese" msgstr "Ladattava alkalimangaani" #: src/utils/battery.rs:259 msgid "{} Battery" msgstr "" #: src/utils/units.rs:91 msgid "{} K" msgstr "{} K" #: src/utils/units.rs:93 msgid "{} °C" msgstr "{} °C" #: src/utils/units.rs:95 msgid "{} °F" msgstr "{} °F" #: src/utils/units.rs:113 src/utils/units.rs:127 src/utils/units.rs:147 src/utils/units.rs:161 msgid "{} B" msgstr "" #: src/utils/units.rs:114 src/utils/units.rs:128 msgid "{} kB" msgstr "{} kt" #: src/utils/units.rs:115 src/utils/units.rs:129 msgid "{} MB" msgstr "{} Mt" #: src/utils/units.rs:116 src/utils/units.rs:130 msgid "{} GB" msgstr "{} Gt" #: src/utils/units.rs:117 src/utils/units.rs:131 msgid "{} TB" msgstr "{} Tt" #: src/utils/units.rs:118 src/utils/units.rs:132 msgid "{} PB" msgstr "{} Pt" #: src/utils/units.rs:119 src/utils/units.rs:133 msgid "{} EB" msgstr "{} Et" #: src/utils/units.rs:120 src/utils/units.rs:134 msgid "{} ZB" msgstr "{} Zt" #: src/utils/units.rs:121 src/utils/units.rs:135 msgid "{} YB" msgstr "{} Yt" #: src/utils/units.rs:122 src/utils/units.rs:136 msgid "{} RB" msgstr "{} Rt" #: src/utils/units.rs:123 src/utils/units.rs:137 msgid "{} QB" msgstr "{} Qt" #: src/utils/units.rs:148 src/utils/units.rs:162 msgid "{} KiB" msgstr "{} KiB" #: src/utils/units.rs:149 src/utils/units.rs:163 msgid "{} MiB" msgstr "{} MiB" #: src/utils/units.rs:150 src/utils/units.rs:164 msgid "{} GiB" msgstr "{} GiB" #: src/utils/units.rs:151 src/utils/units.rs:165 msgid "{} TiB" msgstr "{} TiB" #: src/utils/units.rs:152 src/utils/units.rs:166 msgid "{} PiB" msgstr "{} PiB" #: src/utils/units.rs:153 src/utils/units.rs:167 msgid "{} EiB" msgstr "{} EiB" #: src/utils/units.rs:154 src/utils/units.rs:168 msgid "{} ZiB" msgstr "{} ZiB" #: src/utils/units.rs:155 src/utils/units.rs:169 msgid "{} YiB" msgstr "{} YiB" #: src/utils/units.rs:156 src/utils/units.rs:170 msgid "{} RiB" msgstr "{} RiB" #: src/utils/units.rs:157 src/utils/units.rs:171 msgid "{} QiB" msgstr "{} QiB" #: src/utils/units.rs:198 src/utils/units.rs:215 msgid "{} B/s" msgstr "{} t/s" #: src/utils/units.rs:199 msgid "{} kB/s" msgstr "{} kt/s" #: src/utils/units.rs:200 msgid "{} MB/s" msgstr "{} Mt/s" #: src/utils/units.rs:201 msgid "{} GB/s" msgstr "{} Gt/s" #: src/utils/units.rs:202 msgid "{} TB/s" msgstr "{} Tt/s" #: src/utils/units.rs:203 msgid "{} PB/s" msgstr "{} Pt/s" #: src/utils/units.rs:204 msgid "{} EB/s" msgstr "{} Et/s" #: src/utils/units.rs:205 msgid "{} ZB/s" msgstr "{} Zt/s" #: src/utils/units.rs:206 msgid "{} YB/s" msgstr "{} Yt/s" #: src/utils/units.rs:207 msgid "{} RB/s" msgstr "{} Rt/s" #: src/utils/units.rs:208 msgid "{} QB/s" msgstr "{} Qt/s" #: src/utils/units.rs:216 msgid "{} KiB/s" msgstr "{} KiB/s" #: src/utils/units.rs:217 msgid "{} MiB/s" msgstr "{} MiB/s" #: src/utils/units.rs:218 msgid "{} GiB/s" msgstr "{} GiB/s" #: src/utils/units.rs:219 msgid "{} TiB/s" msgstr "{} TiB/s" #: src/utils/units.rs:220 msgid "{} PiB/s" msgstr "{} PiB/s" #: src/utils/units.rs:221 msgid "{} EiB/s" msgstr "{} EiB/s" #: src/utils/units.rs:222 msgid "{} ZiB/s" msgstr "{} ZiB/s" #: src/utils/units.rs:223 msgid "{} YiB/s" msgstr "{} YiB/s" #: src/utils/units.rs:224 msgid "{} RiB/s" msgstr "{} RiB/s" #: src/utils/units.rs:225 msgid "{} QiB/s" msgstr "{} QiB/s" #: src/utils/units.rs:239 src/utils/units.rs:256 msgid "{} b/s" msgstr "{} b/s" #: src/utils/units.rs:240 msgid "{} kb/s" msgstr "{} kb/s" #: src/utils/units.rs:241 msgid "{} Mb/s" msgstr "{} Mb/s" #: src/utils/units.rs:242 msgid "{} Gb/s" msgstr "{} Gb/s" #: src/utils/units.rs:243 msgid "{} Tb/s" msgstr "{} Tb/s" #: src/utils/units.rs:244 msgid "{} Pb/s" msgstr "{} Pb/s" #: src/utils/units.rs:245 msgid "{} Eb/s" msgstr "{} Eb/s" #: src/utils/units.rs:246 msgid "{} Zb/s" msgstr "{} Zb/s" #: src/utils/units.rs:247 msgid "{} Yb/s" msgstr "{} Yb/s" #: src/utils/units.rs:248 msgid "{} Rb/s" msgstr "{} Rb/s" #: src/utils/units.rs:249 msgid "{} Qb/s" msgstr "{} Qb/s" #: src/utils/units.rs:257 msgid "{} Kib/s" msgstr "{} Kib/s" #: src/utils/units.rs:258 msgid "{} Mib/s" msgstr "{} Mib/s" #: src/utils/units.rs:259 msgid "{} Gib/s" msgstr "{} Gib/s" #: src/utils/units.rs:260 msgid "{} Tib/s" msgstr "{} Tib/s" #: src/utils/units.rs:261 msgid "{} Pib/s" msgstr "{} Pib/s" #: src/utils/units.rs:262 msgid "{} Eib/s" msgstr "{} Eib/s" #: src/utils/units.rs:263 msgid "{} Zib/s" msgstr "{} Zib/s" #: src/utils/units.rs:264 msgid "{} Yib/s" msgstr "{} Yib/s" #: src/utils/units.rs:265 msgid "{} Rib/s" msgstr "{} Rib/s" #: src/utils/units.rs:266 msgid "{} Qib/s" msgstr "{} Qib/s" #: src/utils/units.rs:273 msgid "{} Hz" msgstr "{} Hz" #: src/utils/units.rs:274 msgid "{} kHz" msgstr "{} kHz" #: src/utils/units.rs:275 msgid "{} MHz" msgstr "{} MHz" #: src/utils/units.rs:276 msgid "{} GHz" msgstr "{} GHz" #: src/utils/units.rs:277 msgid "{} THz" msgstr "{} THz" #: src/utils/units.rs:278 msgid "{} PHz" msgstr "{} PHz" #: src/utils/units.rs:279 msgid "{} EHz" msgstr "{} EHz" #: src/utils/units.rs:280 msgid "{} ZHz" msgstr "{} ZHz" #: src/utils/units.rs:281 msgid "{} YHz" msgstr "{} YHz" #: src/utils/units.rs:282 msgid "{} RHz" msgstr "{} RHz" #: src/utils/units.rs:283 msgid "{} QHz" msgstr "{} QHz" #: src/utils/units.rs:290 msgid "{} W" msgstr "{} W" #: src/utils/units.rs:291 msgid "{} kW" msgstr "{} kW" #: src/utils/units.rs:292 msgid "{} MW" msgstr "{} MW" #: src/utils/units.rs:293 msgid "{} GW" msgstr "{} GW" #: src/utils/units.rs:294 msgid "{} TW" msgstr "{} TW" #: src/utils/units.rs:295 msgid "{} PW" msgstr "{} PW" #: src/utils/units.rs:296 msgid "{} EW" msgstr "{} EW" #: src/utils/units.rs:297 msgid "{} ZW" msgstr "{} ZW" #: src/utils/units.rs:298 msgid "{} YW" msgstr "{} YW" #: src/utils/units.rs:299 msgid "{} RW" msgstr "{} RW" #: src/utils/units.rs:300 msgid "{} QW" msgstr "{} QW" #: src/utils/units.rs:309 src/utils/units.rs:323 msgid "{} Wh" msgstr "{} Wh" #: src/utils/units.rs:310 src/utils/units.rs:324 msgid "{} kWh" msgstr "{} kWh" #: src/utils/units.rs:311 src/utils/units.rs:325 msgid "{} MWh" msgstr "{} MWh" #: src/utils/units.rs:312 src/utils/units.rs:326 msgid "{} GWh" msgstr "{} GWh" #: src/utils/units.rs:313 src/utils/units.rs:327 msgid "{} TWh" msgstr "{} TWh" #: src/utils/units.rs:314 src/utils/units.rs:328 msgid "{} PWh" msgstr "{} PWh" #: src/utils/units.rs:315 src/utils/units.rs:329 msgid "{} EWh" msgstr "{} EWh" #: src/utils/units.rs:316 src/utils/units.rs:330 msgid "{} ZWh" msgstr "{} ZWh" #: src/utils/units.rs:317 src/utils/units.rs:331 msgid "{} YWh" msgstr "{} YWh" #: src/utils/units.rs:318 src/utils/units.rs:332 msgid "{} RWh" msgstr "{} RWh" #: src/utils/units.rs:319 src/utils/units.rs:333 msgid "{} QWh" msgstr "{} QWh" #: src/utils/drive.rs:128 src/utils/drive.rs:207 msgid "CD/DVD/Blu-ray Drive" msgstr "CD/DVD/Blu-ray-asema" #: src/utils/drive.rs:129 msgid "eMMC Storage" msgstr "eMMC-tallennustila" #: src/utils/drive.rs:130 msgid "Flash Storage" msgstr "Flash-tallennustila" #: src/utils/drive.rs:131 src/utils/drive.rs:208 msgid "Floppy Drive" msgstr "Levykeasema" #: src/utils/drive.rs:132 msgid "Hard Disk Drive" msgstr "Kiintolevy" #: src/utils/drive.rs:133 msgid "Loop Device" msgstr "Takaisinkytkentälaite" #: src/utils/drive.rs:134 msgid "Mapped Device" msgstr "" #: src/utils/drive.rs:135 msgid "NVMe Drive" msgstr "NVMe-asema" #: src/utils/drive.rs:137 msgid "Software Raid" msgstr "Ohjelmisto-Raid" #: src/utils/drive.rs:138 msgid "RAM Disk" msgstr "RAM-asema" #: src/utils/drive.rs:139 msgid "Solid State Drive" msgstr "SSD-asema" #: src/utils/drive.rs:140 msgid "ZFS Volume" msgstr "ZFS-taltio" #: src/utils/drive.rs:141 msgid "Compressed RAM Disk (zram)" msgstr "Pakattu RAM-asema (zram)" #: src/utils/drive.rs:209 msgid "{} Loop Device" msgstr "{}-takaisinkytkentälaite" #: src/utils/drive.rs:210 msgid "{} Mapped Device" msgstr "" #: src/utils/drive.rs:211 msgid "{} RAID" msgstr "{} RAID" #: src/utils/drive.rs:212 msgid "{} RAM Disk" msgstr "" #: src/utils/drive.rs:213 msgid "{} zram Device" msgstr "{}-zram-laite" #: src/utils/drive.rs:214 msgid "{} ZFS Volume" msgstr "{}-ZFS-taltio" #: src/utils/drive.rs:215 msgid "{} Drive" msgstr "{}-asema" #: src/utils/network.rs:123 msgid "Bluetooth Tether" msgstr "" #: src/utils/network.rs:124 msgid "Network Bridge" msgstr "Verkkosilta" #: src/utils/network.rs:125 msgid "Ethernet Connection" msgstr "Ethernet-yhteys" #: src/utils/network.rs:126 msgid "Docker Bridge" msgstr "Docker-silta" #: src/utils/network.rs:127 msgid "InfiniBand Connection" msgstr "InfiniBand-yhteys" #: src/utils/network.rs:128 msgid "Serial Line IP Connection" msgstr "Serial Line IP -yhteys" #: src/utils/network.rs:129 msgid "Virtual Ethernet Device" msgstr "Virtuaalinen Ethernet-laite" #: src/utils/network.rs:130 msgid "VM Network Bridge" msgstr "VM-verkkosilta" #: src/utils/network.rs:131 msgid "VPN Tunnel" msgstr "VPN-tunneli" #: src/utils/network.rs:132 msgid "VPN Tunnel (WireGuard)" msgstr "VPN-tunneli (WireGuard)" #: src/utils/network.rs:133 msgid "Wi-Fi Connection" msgstr "Wi-Fi-yhteys" #: src/utils/network.rs:134 msgid "WWAN Connection" msgstr "WWAN-yhteys" resources-1.9.1/po/fr.po000066400000000000000000001447771510634446000151500ustar00rootroot00000000000000# # nokyan , 2023. # msgid "" msgstr "" "Project-Id-Version: resources\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-03-05 18:24+0100\n" "PO-Revision-Date: 2025-03-18 20:58+0100\n" "Last-Translator: nokyan \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: Poedit 3.4.2\n" "X-Poedit-SourceCharset: UTF-8\n" #: data/net.nokyan.Resources.desktop.in.in:3 #: data/net.nokyan.Resources.metainfo.xml.in.in:4 src/application.rs:265 #: data/resources/ui/window.ui:22 msgid "Resources" msgstr "Ressources" #. Translators: The summary should be 35 characters or less according to Flathub appstream guidelines #: data/net.nokyan.Resources.desktop.in.in:4 #: data/net.nokyan.Resources.metainfo.xml.in.in:5 msgid "Keep an eye on system resources" msgstr "Surveiller les ressources du système" #: data/net.nokyan.Resources.desktop.in.in:10 msgid "" "System;Resources;Monitor;Processes;Usage;Task;Manager;CPU;RAM;Memory;GPU;" msgstr "" "Système;Ressources;Moniteur;Processus;Utilisation;Tâches;CPU;RAM;Mémoire;GPU;" #: data/net.nokyan.Resources.metainfo.xml.in.in:17 msgid "" "Resources allows you to check the utilization of your system resources and " "control your running processes and apps. It’s designed to be user-friendly " "and feel right at home on a modern desktop by using GNOME’s libadwaita." msgstr "" "Resources vous permet de vérifier l'utilisation des ressources de votre " "système et de contrôler les processus et applications en cours d'exécution. " "Il est conçu pour être convivial grâce à l'utilisation de la bibliothèque " "GNOME libadwaita." #: data/net.nokyan.Resources.metainfo.xml.in.in:20 msgid "Resources supports monitoring the following components:" msgstr "Resources prend en charge la surveillance des composants suivants :" #: data/net.nokyan.Resources.metainfo.xml.in.in:24 msgid "CPU" msgstr "CPU" #: data/net.nokyan.Resources.metainfo.xml.in.in:25 #: src/ui/pages/applications/mod.rs:802 src/ui/pages/memory.rs:106 #: src/ui/pages/memory.rs:191 src/ui/pages/processes/mod.rs:1078 #: data/resources/ui/window.ui:176 data/resources/ui/window.ui:183 #: data/resources/ui/dialogs/app_dialog.ui:82 #: data/resources/ui/dialogs/process_dialog.ui:64 #: data/resources/ui/dialogs/settings_dialog.ui:128 #: data/resources/ui/dialogs/settings_dialog.ui:220 msgid "Memory" msgstr "Mémoire" #: data/net.nokyan.Resources.metainfo.xml.in.in:26 #: src/ui/pages/applications/mod.rs:1175 src/ui/pages/gpu.rs:118 #: src/ui/pages/processes/mod.rs:1462 src/ui/window.rs:454 #: data/resources/ui/dialogs/app_dialog.ui:140 #: data/resources/ui/dialogs/process_dialog.ui:118 #: data/resources/ui/dialogs/settings_dialog.ui:158 #: data/resources/ui/dialogs/settings_dialog.ui:250 msgid "GPU" msgstr "GPU" #: data/net.nokyan.Resources.metainfo.xml.in.in:27 #: data/resources/ui/dialogs/settings_dialog.ui:319 msgid "Network Interfaces" msgstr "Interfaces réseau" #: data/net.nokyan.Resources.metainfo.xml.in.in:28 msgid "Storage Devices" msgstr "Disques" #: data/net.nokyan.Resources.metainfo.xml.in.in:29 msgid "Batteries" msgstr "Batteries" #: data/net.nokyan.Resources.metainfo.xml.in.in:51 msgid "Apps page in light theme" msgstr "Page \"Applications\" avec un thème clair" #: data/net.nokyan.Resources.metainfo.xml.in.in:55 msgid "Processes page in dark theme" msgstr "Page \"Processus\" avec un thème sombre" #: data/net.nokyan.Resources.metainfo.xml.in.in:59 msgid "Processor page in light theme" msgstr "Page \"Processeur\" avec un thème clair" #: data/net.nokyan.Resources.metainfo.xml.in.in:63 msgid "Memory page in dark theme" msgstr "Page \"Mémoire\" avec un thème sombre" #: data/net.nokyan.Resources.metainfo.xml.in.in:67 msgid "GPU page in light theme" msgstr "Page \"GPU\" avec un thème clair" #: data/net.nokyan.Resources.metainfo.xml.in.in:71 msgid "Drive page in dark theme" msgstr "Page \"Disque\" avec un thème sombre" #: data/net.nokyan.Resources.metainfo.xml.in.in:75 msgid "Network Interface page in light theme" msgstr "Page \"Interface réseau\" avec un thème clair" #: data/net.nokyan.Resources.metainfo.xml.in.in:79 msgid "Battery page in dark theme" msgstr "Page \"Batterie\" avec un thème sombre" #: src/application.rs:267 msgid "The Nalux Team" msgstr "L'équipe Nalux" #: src/application.rs:275 msgid "Report Issues" msgstr "Signaler des problèmes" #. Translator credits. Replace "translator-credits" with your name/username, and optionally an email or URL. #. One name per line, please do not remove previous names. #: src/application.rs:281 msgid "translator-credits" msgstr "Tomfez " #: src/application.rs:282 msgid "Icon by" msgstr "Icône par" #: src/ui/dialogs/app_dialog.rs:153 src/ui/dialogs/process_dialog.rs:131 #: src/ui/dialogs/process_dialog.rs:135 src/ui/dialogs/process_dialog.rs:144 #: src/ui/dialogs/process_dialog.rs:146 src/ui/dialogs/process_dialog.rs:169 #: src/ui/dialogs/process_dialog.rs:176 src/ui/dialogs/process_dialog.rs:183 #: src/ui/dialogs/process_dialog.rs:190 src/ui/pages/applications/mod.rs:945 #: src/ui/pages/applications/mod.rs:1069 src/ui/pages/battery.rs:204 #: src/ui/pages/battery.rs:224 src/ui/pages/battery.rs:230 #: src/ui/pages/battery.rs:233 src/ui/pages/battery.rs:264 #: src/ui/pages/battery.rs:288 src/ui/pages/battery.rs:290 #: src/ui/pages/battery.rs:300 src/ui/pages/cpu.rs:237 src/ui/pages/cpu.rs:252 #: src/ui/pages/cpu.rs:271 src/ui/pages/cpu.rs:277 src/ui/pages/cpu.rs:283 #: src/ui/pages/cpu.rs:289 src/ui/pages/cpu.rs:293 src/ui/pages/cpu.rs:296 #: src/ui/pages/cpu.rs:420 src/ui/pages/drive.rs:315 src/ui/pages/drive.rs:346 #: src/ui/pages/drive.rs:348 src/ui/pages/drive.rs:377 #: src/ui/pages/drive.rs:379 src/ui/pages/drive.rs:395 #: src/ui/pages/drive.rs:396 src/ui/pages/drive.rs:403 #: src/ui/pages/drive.rs:413 src/ui/pages/drive.rs:423 #: src/ui/pages/drive.rs:429 src/ui/pages/gpu.rs:243 src/ui/pages/gpu.rs:250 #: src/ui/pages/gpu.rs:295 src/ui/pages/gpu.rs:320 src/ui/pages/gpu.rs:323 #: src/ui/pages/gpu.rs:334 src/ui/pages/gpu.rs:354 src/ui/pages/gpu.rs:366 #: src/ui/pages/gpu.rs:377 src/ui/pages/gpu.rs:389 src/ui/pages/gpu.rs:396 #: src/ui/pages/gpu.rs:400 src/ui/pages/gpu.rs:430 src/ui/pages/gpu.rs:436 #: src/ui/pages/memory.rs:226 src/ui/pages/memory.rs:227 #: src/ui/pages/memory.rs:231 src/ui/pages/memory.rs:232 #: src/ui/pages/memory.rs:236 src/ui/pages/memory.rs:237 #: src/ui/pages/memory.rs:265 src/ui/pages/memory.rs:326 #: src/ui/pages/network.rs:240 src/ui/pages/network.rs:247 #: src/ui/pages/network.rs:254 src/ui/pages/network.rs:260 #: src/ui/pages/network.rs:263 src/ui/pages/network.rs:270 #: src/ui/pages/network.rs:335 src/ui/pages/network.rs:338 #: src/ui/pages/network.rs:340 src/ui/pages/network.rs:369 #: src/ui/pages/network.rs:372 src/ui/pages/network.rs:374 #: src/ui/pages/npu.rs:217 src/ui/pages/npu.rs:253 src/ui/pages/npu.rs:308 #: src/ui/pages/npu.rs:317 src/ui/pages/npu.rs:329 src/ui/pages/npu.rs:336 #: src/ui/pages/npu.rs:340 src/ui/pages/npu.rs:361 src/ui/pages/npu.rs:367 #: src/ui/pages/processes/mod.rs:1220 src/ui/pages/processes/mod.rs:1286 #: src/ui/pages/processes/mod.rs:1352 src/ui/pages/processes/mod.rs:1418 #: src/ui/pages/processes/mod.rs:1900 src/ui/pages/processes/mod.rs:1902 #: src/utils/battery.rs:149 src/utils/drive.rs:136 src/utils/gpu/mod.rs:284 #: src/utils/gpu/mod.rs:296 src/utils/link.rs:314 src/utils/npu/mod.rs:260 #: src/utils/npu/mod.rs:266 msgid "N/A" msgstr "S/O" #: src/ui/dialogs/process_options_dialog.rs:145 src/ui/pages/cpu.rs:251 #: src/ui/pages/cpu.rs:389 src/ui/pages/cpu.rs:393 msgid "CPU {}" msgstr "CPU {}" #: src/ui/pages/applications/application_entry.rs:190 src/ui/pages/drive.rs:410 #: src/ui/pages/drive.rs:420 src/ui/pages/processes/process_entry.rs:211 msgid "No" msgstr "Non" #: src/ui/pages/applications/application_entry.rs:191 #: src/ui/pages/processes/process_entry.rs:212 msgid "Yes (Flatpak)" msgstr "Oui (Flatpak)" #: src/ui/pages/applications/application_entry.rs:192 #: src/ui/pages/processes/process_entry.rs:213 msgid "Yes (Snap)" msgstr "Oui (Snap)" #: src/ui/pages/applications/mod.rs:131 data/resources/ui/window.ui:65 #: data/resources/ui/window.ui:72 #: data/resources/ui/dialogs/settings_dialog.ui:122 msgid "Apps" msgstr "Applications" #. -1 because we don't want to count System Processes #: src/ui/pages/applications/mod.rs:659 msgid "Running Apps: {}" msgstr "Applications en cours: {}" #: src/ui/pages/applications/mod.rs:699 src/ui/pages/processes/mod.rs:861 msgid "Cancel" msgstr "Annuler" #: src/ui/pages/applications/mod.rs:745 msgid "App" msgstr "Application" #: src/ui/pages/applications/mod.rs:861 src/ui/pages/cpu.rs:123 #: src/ui/pages/processes/mod.rs:1136 src/ui/window.rs:289 #: data/resources/ui/window.ui:145 data/resources/ui/window.ui:152 #: data/resources/ui/dialogs/app_dialog.ui:73 #: data/resources/ui/dialogs/process_dialog.ui:55 #: data/resources/ui/dialogs/settings_dialog.ui:133 #: data/resources/ui/dialogs/settings_dialog.ui:225 msgid "Processor" msgstr "Processeur" #: src/ui/pages/applications/mod.rs:924 src/ui/pages/processes/mod.rs:1199 #: data/resources/ui/dialogs/app_dialog.ui:100 #: data/resources/ui/dialogs/process_dialog.ui:78 #: data/resources/ui/dialogs/settings_dialog.ui:138 #: data/resources/ui/dialogs/settings_dialog.ui:230 msgid "Drive Read" msgstr "Lecture disque" #: src/ui/pages/applications/mod.rs:988 src/ui/pages/processes/mod.rs:1265 #: data/resources/ui/dialogs/app_dialog.ui:109 #: data/resources/ui/dialogs/process_dialog.ui:87 #: data/resources/ui/dialogs/settings_dialog.ui:143 #: data/resources/ui/dialogs/settings_dialog.ui:235 msgid "Drive Read Total" msgstr "Total lecture du disque" #: src/ui/pages/applications/mod.rs:1048 src/ui/pages/processes/mod.rs:1331 #: data/resources/ui/dialogs/app_dialog.ui:118 #: data/resources/ui/dialogs/process_dialog.ui:96 #: data/resources/ui/dialogs/settings_dialog.ui:148 #: data/resources/ui/dialogs/settings_dialog.ui:240 msgid "Drive Write" msgstr "Écriture disque" #: src/ui/pages/applications/mod.rs:1114 src/ui/pages/processes/mod.rs:1397 #: data/resources/ui/dialogs/app_dialog.ui:127 #: data/resources/ui/dialogs/process_dialog.ui:105 #: data/resources/ui/dialogs/settings_dialog.ui:153 #: data/resources/ui/dialogs/settings_dialog.ui:245 msgid "Drive Write Total" msgstr "Total écriture du disque" #: src/ui/pages/applications/mod.rs:1233 src/ui/pages/processes/mod.rs:1520 #: data/resources/ui/dialogs/app_dialog.ui:158 #: data/resources/ui/dialogs/process_dialog.ui:136 #: data/resources/ui/dialogs/settings_dialog.ui:168 #: data/resources/ui/dialogs/settings_dialog.ui:260 msgid "Video Encoder" msgstr "Encodeur vidéo" #: src/ui/pages/applications/mod.rs:1293 src/ui/pages/processes/mod.rs:1580 #: data/resources/ui/dialogs/app_dialog.ui:167 #: data/resources/ui/dialogs/process_dialog.ui:145 #: data/resources/ui/dialogs/settings_dialog.ui:173 #: data/resources/ui/dialogs/settings_dialog.ui:265 msgid "Video Decoder" msgstr "Décodeur vidéo" #: src/ui/pages/applications/mod.rs:1352 src/ui/pages/processes/mod.rs:1640 #: data/resources/ui/dialogs/app_dialog.ui:149 #: data/resources/ui/dialogs/process_dialog.ui:127 #: data/resources/ui/dialogs/settings_dialog.ui:163 #: data/resources/ui/dialogs/settings_dialog.ui:255 msgid "Video Memory" msgstr "Mémoire vidéo" #: src/ui/pages/applications/mod.rs:1410 src/ui/pages/memory.rs:197 #: src/ui/pages/processes/mod.rs:1943 #: data/resources/ui/dialogs/app_dialog.ui:91 #: data/resources/ui/dialogs/process_dialog.ui:73 #: data/resources/ui/dialogs/settings_dialog.ui:178 #: data/resources/ui/dialogs/settings_dialog.ui:290 msgid "Swap" msgstr "Échange" #: src/ui/pages/applications/mod.rs:1469 src/ui/pages/processes/mod.rs:2001 #: data/resources/ui/dialogs/settings_dialog.ui:183 #: data/resources/ui/dialogs/settings_dialog.ui:295 msgid "Combined Memory" msgstr "Mémoire combinée" #: src/ui/pages/applications/mod.rs:1528 src/ui/pages/processes/mod.rs:2060 msgid "End {}?" msgstr "Arrêter {} ?" #: src/ui/pages/applications/mod.rs:1529 src/ui/pages/processes/mod.rs:2061 msgid "Halt {}?" msgstr "Mettre {} en pause ?" #: src/ui/pages/applications/mod.rs:1530 src/ui/pages/processes/mod.rs:2062 msgid "Kill {}?" msgstr "Tuer {} ?" #: src/ui/pages/applications/mod.rs:1531 src/ui/pages/processes/mod.rs:2063 msgid "Continue {}?" msgstr "Continuer {} ?" #: src/ui/pages/applications/mod.rs:1537 src/ui/pages/processes/mod.rs:2098 msgid "Unsaved work might be lost." msgstr "Les travaux non sauvegardés peuvent être perdus." #: src/ui/pages/applications/mod.rs:1539 msgid "" "Halting an app can come with serious risks such as losing data and security " "implications. Use with caution." msgstr "" "La mise en pause d'une application comporte des risques tels que la perte de " "données ainsi que des problèmes de sécurité. Soyez prudent." #: src/ui/pages/applications/mod.rs:1542 msgid "" "Killing an app can come with serious risks such as losing data and security " "implications. Use with caution." msgstr "" "Tuer une application comporte des risques tels que la perte de données ainsi " "que des problèmes de sécurité. Soyez prudent." #: src/ui/pages/applications/mod.rs:1550 #: data/resources/ui/pages/applications.ui:22 #: data/resources/ui/pages/applications.ui:98 msgid "End App" msgstr "Arrêter l'application" #: src/ui/pages/applications/mod.rs:1551 #: data/resources/ui/pages/applications.ui:10 #: data/resources/ui/pages/applications.ui:30 msgid "Halt App" msgstr "Mettre l'application en pause" #: src/ui/pages/applications/mod.rs:1552 #: data/resources/ui/pages/applications.ui:6 #: data/resources/ui/pages/applications.ui:26 msgid "Kill App" msgstr "Tuer l'application" #: src/ui/pages/applications/mod.rs:1553 #: data/resources/ui/pages/applications.ui:14 #: data/resources/ui/pages/applications.ui:34 msgid "Continue App" msgstr "Continuer l'application" #: src/ui/pages/battery.rs:102 src/ui/pages/drive.rs:126 msgid "Drive" msgstr "Disque" #: src/ui/pages/battery.rs:209 msgid "Battery Charge" msgstr "Charge de la batterie" #: src/ui/pages/battery.rs:216 data/resources/ui/pages/gpu.ui:55 #: data/resources/ui/pages/npu.ui:49 msgid "Power Usage" msgstr "Utilisation de la puissance" #: src/ui/pages/battery.rs:278 src/ui/pages/cpu.rs:410 #: src/ui/pages/drive.rs:340 src/ui/pages/drive.rs:371 src/ui/pages/gpu.rs:422 #: src/ui/pages/network.rs:327 src/ui/pages/network.rs:361 #: src/ui/pages/npu.rs:304 src/ui/pages/npu.rs:353 msgid "Highest:" msgstr "Maximal :" #: src/ui/pages/cpu.rs:236 src/ui/pages/gpu.rs:210 src/ui/pages/npu.rs:201 msgid "Total Usage" msgstr "Utilisation totale" #: src/ui/pages/cpu.rs:264 src/ui/pages/gpu.rs:237 src/ui/pages/npu.rs:211 msgid "Temperature" msgstr "Température" #: src/ui/pages/drive.rs:235 msgid "Drive Activity" msgstr "Activité du disque" #: src/ui/pages/drive.rs:242 msgid "Read Speed" msgstr "Vitesse de lecture" #: src/ui/pages/drive.rs:246 msgid "Write Speed" msgstr "Vitesse d'écriture" #: src/ui/pages/drive.rs:408 src/ui/pages/drive.rs:418 msgid "Yes" msgstr "Oui" #. Translators: This is an abbreviation for "Read" and "Write". This is displayed in the sidebar so your #. translation should preferably be quite short or an abbreviation #: src/ui/pages/drive.rs:436 msgid "R: {} · W: {}" msgstr "L: {} · E: {}" #: src/ui/pages/gpu.rs:218 msgid "Video Encoder/Decoder Usage" msgstr "Utilisation encodeur/décodeur vidéo" #: src/ui/pages/gpu.rs:224 msgid "Video Encoder Usage" msgstr "Utilisation de l'encodeur vidéo" #: src/ui/pages/gpu.rs:229 msgid "Video Decoder Usage" msgstr "Utilisation du décodeur vidéo" #: src/ui/pages/gpu.rs:234 msgid "Video Memory Usage" msgstr "Utilisation de la mémoire vidéo" #. Translators: This will be displayed in the sidebar, please try to keep your translation as short as (or even #. shorter than) 'Memory' #: src/ui/pages/gpu.rs:408 src/ui/pages/npu.rs:278 src/ui/pages/npu.rs:299 msgid "Memory: {}" msgstr "Mémoire: {}" #: src/ui/pages/memory.rs:261 msgid "{} of {}" msgstr "{} sur {}" #: src/ui/pages/memory.rs:264 msgid "{} MT/s" msgstr "{} MT/s" #. Translators: This will be displayed in the sidebar, so your translation for "Swap" should #. preferably be quite short or an abbreviation #: src/ui/pages/memory.rs:345 msgid "{} / {} · Swap: {} %" msgstr "{} / {} · Swap: {} %" #: src/ui/pages/network.rs:118 src/utils/network.rs:136 msgid "Network Interface" msgstr "Interface réseau" #: src/ui/pages/network.rs:229 msgid "Receiving" msgstr "Réception" #: src/ui/pages/network.rs:233 msgid "Sending" msgstr "Envoi" #. Translators: This is an abbreviation for "Receive" and "Send". This is displayed in the sidebar so #. your translation should preferably be quite short or an abbreviation #: src/ui/pages/network.rs:384 msgid "R: {} · S: {}" msgstr "R: {} · E: {}" #: src/ui/pages/npu.rs:109 src/ui/window.rs:484 msgid "NPU" msgstr "NPU" #: src/ui/pages/npu.rs:208 msgid "Memory Usage" msgstr "Utilisation de la mémoire" #: src/ui/pages/processes/mod.rs:175 data/resources/ui/window.ui:105 #: data/resources/ui/window.ui:112 #: data/resources/ui/dialogs/settings_dialog.ui:193 msgid "Processes" msgstr "Processus" #: src/ui/pages/processes/mod.rs:522 src/ui/pages/processes/mod.rs:2111 #: data/resources/ui/pages/processes.ui:38 #: data/resources/ui/pages/processes.ui:157 msgid "End Process" msgstr "Arrêter le processus" #: src/ui/pages/processes/mod.rs:526 data/resources/ui/pages/processes.ui:70 msgid "End Processes" msgstr "Arrêter les processus" #: src/ui/pages/processes/mod.rs:812 msgid "Running Processes: {}" msgstr "Processus en cours: {}" #: src/ui/pages/processes/mod.rs:910 msgid "Process" msgstr "Processus" #: src/ui/pages/processes/mod.rs:971 #: data/resources/ui/dialogs/process_dialog.ui:186 #: data/resources/ui/dialogs/settings_dialog.ui:210 msgid "Process ID" msgstr "ID du processus" #: src/ui/pages/processes/mod.rs:1024 #: data/resources/ui/dialogs/process_dialog.ui:213 #: data/resources/ui/dialogs/settings_dialog.ui:215 msgid "User" msgstr "Utilisateur" #: src/ui/pages/processes/mod.rs:1699 #: data/resources/ui/dialogs/process_dialog.ui:154 #: data/resources/ui/dialogs/settings_dialog.ui:270 msgid "Total CPU Time" msgstr "Temps CPU total" #: src/ui/pages/processes/mod.rs:1758 #: data/resources/ui/dialogs/process_dialog.ui:163 #: data/resources/ui/dialogs/settings_dialog.ui:275 msgid "User CPU Time" msgstr "Temps CPU utilisateur" #: src/ui/pages/processes/mod.rs:1817 #: data/resources/ui/dialogs/process_dialog.ui:172 #: data/resources/ui/dialogs/settings_dialog.ui:280 msgid "System CPU Time" msgstr "Temps CPU système" #: src/ui/pages/processes/mod.rs:1876 #: data/resources/ui/dialogs/process_options_dialog.ui:87 #: data/resources/ui/dialogs/settings_dialog.ui:285 msgid "Priority" msgstr "Priorité" #: src/ui/pages/processes/mod.rs:2070 msgid "End process?" msgid_plural "End {} processes?" msgstr[0] "Arrêter le processus?" msgstr[1] "Arrêter les processus?" #: src/ui/pages/processes/mod.rs:2076 msgid "Halt process?" msgid_plural "Halt {} processes?" msgstr[0] "Mettre le processus en pause?" msgstr[1] "Mettre les processus en pause?" #: src/ui/pages/processes/mod.rs:2082 src/ui/pages/processes/mod.rs:2088 msgid "Kill process?" msgid_plural "Kill {} processes?" msgstr[0] "Tuer le processus?" msgstr[1] "Tuer les processus?" #: src/ui/pages/processes/mod.rs:2100 msgid "" "Halting a process can come with serious risks such as losing data and " "security implications. Use with caution." msgstr "" "La mise en pause d'un processus comporte des risques tels que la perte de " "données ainsi que des problèmes de sécurité. Soyez prudent." #: src/ui/pages/processes/mod.rs:2103 msgid "" "Killing a process can come with serious risks such as losing data and " "security implications. Use with caution." msgstr "" "Tuer un processus comporte des risques tels que la perte de données ainsi " "que des problèmes de sécurité. Soyez prudent." #: src/ui/pages/processes/mod.rs:2112 data/resources/ui/pages/processes.ui:10 #: data/resources/ui/pages/processes.ui:46 msgid "Halt Process" msgstr "Mettre le processus en pause" #: src/ui/pages/processes/mod.rs:2113 data/resources/ui/pages/processes.ui:6 #: data/resources/ui/pages/processes.ui:42 msgid "Kill Process" msgstr "Tuer le processus" #: src/ui/pages/processes/mod.rs:2114 data/resources/ui/pages/processes.ui:14 #: data/resources/ui/pages/processes.ui:50 msgid "Continue Process" msgstr "Continuer le processus" #: src/ui/window.rs:452 msgid "GPU {}" msgstr "GPU {}" #: src/ui/window.rs:482 msgid "NPU {}" msgstr "NPU {}" #: src/ui/window.rs:1158 msgid "Successfully adjusted {}" msgstr "Ajusté avec succès {}" #: src/ui/window.rs:1159 msgid "There was a problem adjusting {}" msgstr "Il y a eu un problème d'ajustement {}" #: src/ui/window.rs:1241 msgid "Successfully ended {}" msgstr "Arrêté avec succès {}" #: src/ui/window.rs:1242 msgid "Successfully halted {}" msgstr "Mis en pause avec succès {}" #: src/ui/window.rs:1243 msgid "Successfully killed {}" msgstr "Tué avec succès {}" #: src/ui/window.rs:1244 msgid "Successfully continued {}" msgstr "Continué avec succès {}" #: src/ui/window.rs:1251 msgid "Successfully ended the process" msgid_plural "Successfully ended {} processes" msgstr[0] "Processus arrêté avec succès {}" msgstr[1] "Processus arrêtés avec succès {}" #: src/ui/window.rs:1257 msgid "Successfully halted the process" msgid_plural "Successfully halted {} processes" msgstr[0] "Le processus a été mis en pause avec succès {}" msgstr[1] "Les processus ont été mis en pause avec succès {}" #: src/ui/window.rs:1263 msgid "Successfully killed the process" msgid_plural "Successfully killed {} processes" msgstr[0] "Processus tué avec succès {}" msgstr[1] "Processus tués avec succès {}" #: src/ui/window.rs:1269 msgid "Successfully continued the process" msgid_plural "Successfully continued {} processes" msgstr[0] "Processus continué avec succès {}" msgstr[1] "Processus continués avec succès {}" #: src/ui/window.rs:1280 msgid "There was a problem ending a process" msgid_plural "There were problems ending {} processes" msgstr[0] "Il y a eu un problème pour arrêter un processus" msgstr[1] "Il y a eu des problèmes pour terminer {} processus" #: src/ui/window.rs:1286 msgid "There was a problem halting a process" msgid_plural "There were problems halting {} processes" msgstr[0] "Il y a eu un problème pour la mise en pause d'un processus" msgstr[1] "Il y a eu des problèmes pour la mise en pause {} processus" #: src/ui/window.rs:1292 msgid "There was a problem killing a process" msgid_plural "There were problems killing {} processes" msgstr[0] "Il y a eu un problème pour tuer un processus" msgstr[1] "Il y a eu des problèmes pour tuer {} processus" #: src/ui/window.rs:1298 msgid "There was a problem continuing a process" msgid_plural "There were problems continuing {} processes" msgstr[0] "Il y a eu un problème pour continuer un processus" msgstr[1] "Il y a eu des problèmes pour continuer {} processus" #: src/ui/window.rs:1308 msgid "There was a problem ending {}" msgstr "Il y a eu un problème pour arrêter {}" #: src/ui/window.rs:1309 msgid "There was a problem halting {}" msgstr "Il y a eu un problème pour la mise en pause de {}" #: src/ui/window.rs:1310 msgid "There was a problem killing {}" msgstr "Il y a eu un problème pour tuer {}" #: src/ui/window.rs:1311 msgid "There was a problem continuing {}" msgstr "Il y a eu un problème pour continuer {}" #: src/utils/app.rs:222 msgid "System Processes" msgstr "Processus du système" #: src/utils/battery.rs:90 msgid "Charging" msgstr "En cours de chargement" #: src/utils/battery.rs:91 msgid "Discharging" msgstr "En cours de déchargement" #: src/utils/battery.rs:92 msgid "Empty" msgstr "Vide" #: src/utils/battery.rs:93 msgid "Full" msgstr "Plein" #: src/utils/battery.rs:94 msgid "Unknown" msgstr "Inconnu" #: src/utils/battery.rs:140 msgid "Nickel-Metal Hydride" msgstr "Nickel-Hydrure Métallique" #: src/utils/battery.rs:141 msgid "Nickel-Cadmium" msgstr "Nickel-Cadmium" #: src/utils/battery.rs:142 msgid "Nickel-Zinc" msgstr "Nickel-Zinc" #: src/utils/battery.rs:143 msgid "Lead-Acid" msgstr "Batterie au plomb" #: src/utils/battery.rs:144 msgid "Lithium-Ion" msgstr "Lithium-Ion" #: src/utils/battery.rs:145 msgid "Lithium Iron Phosphate" msgstr "Lithium Fer Phosphate" #: src/utils/battery.rs:146 msgid "Lithium Polymer" msgstr "Lithium Polymère" #: src/utils/battery.rs:148 msgid "Rechargeable Alkaline Managanese" msgstr "Batterie rechargeable Alkaline" #: src/utils/battery.rs:259 msgid "{} Battery" msgstr "{} Batterie" #: src/utils/battery.rs:261 msgid "Battery" msgstr "Batterie" #: src/utils/drive.rs:128 src/utils/drive.rs:207 msgid "CD/DVD/Blu-ray Drive" msgstr "Disque CD/DVD/Blu-ray" #: src/utils/drive.rs:129 msgid "eMMC Storage" msgstr "Stockage eMMC" #: src/utils/drive.rs:130 msgid "Flash Storage" msgstr "Stockage flash" #: src/utils/drive.rs:131 src/utils/drive.rs:208 msgid "Floppy Drive" msgstr "Lecteur de disquettes" #: src/utils/drive.rs:132 msgid "Hard Disk Drive" msgstr "Disque dur HDD" #: src/utils/drive.rs:133 msgid "Loop Device" msgstr "Périphérique de boucle" #: src/utils/drive.rs:134 msgid "Mapped Device" msgstr "Périphériques mappés" #: src/utils/drive.rs:135 msgid "NVMe Drive" msgstr "Disque NVMe" #: src/utils/drive.rs:137 msgid "Software Raid" msgstr "Raid logiciel" #: src/utils/drive.rs:138 msgid "RAM Disk" msgstr "Disque RAM" #: src/utils/drive.rs:139 msgid "Solid State Drive" msgstr "SSD" #: src/utils/drive.rs:140 msgid "ZFS Volume" msgstr "Volume ZFS" #: src/utils/drive.rs:141 msgid "Compressed RAM Disk (zram)" msgstr "Disque RAM compressé (zram)" #: src/utils/drive.rs:209 msgid "{} Loop Device" msgstr "{} Périphérique de boucle" #: src/utils/drive.rs:210 msgid "{} Mapped Device" msgstr "{} Périphériques mappés" #: src/utils/drive.rs:211 msgid "{} RAID" msgstr "{} RAID" #: src/utils/drive.rs:212 msgid "{} RAM Disk" msgstr "{} Disque RAM" #: src/utils/drive.rs:213 msgid "{} zram Device" msgstr "{} Périphérique zram" #: src/utils/drive.rs:214 msgid "{} ZFS Volume" msgstr "{} Volume ZFS" #: src/utils/drive.rs:215 msgid "{} Drive" msgstr "Disque {}" #: src/utils/network.rs:124 msgid "Bluetooth Tether" msgstr "Partage Bluetooth" #: src/utils/network.rs:125 msgid "Network Bridge" msgstr "Pont réseau" #: src/utils/network.rs:126 msgid "Ethernet Connection" msgstr "Connexion Ethernet" #: src/utils/network.rs:127 msgid "Docker Bridge" msgstr "Pont Docker" #: src/utils/network.rs:128 msgid "InfiniBand Connection" msgstr "Connexion InfiniBand" #: src/utils/network.rs:129 msgid "Serial Line IP Connection" msgstr "Connextion Serial Line IP" #: src/utils/network.rs:130 msgid "Virtual Ethernet Device" msgstr "Périphérique Ethernet virtuel" #: src/utils/network.rs:131 msgid "VM Network Bridge" msgstr "Pont réseau de machines virtuelles" #: src/utils/network.rs:132 msgid "VPN Tunnel" msgstr "Tunnel VPN" #: src/utils/network.rs:133 msgid "VPN Tunnel (WireGuard)" msgstr "Tunnel VPN (WireGuard)" #: src/utils/network.rs:134 msgid "Wi-Fi Connection" msgstr "Connexion Wi-Fi" #: src/utils/network.rs:135 msgid "WWAN Connection" msgstr "Connexion WWAN" #: src/utils/units.rs:76 msgid "{} K" msgstr "{} K" #: src/utils/units.rs:78 msgid "{} °C" msgstr "{} °C" #: src/utils/units.rs:80 msgid "{} °F" msgstr "{} °F" #: src/utils/units.rs:98 src/utils/units.rs:112 src/utils/units.rs:132 #: src/utils/units.rs:146 msgid "{} B" msgstr "{} octets" #: src/utils/units.rs:99 src/utils/units.rs:113 msgid "{} kB" msgstr "{} ko" #: src/utils/units.rs:100 src/utils/units.rs:114 msgid "{} MB" msgstr "{} Mo" #: src/utils/units.rs:101 src/utils/units.rs:115 msgid "{} GB" msgstr "{} Go" #: src/utils/units.rs:102 src/utils/units.rs:116 msgid "{} TB" msgstr "{} To" #: src/utils/units.rs:103 src/utils/units.rs:117 msgid "{} PB" msgstr "{} Po" #: src/utils/units.rs:104 src/utils/units.rs:118 msgid "{} EB" msgstr "{} Eo" #: src/utils/units.rs:105 src/utils/units.rs:119 msgid "{} ZB" msgstr "{} Zo" #: src/utils/units.rs:106 src/utils/units.rs:120 msgid "{} YB" msgstr "{} Yo" #: src/utils/units.rs:107 src/utils/units.rs:121 msgid "{} RB" msgstr "{} Ro" #: src/utils/units.rs:108 src/utils/units.rs:122 msgid "{} QB" msgstr "{} Qo" #: src/utils/units.rs:133 src/utils/units.rs:147 msgid "{} KiB" msgstr "{} Kio" #: src/utils/units.rs:134 src/utils/units.rs:148 msgid "{} MiB" msgstr "{} Mio" #: src/utils/units.rs:135 src/utils/units.rs:149 msgid "{} GiB" msgstr "{} Gio" #: src/utils/units.rs:136 src/utils/units.rs:150 msgid "{} TiB" msgstr "{} Tio" #: src/utils/units.rs:137 src/utils/units.rs:151 msgid "{} PiB" msgstr "{} Pio" #: src/utils/units.rs:138 src/utils/units.rs:152 msgid "{} EiB" msgstr "{} Eio" #: src/utils/units.rs:139 src/utils/units.rs:153 msgid "{} ZiB" msgstr "{} Zio" #: src/utils/units.rs:140 src/utils/units.rs:154 msgid "{} YiB" msgstr "{} Yio" #: src/utils/units.rs:141 src/utils/units.rs:155 msgid "{} RiB" msgstr "{} Rio" #: src/utils/units.rs:142 src/utils/units.rs:156 msgid "{} QiB" msgstr "{} Qio" #: src/utils/units.rs:183 src/utils/units.rs:200 msgid "{} B/s" msgstr "{} octets/s" #: src/utils/units.rs:184 msgid "{} kB/s" msgstr "{} ko/s" #: src/utils/units.rs:185 msgid "{} MB/s" msgstr "{} Mo/s" #: src/utils/units.rs:186 msgid "{} GB/s" msgstr "{} Go/s" #: src/utils/units.rs:187 msgid "{} TB/s" msgstr "{} To/s" #: src/utils/units.rs:188 msgid "{} PB/s" msgstr "{} Po/s" #: src/utils/units.rs:189 msgid "{} EB/s" msgstr "{} Eo/s" #: src/utils/units.rs:190 msgid "{} ZB/s" msgstr "{} Zo/s" #: src/utils/units.rs:191 msgid "{} YB/s" msgstr "{} Yo/s" #: src/utils/units.rs:192 msgid "{} RB/s" msgstr "{} Ro/s" #: src/utils/units.rs:193 msgid "{} QB/s" msgstr "{} Qo/s" #: src/utils/units.rs:201 msgid "{} KiB/s" msgstr "{} Kio/s" #: src/utils/units.rs:202 msgid "{} MiB/s" msgstr "{} Mio/s" #: src/utils/units.rs:203 msgid "{} GiB/s" msgstr "{} Gio/s" #: src/utils/units.rs:204 msgid "{} TiB/s" msgstr "{} Tio/s" #: src/utils/units.rs:205 msgid "{} PiB/s" msgstr "{} Pio/s" #: src/utils/units.rs:206 msgid "{} EiB/s" msgstr "{} Eio/s" #: src/utils/units.rs:207 msgid "{} ZiB/s" msgstr "{} Zio/s" #: src/utils/units.rs:208 msgid "{} YiB/s" msgstr "{} Yio/s" #: src/utils/units.rs:209 msgid "{} RiB/s" msgstr "{} Rio/s" #: src/utils/units.rs:210 msgid "{} QiB/s" msgstr "{} Qio/s" #: src/utils/units.rs:224 src/utils/units.rs:241 msgid "{} b/s" msgstr "{} b/s" #: src/utils/units.rs:225 msgid "{} kb/s" msgstr "{} kb/s" #: src/utils/units.rs:226 msgid "{} Mb/s" msgstr "{} Mb/s" #: src/utils/units.rs:227 msgid "{} Gb/s" msgstr "{} Gb/s" #: src/utils/units.rs:228 msgid "{} Tb/s" msgstr "{} Tb/s" #: src/utils/units.rs:229 msgid "{} Pb/s" msgstr "{} Pb/s" #: src/utils/units.rs:230 msgid "{} Eb/s" msgstr "{} Eb/s" #: src/utils/units.rs:231 msgid "{} Zb/s" msgstr "{} Zb/s" #: src/utils/units.rs:232 msgid "{} Yb/s" msgstr "{} Yb/s" #: src/utils/units.rs:233 msgid "{} Rb/s" msgstr "{} Rb/s" #: src/utils/units.rs:234 msgid "{} Qb/s" msgstr "{} Qb/s" #: src/utils/units.rs:242 msgid "{} Kib/s" msgstr "{} Kib/s" #: src/utils/units.rs:243 msgid "{} Mib/s" msgstr "{} Mib/s" #: src/utils/units.rs:244 msgid "{} Gib/s" msgstr "{} Gib/s" #: src/utils/units.rs:245 msgid "{} Tib/s" msgstr "{} Tib/s" #: src/utils/units.rs:246 msgid "{} Pib/s" msgstr "{} Pib/s" #: src/utils/units.rs:247 msgid "{} Eib/s" msgstr "{} Eib/s" #: src/utils/units.rs:248 msgid "{} Zib/s" msgstr "{} Zib/s" #: src/utils/units.rs:249 msgid "{} Yib/s" msgstr "{} Yib/s" #: src/utils/units.rs:250 msgid "{} Rib/s" msgstr "{} Rib/s" #: src/utils/units.rs:251 msgid "{} Qib/s" msgstr "{} Qib/s" #: src/utils/units.rs:258 msgid "{} Hz" msgstr "{} Hz" #: src/utils/units.rs:259 msgid "{} kHz" msgstr "{} kHz" #: src/utils/units.rs:260 msgid "{} MHz" msgstr "{} MHz" #: src/utils/units.rs:261 msgid "{} GHz" msgstr "{} GHz" #: src/utils/units.rs:262 msgid "{} THz" msgstr "{} THz" #: src/utils/units.rs:263 msgid "{} PHz" msgstr "{} PHz" #: src/utils/units.rs:264 msgid "{} EHz" msgstr "{} EHz" #: src/utils/units.rs:265 msgid "{} ZHz" msgstr "{} ZHz" #: src/utils/units.rs:266 msgid "{} YHz" msgstr "{} YHz" #: src/utils/units.rs:267 msgid "{} RHz" msgstr "{} RHz" #: src/utils/units.rs:268 msgid "{} QHz" msgstr "{} QHz" #: src/utils/units.rs:275 msgid "{} W" msgstr "{} W" #: src/utils/units.rs:276 msgid "{} kW" msgstr "{} kW" #: src/utils/units.rs:277 msgid "{} MW" msgstr "{} MW" #: src/utils/units.rs:278 msgid "{} GW" msgstr "{} GW" #: src/utils/units.rs:279 msgid "{} TW" msgstr "{} TW" #: src/utils/units.rs:280 msgid "{} PW" msgstr "{} PW" #: src/utils/units.rs:281 msgid "{} EW" msgstr "{} EW" #: src/utils/units.rs:282 msgid "{} ZW" msgstr "{} ZW" #: src/utils/units.rs:283 msgid "{} YW" msgstr "{} YW" #: src/utils/units.rs:284 msgid "{} RW" msgstr "{} RW" #: src/utils/units.rs:285 msgid "{} QW" msgstr "{} QW" #: src/utils/units.rs:294 src/utils/units.rs:308 msgid "{} Wh" msgstr "{} Wh" #: src/utils/units.rs:295 src/utils/units.rs:309 msgid "{} kWh" msgstr "{} kWh" #: src/utils/units.rs:296 src/utils/units.rs:310 msgid "{} MWh" msgstr "{} MWh" #: src/utils/units.rs:297 src/utils/units.rs:311 msgid "{} GWh" msgstr "{} GWh" #: src/utils/units.rs:298 src/utils/units.rs:312 msgid "{} TWh" msgstr "{} TWh" #: src/utils/units.rs:299 src/utils/units.rs:313 msgid "{} PWh" msgstr "{} PWh" #: src/utils/units.rs:300 src/utils/units.rs:314 msgid "{} EWh" msgstr "{} EWh" #: src/utils/units.rs:301 src/utils/units.rs:315 msgid "{} ZWh" msgstr "{} ZWh" #: src/utils/units.rs:302 src/utils/units.rs:316 msgid "{} YWh" msgstr "{} YWh" #: src/utils/units.rs:303 src/utils/units.rs:317 msgid "{} RWh" msgstr "{} RWh" #: src/utils/units.rs:304 src/utils/units.rs:318 msgid "{} QWh" msgstr "{} QWh" #: data/resources/ui/shortcuts.ui:11 msgctxt "shortcut window" msgid "General" msgstr "Général" #: data/resources/ui/shortcuts.ui:14 msgctxt "shortcut window" msgid "Preferences" msgstr "Préférences" #: data/resources/ui/shortcuts.ui:20 msgctxt "shortcut window" msgid "Show Shortcuts" msgstr "Afficher les raccourcis" #: data/resources/ui/shortcuts.ui:26 msgctxt "shortcut window" msgid "Quit" msgstr "Quitter" #: data/resources/ui/shortcuts.ui:32 msgctxt "shortcut window" msgid "Toggle Search Field" msgstr "Afficher/masquer le champ de recherche" #: data/resources/ui/shortcuts.ui:38 msgctxt "shortcut window" msgid "End App/Process" msgstr "Arrêter application/processus" #: data/resources/ui/shortcuts.ui:44 msgctxt "shortcut window" msgid "Kill App/Process" msgstr "Tuer application/processus" #: data/resources/ui/shortcuts.ui:50 msgctxt "shortcut window" msgid "Halt App/Process" msgstr "Mettre en pause application/processus" #: data/resources/ui/shortcuts.ui:56 msgctxt "shortcut window" msgid "Continue App/Process" msgstr "Continuer application/processus" #: data/resources/ui/shortcuts.ui:62 msgctxt "shortcut window" msgid "Show Information for App/Process" msgstr "Information sur application/processus" #: data/resources/ui/shortcuts.ui:68 msgctxt "shortcut window" msgid "Show Process Options" msgstr "Montrer les options du processus" #: data/resources/ui/window.ui:6 msgid "Preferences" msgstr "Préférences" #: data/resources/ui/window.ui:10 msgid "Keyboard Shortcuts" msgstr "Raccourcis clavier" #: data/resources/ui/window.ui:14 msgid "About Resources" msgstr "À propos de Ressources" #: data/resources/ui/window.ui:88 data/resources/ui/window.ui:128 msgid "Search" msgstr "Rechercher" #: data/resources/ui/window.ui:90 data/resources/ui/window.ui:130 msgid "Toggle search field" msgstr "Afficher/masquer le champ de recherche" #: data/resources/ui/dialogs/app_dialog.ui:7 msgid "App Information" msgstr "Informations sur l'application" #: data/resources/ui/dialogs/app_dialog.ui:70 #: data/resources/ui/dialogs/process_dialog.ui:48 #: data/resources/ui/pages/battery.ui:22 data/resources/ui/pages/cpu.ui:37 #: data/resources/ui/pages/cpu.ui:50 data/resources/ui/pages/drive.ui:22 #: data/resources/ui/pages/gpu.ui:22 data/resources/ui/pages/memory.ui:31 #: data/resources/ui/pages/network.ui:22 data/resources/ui/pages/npu.ui:22 msgid "Usage" msgstr "Utilisation" #: data/resources/ui/dialogs/app_dialog.ui:174 #: data/resources/ui/dialogs/process_dialog.ui:179 #: data/resources/ui/pages/battery.ui:33 data/resources/ui/pages/cpu.ui:83 #: data/resources/ui/pages/drive.ui:54 data/resources/ui/pages/gpu.ui:74 #: data/resources/ui/pages/memory.ui:42 data/resources/ui/pages/network.ui:51 #: data/resources/ui/pages/npu.ui:68 msgid "Properties" msgstr "Propriétés" #: data/resources/ui/dialogs/app_dialog.ui:180 msgid "ID" msgstr "ID" #: data/resources/ui/dialogs/app_dialog.ui:190 #: data/resources/ui/dialogs/process_dialog.ui:195 msgid "Running Since" msgstr "En cours depuis" #: data/resources/ui/dialogs/app_dialog.ui:198 msgid "Running Processes" msgstr "Processus en cours" #: data/resources/ui/dialogs/app_dialog.ui:207 #: data/resources/ui/dialogs/process_dialog.ui:231 msgid "Containerized" msgstr "Conteneurisé" #: data/resources/ui/dialogs/process_dialog.ui:7 msgid "Process Information" msgstr "Informations sur le processus" #: data/resources/ui/dialogs/process_dialog.ui:204 msgid "Commandline" msgstr "Ligne de commande" #: data/resources/ui/dialogs/process_dialog.ui:222 msgid "Control Group" msgstr "Groupe de contrôle" #: data/resources/ui/dialogs/process_options_dialog.ui:7 #: data/resources/ui/dialogs/process_options_dialog.ui:69 msgid "Process Options" msgstr "Options du processus" #: data/resources/ui/dialogs/process_options_dialog.ui:29 msgid "Apply" msgstr "Appliquer" #: data/resources/ui/dialogs/process_options_dialog.ui:72 msgid "Niceness" msgstr "Priorité (niceness)" #: data/resources/ui/dialogs/process_options_dialog.ui:73 msgid "" "The priority of a process is given by its niceness. A lower niceness value " "correspond to a higher priority." msgstr "" "La priorité d'un processus est définie par sa gentillesse (niceness). Une " "gentillesse plus basse correspond à une priorité plus élevée." #: data/resources/ui/dialogs/process_options_dialog.ui:91 msgctxt "process priority" msgid "Very High" msgstr "Très élevée" #: data/resources/ui/dialogs/process_options_dialog.ui:92 msgctxt "process priority" msgid "High" msgstr "Élevée" #: data/resources/ui/dialogs/process_options_dialog.ui:93 msgctxt "process priority" msgid "Normal" msgstr "Normale" #: data/resources/ui/dialogs/process_options_dialog.ui:94 msgctxt "process priority" msgid "Low" msgstr "Basse" #: data/resources/ui/dialogs/process_options_dialog.ui:95 msgctxt "process priority" msgid "Very Low" msgstr "Très basse" #: data/resources/ui/dialogs/process_options_dialog.ui:103 msgid "Processor Affinity" msgstr "Affinité du processeur" #: data/resources/ui/dialogs/process_options_dialog.ui:108 msgid "Toggle All" msgstr "Tout cocher" #: data/resources/ui/dialogs/process_options_dialog.ui:111 msgid "Select which processor cores the process is allowed to run on" msgstr "" "Sélectionner les cœurs du processeur sur lesquels le processus est autorisé " "à s'exécuter" #: data/resources/ui/dialogs/settings_dialog.ui:7 msgid "General" msgstr "Général" #: data/resources/ui/dialogs/settings_dialog.ui:10 msgid "Units" msgstr "Unités" #: data/resources/ui/dialogs/settings_dialog.ui:13 msgid "Data Unit Prefix" msgstr "Préfixe de l'unité de données" #: data/resources/ui/dialogs/settings_dialog.ui:17 msgid "Decimal" msgstr "Décimale" #: data/resources/ui/dialogs/settings_dialog.ui:18 msgid "Binary" msgstr "Binaire" #: data/resources/ui/dialogs/settings_dialog.ui:26 msgid "Show Network Speeds in Bits per Second" msgstr "Afficher la vitesse du réseau en bits par seconde" #: data/resources/ui/dialogs/settings_dialog.ui:31 msgid "Temperature Unit" msgstr "Unité de mesure de la température" #: data/resources/ui/dialogs/settings_dialog.ui:35 msgid "Celsius" msgstr "Celsius" #: data/resources/ui/dialogs/settings_dialog.ui:36 msgid "Kelvin" msgstr "Kelvin" #: data/resources/ui/dialogs/settings_dialog.ui:37 msgid "Fahrenheit" msgstr "Fahrenheit" #: data/resources/ui/dialogs/settings_dialog.ui:47 msgid "User Interface" msgstr "Interface utilisateur" #: data/resources/ui/dialogs/settings_dialog.ui:50 msgid "Refresh Speed" msgstr "Vitesse de rafraîchissement" #: data/resources/ui/dialogs/settings_dialog.ui:51 msgid "Higher refresh speeds can lead to higher processor usage" msgstr "" "Des taux de rafraîchissement plus élevés peuvent amener à une utilisation " "plus élevée du processeur" #: data/resources/ui/dialogs/settings_dialog.ui:55 msgctxt "UI refresh speed" msgid "Very Slow" msgstr "Très lente" #: data/resources/ui/dialogs/settings_dialog.ui:56 msgctxt "UI refresh speed" msgid "Slow" msgstr "Lente" #: data/resources/ui/dialogs/settings_dialog.ui:57 msgctxt "UI refresh speed" msgid "Normal" msgstr "Normale" #: data/resources/ui/dialogs/settings_dialog.ui:58 msgctxt "UI refresh speed" msgid "Fast" msgstr "Rapide" #: data/resources/ui/dialogs/settings_dialog.ui:59 msgctxt "UI refresh speed" msgid "Very Fast" msgstr "Très rapide" #: data/resources/ui/dialogs/settings_dialog.ui:67 msgid "Show Graph Grids" msgstr "Afficher les grilles du graphique" #: data/resources/ui/dialogs/settings_dialog.ui:72 msgid "Graph Data Points" msgstr "Points de données du graphique" #: data/resources/ui/dialogs/settings_dialog.ui:86 msgid "Show Usage Details in Sidebar" msgstr "Afficher les détails d'utilisation dans la barre latérale" #: data/resources/ui/dialogs/settings_dialog.ui:87 msgid "If enabled, the usage along with other information will be displayed" msgstr "Si activé, l'utilisation sera affichée ainsi que d'autres informations" #: data/resources/ui/dialogs/settings_dialog.ui:92 msgid "Show Device Descriptions in Sidebar" msgstr "Montrer la description du périphérique dans la barre latérale" #: data/resources/ui/dialogs/settings_dialog.ui:93 msgid "" "If enabled, a device identifier like its name or device type will be " "displayed" msgstr "" "Si activé, un identifiant de périphérique sera affiché, tel que son nom ou " "son type de périphérique" #: data/resources/ui/dialogs/settings_dialog.ui:98 msgid "Sidebar Meter Type" msgstr "Type de mesure de la barre latérale" #: data/resources/ui/dialogs/settings_dialog.ui:102 msgid "Bar" msgstr "Bar" #: data/resources/ui/dialogs/settings_dialog.ui:103 msgid "Graph" msgstr "Graphique" #: data/resources/ui/dialogs/settings_dialog.ui:111 msgid "Normalize Processor Usage" msgstr "Normaliser l'utilisation du processeur" #: data/resources/ui/dialogs/settings_dialog.ui:112 msgid "" "If enabled, the total usage of all cores will be divided by the amount of " "cores" msgstr "" "Si activé, l'utilisation totale de tous les cœurs sera divisée par le nombre " "de cœurs" #: data/resources/ui/dialogs/settings_dialog.ui:125 #: data/resources/ui/dialogs/settings_dialog.ui:207 msgid "Information Columns" msgstr "Colonnes d'informations" #: data/resources/ui/dialogs/settings_dialog.ui:196 #: data/resources/ui/pages/cpu.ui:22 data/resources/ui/pages/processes.ui:56 msgid "Options" msgstr "Options" #: data/resources/ui/dialogs/settings_dialog.ui:199 msgid "Show Niceness Values" msgstr "Montrer les valeurs de gentillesse (niceness)" #: data/resources/ui/dialogs/settings_dialog.ui:200 msgid "" "Display priorities as niceness to allow for more fine-grained adjustments" msgstr "" "Afficher les priorités en tant que gentillesse (niceness) pour permettre des " "ajustements plus précis" #: data/resources/ui/dialogs/settings_dialog.ui:305 msgid "Devices" msgstr "Périphériques" #: data/resources/ui/dialogs/settings_dialog.ui:308 msgid "Drives" msgstr "Disques" #: data/resources/ui/dialogs/settings_dialog.ui:311 msgid "Show Virtual Drives" msgstr "Montrer les disques virtuels" #: data/resources/ui/dialogs/settings_dialog.ui:312 msgid "Virtual drives are for example ZFS volumes or mapped devices" msgstr "" "Les lecteurs virtuels sont, par exemple, des volumes ZFS ou des " "périphériques mappés" #: data/resources/ui/dialogs/settings_dialog.ui:322 msgid "Show Virtual Network Interfaces" msgstr "Afficher les interfaces de réseau virtuel" #: data/resources/ui/dialogs/settings_dialog.ui:323 msgid "Virtual network interfaces are for example bridges or VPN tunnels" msgstr "" "Les interfaces de réseau virtuel sont par exemple des ponts ou des tunnels " "VPN" #: data/resources/ui/pages/applications.ui:40 #: data/resources/ui/pages/processes.ui:62 msgid "Information" msgstr "Informations" #: data/resources/ui/pages/applications.ui:57 msgid "Search applications" msgstr "Rechercher dans les applications" #: data/resources/ui/pages/applications.ui:87 #: data/resources/ui/pages/applications.ui:89 msgid "Show App Information" msgstr "Montrer les informations sur l'application" #: data/resources/ui/pages/battery.ui:36 msgid "Battery Health" msgstr "Santé de la batterie" #: data/resources/ui/pages/battery.ui:45 msgid "Design Capacity" msgstr "Capacité projetée" #: data/resources/ui/pages/battery.ui:54 msgid "Charge Cycles" msgstr "Cycles de charge" #: data/resources/ui/pages/battery.ui:63 msgid "Technology" msgstr "Technologie" #: data/resources/ui/pages/battery.ui:72 data/resources/ui/pages/gpu.ui:81 #: data/resources/ui/pages/network.ui:58 data/resources/ui/pages/npu.ui:75 msgid "Manufacturer" msgstr "Fabricant" #: data/resources/ui/pages/battery.ui:81 msgid "Model Name" msgstr "Nom du modèle" #: data/resources/ui/pages/battery.ui:90 data/resources/ui/pages/drive.ui:66 msgid "Device" msgstr "Périphérique" #: data/resources/ui/pages/cpu.ui:26 msgid "Show Usages of Logical CPUs" msgstr "Afficher les utilisations des CPU logiques" #: data/resources/ui/pages/cpu.ui:75 data/resources/ui/pages/gpu.ui:66 #: data/resources/ui/pages/npu.ui:60 msgid "Sensors" msgstr "Capteurs" #: data/resources/ui/pages/cpu.ui:90 msgid "Max Frequency" msgstr "Fréquence maximale" #: data/resources/ui/pages/cpu.ui:99 msgid "Logical Cores" msgstr "Cœurs logiques" #: data/resources/ui/pages/cpu.ui:108 msgid "Physical Cores" msgstr "Cœurs physiques" #: data/resources/ui/pages/cpu.ui:117 msgid "Sockets" msgstr "Prises" #: data/resources/ui/pages/cpu.ui:126 msgid "Virtualization" msgstr "Virtualisation" #: data/resources/ui/pages/cpu.ui:135 msgid "Architecture" msgstr "Architecture" #: data/resources/ui/pages/drive.ui:38 msgid "Total Read" msgstr "Total lecture" #: data/resources/ui/pages/drive.ui:47 msgid "Total Written" msgstr "Total écriture" #: data/resources/ui/pages/drive.ui:57 data/resources/ui/pages/memory.ui:72 msgid "Type" msgstr "Type" #: data/resources/ui/pages/drive.ui:75 msgid "Capacity" msgstr "Capacité" #: data/resources/ui/pages/drive.ui:84 msgid "Writable" msgstr "Inscriptible" #: data/resources/ui/pages/drive.ui:93 msgid "Removable" msgstr "Amovible" #. Translators: "Link" refers to something like "PCIe 4.0 ×16" #: data/resources/ui/pages/drive.ui:102 data/resources/ui/pages/gpu.ui:113 #: data/resources/ui/pages/npu.ui:107 msgid "Link" msgstr "Liaison" #: data/resources/ui/pages/gpu.ui:37 msgid "GPU Frequency" msgstr "Fréquence du GPU" #: data/resources/ui/pages/gpu.ui:50 msgid "Video Memory Frequency" msgstr "Fréquence de la mémoire vidéo" #: data/resources/ui/pages/gpu.ui:90 data/resources/ui/pages/npu.ui:84 msgid "PCI Slot" msgstr "Slot PCI" #: data/resources/ui/pages/gpu.ui:99 data/resources/ui/pages/network.ui:67 #: data/resources/ui/pages/npu.ui:93 msgid "Driver Used" msgstr "Pilote utilisé" #: data/resources/ui/pages/gpu.ui:108 data/resources/ui/pages/npu.ui:102 msgid "Max Power Cap" msgstr "Limitation maximale de la puissance" #: data/resources/ui/pages/memory.ui:9 msgid "You need to authenticate to see memory properties" msgstr "Vous devez vous authentifier pour voir les propriétés de la mémoire" #: data/resources/ui/pages/memory.ui:10 msgid "Authenticate" msgstr "Authentifier" #: data/resources/ui/pages/memory.ui:45 msgid "Slots Used" msgstr "Ports utilisés" #: data/resources/ui/pages/memory.ui:54 msgid "Speed" msgstr "Vitesse" #: data/resources/ui/pages/memory.ui:63 msgid "Form Factor" msgstr "Facteur de forme" #: data/resources/ui/pages/memory.ui:81 msgid "Type Detail" msgstr "Détail du type" #: data/resources/ui/pages/network.ui:35 msgid "Total Received" msgstr "Total reçu" #: data/resources/ui/pages/network.ui:44 msgid "Total Sent" msgstr "Total envoyé" #: data/resources/ui/pages/network.ui:76 msgid "Interface" msgstr "Interface" #: data/resources/ui/pages/network.ui:85 msgid "Hardware Address" msgstr "Adresse physique" #: data/resources/ui/pages/network.ui:94 msgid "Link Speed" msgstr "Vitesse de connexion" #: data/resources/ui/pages/npu.ui:31 msgid "NPU Frequency" msgstr "Fréquence du NPU" #: data/resources/ui/pages/npu.ui:44 msgid "Memory Frequency" msgstr "Fréquence de la mémoire" #: data/resources/ui/pages/processes.ui:22 #: data/resources/ui/pages/processes.ui:74 msgid "Kill Processes" msgstr "Tuer les processus" #: data/resources/ui/pages/processes.ui:26 #: data/resources/ui/pages/processes.ui:78 msgid "Halt Processes" msgstr "Mettre les processus en pause" #: data/resources/ui/pages/processes.ui:30 #: data/resources/ui/pages/processes.ui:82 msgid "Continue Processes" msgstr "Continuer les processus" #: data/resources/ui/pages/processes.ui:103 msgid "Search processes" msgstr "Rechercher des processus" #: data/resources/ui/pages/processes.ui:133 #: data/resources/ui/pages/processes.ui:135 msgid "Show Process Options" msgstr "Montrer les options du processus" #: data/resources/ui/pages/processes.ui:146 #: data/resources/ui/pages/processes.ui:148 msgid "Show Process Information" msgstr "Montrer les Informations sur le processus" #~ msgid "Show Search Fields on Launch" #~ msgstr "Montrer le champ de recherche au démarrage" #~ msgid "VRAM: {}" #~ msgstr "VRAM: {}" #~ msgid "Monitor your system resources and processes" #~ msgstr "Surveillez les ressources et les processus de votre système" #~ msgid "Window width" #~ msgstr "Largeur de la fenêtre" #~ msgid "Window height" #~ msgstr "Hauteur de la fenêtre" #~ msgid "Window maximized state" #~ msgstr "Maximisation de la fenêtre" #~ msgid "Temperature unit" #~ msgstr "Unité de mesure de la température" #~ msgid "Unit Prefix Base" #~ msgstr "Base pour les unités" #~ msgid "Applications" #~ msgstr "Applications" #~ msgid "Application" #~ msgstr "Application" #~ msgid "GPU Usage" #~ msgstr "Utilisation du GPU" #~ msgid "root" #~ msgstr "root" #~ msgid "End application" #~ msgstr "Terminer l'application" #~ msgid "Kill application" #~ msgstr "Tuer l'application" #~ msgid "Continue application" #~ msgstr "Continuer l'application" #~ msgid "Current Power Cap" #~ msgstr "Limitation actuelle de la puissance" resources-1.9.1/po/he.po000066400000000000000000001511501510634446000151140ustar00rootroot00000000000000# Hebrew translation for resources. # Copyright (C) 2025 resources's COPYRIGHT HOLDER # This file is distributed under the same license as the resources package. # SPDX-FileCopyrightText: 2025 Yaron Shahrabani # msgid "" msgstr "" "Project-Id-Version: resources main\n" "Report-Msgid-Bugs-To: https://github.com/nokyan/resources/issues/\n" "POT-Creation-Date: 2025-11-05 03:35+0000\n" "PO-Revision-Date: 2025-11-05 08:49+0200\n" "Last-Translator: Yaron Shahrabani \n" "Language-Team: צוות התרגום של KDE ישראל\n" "Language: he\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n==1 ? 0 : n==2 ? 1 : n>10 && n%10==0 ? 2 : " "3);\n" "X-Generator: Poedit 3.7\n" #: data/net.nokyan.Resources.desktop.in.in:2 #: data/net.nokyan.Resources.metainfo.xml.in.in:4 data/resources/ui/window.ui:22 #: src/application.rs:272 msgid "Resources" msgstr "משאבים" #. Translators: The summary should be 35 characters or less according to Flathub appstream guidelines #: data/net.nokyan.Resources.desktop.in.in:3 #: data/net.nokyan.Resources.metainfo.xml.in.in:5 msgid "Keep an eye on system resources" msgstr "להשגיח על משאבי המערכת" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/net.nokyan.Resources.desktop.in.in:9 msgid "System;Resources;Monitor;Processes;Usage;Task;Manager;CPU;RAM;Memory;GPU;" msgstr "" "מערכת;משאבים;צג;עוקב;מעקב;מוניטור;ניטור;שימוש;משימה;מנהל;מעבד;יע\"מ;יע״מ;מעבד " "גרפי;זיכרון;זכרון;ראם;משימות;" #: data/net.nokyan.Resources.metainfo.xml.in.in:17 msgid "" "Resources allows you to check the utilization of your system resources and " "control your running processes and apps. It’s designed to be user-friendly and " "feel right at home on a modern desktop by using GNOME’s libadwaita." msgstr "" "„משאבים” מאפשרת לך לבדוק את ניצולת משאבי המערכת שלך ולשלוט בתהליכים והיישומים " "הפעילים. הוא תוכנן להיות ידידותי למשתמשים ולהעניק תחושה ביתית בשולחן עבודה " "מודרני על ידי שימוש ב־libadwaita מבית GNOME." #: data/net.nokyan.Resources.metainfo.xml.in.in:20 msgid "Resources supports monitoring the following components:" msgstr "„משאבים” תומכת בהשגחה על הרכיבים הבאים:" #: data/net.nokyan.Resources.metainfo.xml.in.in:24 msgid "CPU" msgstr "מעבד" #: data/net.nokyan.Resources.metainfo.xml.in.in:25 #: data/resources/ui/dialogs/app_dialog.ui:82 #: data/resources/ui/dialogs/process_dialog.ui:64 #: data/resources/ui/dialogs/settings_dialog.ui:128 #: data/resources/ui/dialogs/settings_dialog.ui:220 #: data/resources/ui/window.ui:176 data/resources/ui/window.ui:183 #: src/ui/pages/applications/mod.rs:803 src/ui/pages/memory.rs:106 #: src/ui/pages/memory.rs:192 src/ui/pages/processes/mod.rs:1080 msgid "Memory" msgstr "זיכרון" #: data/net.nokyan.Resources.metainfo.xml.in.in:26 #: data/resources/ui/dialogs/app_dialog.ui:140 #: data/resources/ui/dialogs/process_dialog.ui:118 #: data/resources/ui/dialogs/settings_dialog.ui:158 #: data/resources/ui/dialogs/settings_dialog.ui:250 #: src/ui/pages/applications/mod.rs:1181 src/ui/pages/gpu.rs:119 #: src/ui/pages/processes/mod.rs:1470 src/ui/window.rs:468 msgid "GPU" msgstr "מעבד גרפי" #: data/net.nokyan.Resources.metainfo.xml.in.in:27 #: data/resources/ui/dialogs/settings_dialog.ui:324 msgid "Network Interfaces" msgstr "מנשקי רשת" #: data/net.nokyan.Resources.metainfo.xml.in.in:28 msgid "Storage Devices" msgstr "התקני אחסון" #: data/net.nokyan.Resources.metainfo.xml.in.in:29 msgid "Batteries" msgstr "סוללות" #: data/net.nokyan.Resources.metainfo.xml.in.in:51 msgid "Apps page in light theme" msgstr "עמוד יישומים בעיצוב בהיר" #: data/net.nokyan.Resources.metainfo.xml.in.in:55 msgid "Processes page in dark theme" msgstr "עמוד תהליכים בעיצוב כהה" #: data/net.nokyan.Resources.metainfo.xml.in.in:59 msgid "Processor page in light theme" msgstr "עמוד מעבד בעיצוב בהיר" #: data/net.nokyan.Resources.metainfo.xml.in.in:63 msgid "Memory page in dark theme" msgstr "עמוד זיכרון בעיצוב כהה" #: data/net.nokyan.Resources.metainfo.xml.in.in:67 msgid "GPU page in light theme" msgstr "עמוד מעבד גרפי בעיצוב בהיר" #: data/net.nokyan.Resources.metainfo.xml.in.in:71 msgid "Drive page in dark theme" msgstr "עמוד כוננים בעיצוב כהה" #: data/net.nokyan.Resources.metainfo.xml.in.in:75 msgid "Network Interface page in light theme" msgstr "עמוד מנשק רשת בעיצוב בהיר" #: data/net.nokyan.Resources.metainfo.xml.in.in:79 msgid "Battery page in dark theme" msgstr "עמוד סוללות בעיצוב כהה" #: data/net.nokyan.Resources.policy.in.in:9 msgid "Control Process" msgstr "תהליך בקרה" #: data/net.nokyan.Resources.policy.in.in:10 msgid "" "Authentication is required to control superuser’s or other users’ processes" msgstr "צריך לעבור אימות כדי לשלוט בתהליכים של משתמש על או משתמשים אחרים" #: data/resources/ui/dialogs/app_dialog.ui:7 msgid "App Information" msgstr "פרטי יישום" #: data/resources/ui/dialogs/app_dialog.ui:70 #: data/resources/ui/dialogs/process_dialog.ui:48 #: data/resources/ui/pages/battery.ui:22 data/resources/ui/pages/cpu.ui:37 #: data/resources/ui/pages/cpu.ui:50 data/resources/ui/pages/drive.ui:22 #: data/resources/ui/pages/gpu.ui:22 data/resources/ui/pages/memory.ui:31 #: data/resources/ui/pages/network.ui:22 data/resources/ui/pages/npu.ui:22 msgid "Usage" msgstr "ניצולת" #: data/resources/ui/dialogs/app_dialog.ui:73 #: data/resources/ui/dialogs/process_dialog.ui:55 #: data/resources/ui/dialogs/settings_dialog.ui:133 #: data/resources/ui/dialogs/settings_dialog.ui:225 #: data/resources/ui/window.ui:145 data/resources/ui/window.ui:152 #: src/ui/pages/applications/mod.rs:862 src/ui/pages/cpu.rs:128 #: src/ui/pages/processes/mod.rs:1139 src/ui/window.rs:290 msgid "Processor" msgstr "מעבד" #: data/resources/ui/dialogs/app_dialog.ui:91 #: data/resources/ui/dialogs/process_dialog.ui:73 #: data/resources/ui/dialogs/settings_dialog.ui:178 #: data/resources/ui/dialogs/settings_dialog.ui:290 #: src/ui/pages/applications/mod.rs:1420 src/ui/pages/memory.rs:198 #: src/ui/pages/processes/mod.rs:1955 msgid "Swap" msgstr "החלפה" #: data/resources/ui/dialogs/app_dialog.ui:100 #: data/resources/ui/dialogs/process_dialog.ui:78 #: data/resources/ui/dialogs/settings_dialog.ui:138 #: data/resources/ui/dialogs/settings_dialog.ui:230 #: src/ui/pages/applications/mod.rs:926 src/ui/pages/processes/mod.rs:1203 msgid "Drive Read" msgstr "קריאה מהכונן" #: data/resources/ui/dialogs/app_dialog.ui:109 #: data/resources/ui/dialogs/process_dialog.ui:87 #: data/resources/ui/dialogs/settings_dialog.ui:143 #: data/resources/ui/dialogs/settings_dialog.ui:235 #: src/ui/pages/applications/mod.rs:991 src/ui/pages/processes/mod.rs:1270 msgid "Drive Read Total" msgstr "קריאה כוללת מהכונן" #: data/resources/ui/dialogs/app_dialog.ui:118 #: data/resources/ui/dialogs/process_dialog.ui:96 #: data/resources/ui/dialogs/settings_dialog.ui:148 #: data/resources/ui/dialogs/settings_dialog.ui:240 #: src/ui/pages/applications/mod.rs:1052 src/ui/pages/processes/mod.rs:1337 msgid "Drive Write" msgstr "כתיבה לכונן" #: data/resources/ui/dialogs/app_dialog.ui:127 #: data/resources/ui/dialogs/process_dialog.ui:105 #: data/resources/ui/dialogs/settings_dialog.ui:153 #: data/resources/ui/dialogs/settings_dialog.ui:245 #: src/ui/pages/applications/mod.rs:1119 src/ui/pages/processes/mod.rs:1404 msgid "Drive Write Total" msgstr "כתיבה כוללת לכונן" #: data/resources/ui/dialogs/app_dialog.ui:149 #: data/resources/ui/dialogs/process_dialog.ui:127 #: data/resources/ui/dialogs/settings_dialog.ui:163 #: data/resources/ui/dialogs/settings_dialog.ui:255 #: src/ui/pages/applications/mod.rs:1361 src/ui/pages/processes/mod.rs:1651 msgid "Video Memory" msgstr "זיכרון וידאו" #: data/resources/ui/dialogs/app_dialog.ui:158 #: data/resources/ui/dialogs/process_dialog.ui:136 #: data/resources/ui/dialogs/settings_dialog.ui:168 #: data/resources/ui/dialogs/settings_dialog.ui:260 #: src/ui/pages/applications/mod.rs:1240 src/ui/pages/processes/mod.rs:1529 msgid "Video Encoder" msgstr "מקודד וידאו" #: data/resources/ui/dialogs/app_dialog.ui:167 #: data/resources/ui/dialogs/process_dialog.ui:145 #: data/resources/ui/dialogs/settings_dialog.ui:173 #: data/resources/ui/dialogs/settings_dialog.ui:265 #: src/ui/pages/applications/mod.rs:1301 src/ui/pages/processes/mod.rs:1590 msgid "Video Decoder" msgstr "מפענח וידאו" #: data/resources/ui/dialogs/app_dialog.ui:174 #: data/resources/ui/dialogs/process_dialog.ui:179 #: data/resources/ui/pages/battery.ui:33 data/resources/ui/pages/cpu.ui:83 #: data/resources/ui/pages/drive.ui:54 data/resources/ui/pages/gpu.ui:74 #: data/resources/ui/pages/memory.ui:42 data/resources/ui/pages/network.ui:51 #: data/resources/ui/pages/npu.ui:68 msgid "Properties" msgstr "מאפיינים" #: data/resources/ui/dialogs/app_dialog.ui:180 msgid "ID" msgstr "מזהה" #: data/resources/ui/dialogs/app_dialog.ui:190 #: data/resources/ui/dialogs/process_dialog.ui:195 msgid "Running Since" msgstr "פועל מאז" #: data/resources/ui/dialogs/app_dialog.ui:198 msgid "Running Processes" msgstr "תהליכים פעילים" #: data/resources/ui/dialogs/app_dialog.ui:207 #: data/resources/ui/dialogs/process_dialog.ui:231 msgid "Containerized" msgstr "ארוז במכולה" #: data/resources/ui/dialogs/process_dialog.ui:7 msgid "Process Information" msgstr "פרטי תהליך" #: data/resources/ui/dialogs/process_dialog.ui:154 #: data/resources/ui/dialogs/settings_dialog.ui:270 #: src/ui/pages/processes/mod.rs:1711 msgid "Total CPU Time" msgstr "זמן מעבד כולל" #: data/resources/ui/dialogs/process_dialog.ui:163 #: data/resources/ui/dialogs/settings_dialog.ui:275 #: src/ui/pages/processes/mod.rs:1770 msgid "User CPU Time" msgstr "זמן מעבד למשתמש" #: data/resources/ui/dialogs/process_dialog.ui:172 #: data/resources/ui/dialogs/settings_dialog.ui:280 #: src/ui/pages/processes/mod.rs:1829 msgid "System CPU Time" msgstr "זמן מעבד למערכת" #: data/resources/ui/dialogs/process_dialog.ui:186 #: data/resources/ui/dialogs/settings_dialog.ui:210 #: src/ui/pages/processes/mod.rs:973 msgid "Process ID" msgstr "מזהה תהליך" #: data/resources/ui/dialogs/process_dialog.ui:204 #: data/resources/ui/dialogs/settings_dialog.ui:300 #: src/ui/pages/processes/mod.rs:2075 msgid "Commandline" msgstr "שורת פקודות" #: data/resources/ui/dialogs/process_dialog.ui:213 #: data/resources/ui/dialogs/settings_dialog.ui:215 #: src/ui/pages/processes/mod.rs:1026 msgid "User" msgstr "משתמש" #: data/resources/ui/dialogs/process_dialog.ui:222 msgid "Control Group" msgstr "קבוצת בקרה" #: data/resources/ui/dialogs/process_options_dialog.ui:7 #: data/resources/ui/dialogs/process_options_dialog.ui:69 msgid "Process Options" msgstr "אפשרויות תהליך" #: data/resources/ui/dialogs/process_options_dialog.ui:29 msgid "Apply" msgstr "החלה" #: data/resources/ui/dialogs/process_options_dialog.ui:72 msgid "Niceness" msgstr "Niceness" #: data/resources/ui/dialogs/process_options_dialog.ui:73 msgid "" "The priority of a process is given by its niceness. A lower niceness value " "correspond to a higher priority." msgstr "" "עדיפות לתהליך מצוינת באמצעות ה־niceness שלו. ככל שהערך יותר נמוך ככה העדיפות " "יותר גבוהה." #: data/resources/ui/dialogs/process_options_dialog.ui:87 #: data/resources/ui/dialogs/settings_dialog.ui:285 #: src/ui/pages/processes/mod.rs:1888 msgid "Priority" msgstr "עדיפות" #: data/resources/ui/dialogs/process_options_dialog.ui:91 msgctxt "process priority" msgid "Very High" msgstr "גבוהה מאוד" #: data/resources/ui/dialogs/process_options_dialog.ui:92 msgctxt "process priority" msgid "High" msgstr "גבוהה" #: data/resources/ui/dialogs/process_options_dialog.ui:93 msgctxt "process priority" msgid "Normal" msgstr "רגילה" #: data/resources/ui/dialogs/process_options_dialog.ui:94 msgctxt "process priority" msgid "Low" msgstr "נמוכה" #: data/resources/ui/dialogs/process_options_dialog.ui:95 msgctxt "process priority" msgid "Very Low" msgstr "נמוכה מאוד" #: data/resources/ui/dialogs/process_options_dialog.ui:103 msgid "Processor Affinity" msgstr "קרבה למעבדים" #: data/resources/ui/dialogs/process_options_dialog.ui:108 msgid "Toggle All" msgstr "החלפת המצב של כולם" #: data/resources/ui/dialogs/process_options_dialog.ui:111 msgid "Select which processor cores the process is allowed to run on" msgstr "נא לבחור על אילו ליבות מעבד מורשה התהליך לרוץ" #: data/resources/ui/dialogs/settings_dialog.ui:7 msgid "General" msgstr "כללי" #: data/resources/ui/dialogs/settings_dialog.ui:10 msgid "Units" msgstr "יחידות" #: data/resources/ui/dialogs/settings_dialog.ui:13 msgid "Data Unit Prefix" msgstr "קידומת יחידת נתונים" #: data/resources/ui/dialogs/settings_dialog.ui:17 msgid "Decimal" msgstr "עשרונית" #: data/resources/ui/dialogs/settings_dialog.ui:18 msgid "Binary" msgstr "בינרית" #: data/resources/ui/dialogs/settings_dialog.ui:26 msgid "Show Network Speeds in Bits per Second" msgstr "להציג את מהירויות הרשת בסיביות לשנייה" #: data/resources/ui/dialogs/settings_dialog.ui:31 msgid "Temperature Unit" msgstr "יחידת טמפרטורה" #: data/resources/ui/dialogs/settings_dialog.ui:35 msgid "Celsius" msgstr "צלזיוס" #: data/resources/ui/dialogs/settings_dialog.ui:36 msgid "Kelvin" msgstr "קלווין" #: data/resources/ui/dialogs/settings_dialog.ui:37 msgid "Fahrenheit" msgstr "פרנהייט" #: data/resources/ui/dialogs/settings_dialog.ui:47 msgid "User Interface" msgstr "מנשק משתמש" #: data/resources/ui/dialogs/settings_dialog.ui:50 msgid "Refresh Speed" msgstr "מהירות ריענון" #: data/resources/ui/dialogs/settings_dialog.ui:51 msgid "Higher refresh speeds can lead to higher processor usage" msgstr "מהירויות ריענון גבוהות יותר יכולות להוביל לניצולת מעבד גבוהה יותר" #: data/resources/ui/dialogs/settings_dialog.ui:55 msgctxt "UI refresh speed" msgid "Very Slow" msgstr "איטית מאוד" #: data/resources/ui/dialogs/settings_dialog.ui:56 msgctxt "UI refresh speed" msgid "Slow" msgstr "איטית" #: data/resources/ui/dialogs/settings_dialog.ui:57 msgctxt "UI refresh speed" msgid "Normal" msgstr "רגילה" #: data/resources/ui/dialogs/settings_dialog.ui:58 msgctxt "UI refresh speed" msgid "Fast" msgstr "מהירה" #: data/resources/ui/dialogs/settings_dialog.ui:59 msgctxt "UI refresh speed" msgid "Very Fast" msgstr "מהירה מאוד" #: data/resources/ui/dialogs/settings_dialog.ui:67 msgid "Show Graph Grids" msgstr "הצגת רשתות בתרשים" #: data/resources/ui/dialogs/settings_dialog.ui:72 msgid "Graph Data Points" msgstr "נקודות נתונים בתרשים" #: data/resources/ui/dialogs/settings_dialog.ui:86 msgid "Show Usage Details in Sidebar" msgstr "הצגת פרטי ניצולת בסרגל הצד" #: data/resources/ui/dialogs/settings_dialog.ui:87 msgid "If enabled, the usage along with other information will be displayed" msgstr "אם האפשרות פעילה, תוצג הניצולת לצד פרטים נוספים" #: data/resources/ui/dialogs/settings_dialog.ui:92 msgid "Show Device Descriptions in Sidebar" msgstr "הצגת תיאורי התקנים בסרגל הצד" #: data/resources/ui/dialogs/settings_dialog.ui:93 msgid "" "If enabled, a device identifier like its name or device type will be displayed" msgstr "אם האפשרות פעילה, מזהה התקן כגון שמו או סוגו יוצגו" #: data/resources/ui/dialogs/settings_dialog.ui:98 msgid "Sidebar Meter Type" msgstr "סוג מד סרגל צד" #: data/resources/ui/dialogs/settings_dialog.ui:102 msgid "Bar" msgstr "עמודה" #: data/resources/ui/dialogs/settings_dialog.ui:103 msgid "Graph" msgstr "תרשים" #: data/resources/ui/dialogs/settings_dialog.ui:111 msgid "Normalize Processor Usage" msgstr "נרמול ניצולת מעבד" #: data/resources/ui/dialogs/settings_dialog.ui:112 msgid "" "If enabled, the total usage of all cores will be divided by the amount of cores" msgstr "אם האפשרות פעילה, הניצולת הכללית של כל הליבות תחולק בכמות הליבות" #: data/resources/ui/dialogs/settings_dialog.ui:122 #: data/resources/ui/window.ui:65 data/resources/ui/window.ui:72 #: src/ui/pages/applications/mod.rs:131 msgid "Apps" msgstr "יישומים" #: data/resources/ui/dialogs/settings_dialog.ui:125 #: data/resources/ui/dialogs/settings_dialog.ui:207 msgid "Information Columns" msgstr "עמודות פרטים" #: data/resources/ui/dialogs/settings_dialog.ui:183 #: data/resources/ui/dialogs/settings_dialog.ui:295 #: src/ui/pages/applications/mod.rs:1479 src/ui/pages/processes/mod.rs:2014 msgid "Combined Memory" msgstr "זיכרון משולב" #: data/resources/ui/dialogs/settings_dialog.ui:193 #: data/resources/ui/window.ui:105 data/resources/ui/window.ui:112 #: src/ui/pages/processes/mod.rs:175 msgid "Processes" msgstr "תהליכים" #: data/resources/ui/dialogs/settings_dialog.ui:196 #: data/resources/ui/pages/cpu.ui:22 data/resources/ui/pages/processes.ui:56 msgid "Options" msgstr "אפשרויות" #: data/resources/ui/dialogs/settings_dialog.ui:199 msgid "Show Niceness Values" msgstr "הצגת ערכי Niceness" #: data/resources/ui/dialogs/settings_dialog.ui:200 msgid "Display priorities as niceness to allow for more fine-grained adjustments" msgstr "הצגת עדיפויות כ־niceness כדי לאפשר כוונונים יותר עדינים" #: data/resources/ui/dialogs/settings_dialog.ui:310 msgid "Devices" msgstr "התקנים" #: data/resources/ui/dialogs/settings_dialog.ui:313 msgid "Drives" msgstr "כוננים" #: data/resources/ui/dialogs/settings_dialog.ui:316 msgid "Show Virtual Drives" msgstr "הצגת כוננים וירטואליים" #: data/resources/ui/dialogs/settings_dialog.ui:317 msgid "Virtual drives are for example ZFS volumes or mapped devices" msgstr "כוננים וירטואליים הם למשל כרכי ZFS או התקנים ממופים" #: data/resources/ui/dialogs/settings_dialog.ui:327 msgid "Show Virtual Network Interfaces" msgstr "הצגת מנשקי רשת וירטואליים" #: data/resources/ui/dialogs/settings_dialog.ui:328 msgid "Virtual network interfaces are for example bridges or VPN tunnels" msgstr "מנשקי רשת וירטואליים הם למשל גשרים/גישורים ותיעולי VPN" #: data/resources/ui/pages/applications.ui:6 #: data/resources/ui/pages/applications.ui:26 #: src/ui/pages/applications/mod.rs:1563 msgid "Kill App" msgstr "חיסול יישום" #: data/resources/ui/pages/applications.ui:10 #: data/resources/ui/pages/applications.ui:30 #: src/ui/pages/applications/mod.rs:1562 msgid "Halt App" msgstr "הקפאת יישום" #: data/resources/ui/pages/applications.ui:14 #: data/resources/ui/pages/applications.ui:34 #: src/ui/pages/applications/mod.rs:1564 msgid "Continue App" msgstr "המשך יישום" #: data/resources/ui/pages/applications.ui:22 #: data/resources/ui/pages/applications.ui:98 #: src/ui/pages/applications/mod.rs:1561 msgid "End App" msgstr "סיום יישום" #: data/resources/ui/pages/applications.ui:40 #: data/resources/ui/pages/processes.ui:62 msgid "Information" msgstr "פרטים" #: data/resources/ui/pages/applications.ui:57 msgid "Search applications" msgstr "חיפוש יישומים" #: data/resources/ui/pages/applications.ui:87 #: data/resources/ui/pages/applications.ui:89 msgid "Show App Information" msgstr "הצגת פרטי יישום" #: data/resources/ui/pages/battery.ui:36 msgid "Battery Health" msgstr "בריאות הסוללה" #: data/resources/ui/pages/battery.ui:45 msgid "Design Capacity" msgstr "קיבולת בתכנון" #: data/resources/ui/pages/battery.ui:54 msgid "Charge Cycles" msgstr "מחזורי טעינה" #: data/resources/ui/pages/battery.ui:63 msgid "Technology" msgstr "טכנולוגיה" #: data/resources/ui/pages/battery.ui:72 data/resources/ui/pages/gpu.ui:81 #: data/resources/ui/pages/network.ui:58 data/resources/ui/pages/npu.ui:75 msgid "Manufacturer" msgstr "יצרן" #: data/resources/ui/pages/battery.ui:81 msgid "Model Name" msgstr "שם דגם" #: data/resources/ui/pages/battery.ui:90 data/resources/ui/pages/drive.ui:66 msgid "Device" msgstr "התקן" #: data/resources/ui/pages/cpu.ui:26 msgid "Show Usages of Logical CPUs" msgstr "הצגת ניצולת מעבדים לוגיים" #: data/resources/ui/pages/cpu.ui:75 data/resources/ui/pages/gpu.ui:66 #: data/resources/ui/pages/npu.ui:60 msgid "Sensors" msgstr "חיישנים" #: data/resources/ui/pages/cpu.ui:90 msgid "Max Frequency" msgstr "תדירות מרבית" #: data/resources/ui/pages/cpu.ui:99 msgid "Logical Cores" msgstr "ליבות לוגיות" #: data/resources/ui/pages/cpu.ui:108 msgid "Physical Cores" msgstr "ליבות פיזיות" #: data/resources/ui/pages/cpu.ui:117 msgid "Sockets" msgstr "שקעים" #: data/resources/ui/pages/cpu.ui:126 msgid "Uptime" msgstr "זמן פעילות" #: data/resources/ui/pages/cpu.ui:135 msgid "Virtualization" msgstr "וירטואליזציה" #: data/resources/ui/pages/cpu.ui:144 msgid "Architecture" msgstr "ארכיטקטורה" #: data/resources/ui/pages/drive.ui:38 msgid "Total Read" msgstr "קריאה כוללת" #: data/resources/ui/pages/drive.ui:47 msgid "Total Written" msgstr "כתיבה כוללת" #: data/resources/ui/pages/drive.ui:57 data/resources/ui/pages/memory.ui:72 msgid "Type" msgstr "סוג" #: data/resources/ui/pages/drive.ui:75 msgid "Capacity" msgstr "קיבולת" #: data/resources/ui/pages/drive.ui:84 msgid "Writable" msgstr "זמין לכתיבה" #: data/resources/ui/pages/drive.ui:93 msgid "Removable" msgstr "נשלף" #. Translators: "Link" refers to something like "PCIe 4.0 ×16" #: data/resources/ui/pages/drive.ui:102 data/resources/ui/pages/gpu.ui:113 #: data/resources/ui/pages/network.ui:103 data/resources/ui/pages/npu.ui:107 msgid "Link" msgstr "קישור" #: data/resources/ui/pages/gpu.ui:37 msgid "GPU Frequency" msgstr "תדירות מעבד גרפי" #: data/resources/ui/pages/gpu.ui:50 msgid "Video Memory Frequency" msgstr "תדירות זיכרון וידאו" #: data/resources/ui/pages/gpu.ui:55 data/resources/ui/pages/npu.ui:49 #: src/ui/pages/battery.rs:217 msgid "Power Usage" msgstr "שימוש בחשמל" #: data/resources/ui/pages/gpu.ui:90 data/resources/ui/pages/npu.ui:84 msgid "PCI Slot" msgstr "חריץ PCI" #: data/resources/ui/pages/gpu.ui:99 data/resources/ui/pages/network.ui:67 #: data/resources/ui/pages/npu.ui:93 msgid "Driver Used" msgstr "מנהל התקן בשימוש" #: data/resources/ui/pages/gpu.ui:108 data/resources/ui/pages/npu.ui:102 msgid "Max Power Cap" msgstr "תקורת צריכה חשמלית" #: data/resources/ui/pages/memory.ui:9 msgid "You need to authenticate to see memory properties" msgstr "יש לעבור אימות כדי לצפות במאפייני הזיכרון" #: data/resources/ui/pages/memory.ui:10 msgid "Authenticate" msgstr "אימות" #: data/resources/ui/pages/memory.ui:45 msgid "Slots Used" msgstr "חריצים בשימוש" #: data/resources/ui/pages/memory.ui:54 msgid "Speed" msgstr "מהירות" #: data/resources/ui/pages/memory.ui:63 msgid "Form Factor" msgstr "מקדם גודל" #: data/resources/ui/pages/memory.ui:81 msgid "Type Detail" msgstr "פרט סוג" #: data/resources/ui/pages/network.ui:35 msgid "Total Received" msgstr "סך הכול שהתקבלו" #: data/resources/ui/pages/network.ui:44 msgid "Total Sent" msgstr "סך הכול שנשלחו" #: data/resources/ui/pages/network.ui:76 msgid "Interface" msgstr "מנשק" #: data/resources/ui/pages/network.ui:85 msgid "Hardware Address" msgstr "כתובת חומרה" #: data/resources/ui/pages/network.ui:94 msgid "Network Name" msgstr "שם הרשת" #: data/resources/ui/pages/network.ui:112 msgid "Link Speed" msgstr "מהירות קישור" #: data/resources/ui/pages/npu.ui:31 msgid "NPU Frequency" msgstr "תדירות מעבד עצבי" #: data/resources/ui/pages/npu.ui:44 msgid "Memory Frequency" msgstr "תדירות מהירות" #: data/resources/ui/pages/processes.ui:6 data/resources/ui/pages/processes.ui:42 #: src/ui/pages/processes/mod.rs:2184 msgid "Kill Process" msgstr "חיסול תהליך" #: data/resources/ui/pages/processes.ui:10 #: data/resources/ui/pages/processes.ui:46 src/ui/pages/processes/mod.rs:2183 msgid "Halt Process" msgstr "הקפאת תהליך" #: data/resources/ui/pages/processes.ui:14 #: data/resources/ui/pages/processes.ui:50 src/ui/pages/processes/mod.rs:2185 msgid "Continue Process" msgstr "המשך תהליך" #: data/resources/ui/pages/processes.ui:22 #: data/resources/ui/pages/processes.ui:74 msgid "Kill Processes" msgstr "חיסול תהליכים" #: data/resources/ui/pages/processes.ui:26 #: data/resources/ui/pages/processes.ui:78 msgid "Halt Processes" msgstr "הקפאת תהליכים" #: data/resources/ui/pages/processes.ui:30 #: data/resources/ui/pages/processes.ui:82 msgid "Continue Processes" msgstr "המשך תהליכים" #: data/resources/ui/pages/processes.ui:38 #: data/resources/ui/pages/processes.ui:157 src/ui/pages/processes/mod.rs:524 #: src/ui/pages/processes/mod.rs:2182 msgid "End Process" msgstr "סיום תהליך" #: data/resources/ui/pages/processes.ui:70 src/ui/pages/processes/mod.rs:528 msgid "End Processes" msgstr "סיום תהליכים" #: data/resources/ui/pages/processes.ui:103 msgid "Search processes" msgstr "חיפוש תהליכים" #: data/resources/ui/pages/processes.ui:133 #: data/resources/ui/pages/processes.ui:135 msgid "Show Process Options" msgstr "הצגת אפשרויות תהליך" #: data/resources/ui/pages/processes.ui:146 #: data/resources/ui/pages/processes.ui:148 msgid "Show Process Information" msgstr "הצגת פרטי תהליך" #: data/resources/ui/shortcuts.ui:6 msgctxt "shortcut window" msgid "General" msgstr "כללי" #: data/resources/ui/shortcuts.ui:9 msgctxt "shortcut window" msgid "Preferences" msgstr "העדפות" #: data/resources/ui/shortcuts.ui:15 msgctxt "shortcut window" msgid "Show Shortcuts" msgstr "הצגת קיצורי מקשים" #: data/resources/ui/shortcuts.ui:21 msgctxt "shortcut window" msgid "Quit" msgstr "יציאה" #: data/resources/ui/shortcuts.ui:29 msgctxt "shortcut window" msgid "Apps/Processes" msgstr "יישומים/תהליכים" #: data/resources/ui/shortcuts.ui:32 msgctxt "shortcut window" msgid "Toggle Search Field" msgstr "הצגת/הסתרת שדה חיפוש" #: data/resources/ui/shortcuts.ui:38 msgctxt "shortcut window" msgid "End App/Process" msgstr "סיום יישום/תהליך" #: data/resources/ui/shortcuts.ui:44 msgctxt "shortcut window" msgid "Kill App/Process" msgstr "חיסול יישום/תהליך" #: data/resources/ui/shortcuts.ui:50 msgctxt "shortcut window" msgid "Halt App/Process" msgstr "הקפאת יישום/תהליך" #: data/resources/ui/shortcuts.ui:56 msgctxt "shortcut window" msgid "Continue App/Process" msgstr "המשך יישום/תהליך" #: data/resources/ui/shortcuts.ui:62 msgctxt "shortcut window" msgid "Show Information for App/Process" msgstr "הצגת פרטים ליישום/תהליך" #: data/resources/ui/shortcuts.ui:68 msgctxt "shortcut window" msgid "Show Process Options" msgstr "הצגת אפשרויות תהליך" #: data/resources/ui/window.ui:6 msgid "Preferences" msgstr "העדפות" #: data/resources/ui/window.ui:10 msgid "Keyboard Shortcuts" msgstr "קיצורי מקשים" #: data/resources/ui/window.ui:14 msgid "About Resources" msgstr "על „משאבים”" #: data/resources/ui/window.ui:88 data/resources/ui/window.ui:128 msgid "Search" msgstr "חיפוש" #: data/resources/ui/window.ui:90 data/resources/ui/window.ui:130 msgid "Toggle search field" msgstr "הצגת/הסתרת שדה חיפוש" #: src/application.rs:274 msgid "The Nalux Team" msgstr "צוות Nalux" #: src/application.rs:282 msgid "Report Issues" msgstr "דיווח על תקלות" #. Translator credits. Replace "translator-credits" with your name/username, and optionally an email or URL. #. One name per line, please do not remove previous names. #: src/application.rs:288 msgid "translator-credits" msgstr "ירון שהרבני " #: src/application.rs:289 msgid "Icon by" msgstr "הסמל מאת" #: src/ui/dialogs/app_dialog.rs:155 src/ui/dialogs/process_dialog.rs:133 #: src/ui/dialogs/process_dialog.rs:137 src/ui/dialogs/process_dialog.rs:146 #: src/ui/dialogs/process_dialog.rs:148 src/ui/dialogs/process_dialog.rs:171 #: src/ui/dialogs/process_dialog.rs:178 src/ui/dialogs/process_dialog.rs:185 #: src/ui/dialogs/process_dialog.rs:192 src/ui/pages/applications/mod.rs:948 #: src/ui/pages/applications/mod.rs:1074 src/ui/pages/battery.rs:205 #: src/ui/pages/battery.rs:225 src/ui/pages/battery.rs:231 #: src/ui/pages/battery.rs:234 src/ui/pages/battery.rs:265 #: src/ui/pages/battery.rs:289 src/ui/pages/battery.rs:291 #: src/ui/pages/battery.rs:301 src/ui/pages/cpu.rs:243 src/ui/pages/cpu.rs:258 #: src/ui/pages/cpu.rs:278 src/ui/pages/cpu.rs:284 src/ui/pages/cpu.rs:290 #: src/ui/pages/cpu.rs:296 src/ui/pages/cpu.rs:300 src/ui/pages/cpu.rs:303 #: src/ui/pages/cpu.rs:341 src/ui/pages/cpu.rs:448 src/ui/pages/drive.rs:319 #: src/ui/pages/drive.rs:350 src/ui/pages/drive.rs:352 src/ui/pages/drive.rs:381 #: src/ui/pages/drive.rs:383 src/ui/pages/drive.rs:399 src/ui/pages/drive.rs:400 #: src/ui/pages/drive.rs:407 src/ui/pages/drive.rs:417 src/ui/pages/drive.rs:427 #: src/ui/pages/drive.rs:433 src/ui/pages/gpu.rs:245 src/ui/pages/gpu.rs:252 #: src/ui/pages/gpu.rs:297 src/ui/pages/gpu.rs:322 src/ui/pages/gpu.rs:325 #: src/ui/pages/gpu.rs:336 src/ui/pages/gpu.rs:377 src/ui/pages/gpu.rs:384 #: src/ui/pages/gpu.rs:396 src/ui/pages/gpu.rs:403 src/ui/pages/gpu.rs:407 #: src/ui/pages/gpu.rs:437 src/ui/pages/gpu.rs:443 src/ui/pages/memory.rs:227 #: src/ui/pages/memory.rs:228 src/ui/pages/memory.rs:232 #: src/ui/pages/memory.rs:233 src/ui/pages/memory.rs:237 #: src/ui/pages/memory.rs:238 src/ui/pages/memory.rs:266 #: src/ui/pages/memory.rs:327 src/ui/pages/network.rs:252 #: src/ui/pages/network.rs:259 src/ui/pages/network.rs:266 #: src/ui/pages/network.rs:272 src/ui/pages/network.rs:275 #: src/ui/pages/network.rs:285 src/ui/pages/network.rs:292 #: src/ui/pages/network.rs:302 src/ui/pages/network.rs:370 #: src/ui/pages/network.rs:373 src/ui/pages/network.rs:375 #: src/ui/pages/network.rs:404 src/ui/pages/network.rs:407 #: src/ui/pages/network.rs:409 src/ui/pages/network.rs:417 #: src/ui/pages/network.rs:424 src/ui/pages/network.rs:434 #: src/ui/pages/processes/mod.rs:1225 src/ui/pages/processes/mod.rs:1292 #: src/ui/pages/processes/mod.rs:1359 src/ui/pages/processes/mod.rs:1426 #: src/ui/pages/processes/mod.rs:1912 src/ui/pages/processes/mod.rs:1914 #: src/utils/battery.rs:152 src/utils/drive.rs:137 src/utils/gpu/mod.rs:279 #: src/utils/gpu/mod.rs:291 src/utils/link/mod.rs:61 src/utils/npu/mod.rs:244 #: src/utils/npu/mod.rs:250 msgid "N/A" msgstr "לא זמין" #: src/ui/dialogs/process_options_dialog.rs:147 src/ui/pages/cpu.rs:257 #: src/ui/pages/cpu.rs:417 src/ui/pages/cpu.rs:421 msgid "CPU {}" msgstr "מעבד {}" #: src/ui/pages/applications/application_entry.rs:190 src/ui/pages/drive.rs:414 #: src/ui/pages/drive.rs:424 src/ui/pages/processes/process_entry.rs:211 msgid "No" msgstr "לא" #: src/ui/pages/applications/application_entry.rs:191 #: src/ui/pages/processes/process_entry.rs:212 msgid "Yes (Flatpak)" msgstr "כן (Flatpak)" #: src/ui/pages/applications/application_entry.rs:192 #: src/ui/pages/processes/process_entry.rs:213 msgid "Yes (Snap)" msgstr "כן (Snap)" #: src/ui/pages/applications/mod.rs:660 msgid "Running Apps: {}" msgstr "יישומים פעילים:" #: src/ui/pages/applications/mod.rs:700 src/ui/pages/processes/mod.rs:863 msgid "Cancel" msgstr "ביטול" #: src/ui/pages/applications/mod.rs:746 msgid "App" msgstr "יישום" #: src/ui/pages/applications/mod.rs:1539 src/ui/pages/processes/mod.rs:2131 msgid "End {}?" msgstr "לסיים את {}?" #: src/ui/pages/applications/mod.rs:1540 src/ui/pages/processes/mod.rs:2132 msgid "Halt {}?" msgstr "להקפיא את {}?" #: src/ui/pages/applications/mod.rs:1541 src/ui/pages/processes/mod.rs:2133 msgid "Kill {}?" msgstr "לחסל את {}?" #: src/ui/pages/applications/mod.rs:1542 src/ui/pages/processes/mod.rs:2134 msgid "Continue {}?" msgstr "להמשיך את {}?" #: src/ui/pages/applications/mod.rs:1548 src/ui/pages/processes/mod.rs:2169 msgid "Unsaved work might be lost." msgstr "עבודה שלא נשמרה עלולה ללכת לאיבוד." #: src/ui/pages/applications/mod.rs:1550 msgid "" "Halting an app can come with serious risks such as losing data and security " "implications. Use with caution." msgstr "" "הקפאת יישום יכולה לגרום לסיכונים משמעותיים לאובדן נתונים ולהשליך גם על אבטחת " "מידע. יש לנקוט במשנה זהירות." #: src/ui/pages/applications/mod.rs:1553 msgid "" "Killing an app can come with serious risks such as losing data and security " "implications. Use with caution." msgstr "" "חיסול יישום יכול לגרום לסיכונים משמעותיים לאובדן נתונים ולהשליך גם על אבטחת " "מידע. יש לנקוט במשנה זהירות." #: src/ui/pages/battery.rs:102 src/utils/battery.rs:258 msgid "Battery" msgstr "סוללה" #: src/ui/pages/battery.rs:210 msgid "Battery Charge" msgstr "טעינת הסוללה" #: src/ui/pages/battery.rs:279 src/ui/pages/cpu.rs:438 src/ui/pages/drive.rs:344 #: src/ui/pages/drive.rs:375 src/ui/pages/gpu.rs:429 src/ui/pages/network.rs:362 #: src/ui/pages/network.rs:396 msgid "Highest:" msgstr "הגבוהה ביותר:" #: src/ui/pages/cpu.rs:242 src/ui/pages/gpu.rs:212 msgid "Total Usage" msgstr "סך כל הניצולת" #: src/ui/pages/cpu.rs:271 src/ui/pages/gpu.rs:239 msgid "Temperature" msgstr "טמפרטורה" #: src/ui/pages/drive.rs:126 msgid "Drive" msgstr "כונן" #: src/ui/pages/drive.rs:236 msgid "Drive Activity" msgstr "פעילות כונן" #: src/ui/pages/drive.rs:243 msgid "Read Speed" msgstr "מהירות קריאה" #: src/ui/pages/drive.rs:247 msgid "Write Speed" msgstr "מהירות כתיבה" #: src/ui/pages/drive.rs:412 src/ui/pages/drive.rs:422 msgid "Yes" msgstr "כן" #. Translators: This is an abbreviation for "Read" and "Write". This is displayed in the sidebar so your #. translation should preferably be quite short or an abbreviation #: src/ui/pages/drive.rs:440 msgid "R: {} · W: {}" msgstr "ק: {} · כ: {}" #: src/ui/pages/gpu.rs:220 msgid "Video Encoder/Decoder Usage" msgstr "ניצולת מקודד/מפענח וידאו" #: src/ui/pages/gpu.rs:226 msgid "Video Encoder Usage" msgstr "ניצולת מקודד וידאו" #: src/ui/pages/gpu.rs:231 msgid "Video Decoder Usage" msgstr "ניצולת מפענח וידאו" #: src/ui/pages/gpu.rs:236 msgid "Video Memory Usage" msgstr "ניצולת זיכרון וידאו" #. Translators: This will be displayed in the sidebar, please try to keep your translation as short as (or even #. shorter than) 'Memory' #: src/ui/pages/gpu.rs:415 msgid "Memory: {}" msgstr "זיכרון: {}" #: src/ui/pages/memory.rs:262 msgid "{} of {}" msgstr "{} מתוך {}" #: src/ui/pages/memory.rs:265 msgid "{} MT/s" msgstr "{} מיליון העברות לשנ׳" #. Translators: This will be displayed in the sidebar, so your translation for "Swap" should #. preferably be quite short or an abbreviation #: src/ui/pages/memory.rs:346 msgid "{} / {} · Swap: {} %" msgstr "{} / {} · החלפה: ‎{} %‎" #: src/ui/pages/network.rs:127 src/utils/network.rs:135 msgid "Network Interface" msgstr "מנשק רשת" #: src/ui/pages/network.rs:241 msgid "Receiving" msgstr "מתקבל" #: src/ui/pages/network.rs:245 msgid "Sending" msgstr "נשלח" #. Translators: This is an abbreviation for "Receive" and "Send". This is displayed in the sidebar so #. your translation should preferably be quite short or an abbreviation #: src/ui/pages/network.rs:445 msgid "R: {} · S: {}" msgstr "↓: {} · ↑: {}" #: src/ui/pages/processes/mod.rs:814 msgid "Running Processes: {}" msgstr "תהליכים פעילים: {}" #: src/ui/pages/processes/mod.rs:912 msgid "Process" msgstr "תהליך" #: src/ui/pages/processes/mod.rs:2141 msgid "End process?" msgid_plural "End {} processes?" msgstr[0] "לסיים את התהליך?" msgstr[1] "לסיים שני תהליכים?" msgstr[2] "לסיים {} תהליכים?" msgstr[3] "לסיים {} תהליכים?" #: src/ui/pages/processes/mod.rs:2147 msgid "Halt process?" msgid_plural "Halt {} processes?" msgstr[0] "להקפיא תהליך?" msgstr[1] "להקפיא שני תהליכים?" msgstr[2] "להקפיא {} תהליכים?" msgstr[3] "להקפיא {} תהליכים?" #: src/ui/pages/processes/mod.rs:2153 src/ui/pages/processes/mod.rs:2159 msgid "Kill process?" msgid_plural "Kill {} processes?" msgstr[0] "לחסל תהליך?" msgstr[1] "לחסל שני תהליכים?" msgstr[2] "לחסל {} תהליכים?" msgstr[3] "לחסל {} תהליכים?" #: src/ui/pages/processes/mod.rs:2171 msgid "" "Halting a process can come with serious risks such as losing data and security " "implications. Use with caution." msgstr "" "הקפאת תהליך יכולה לגרום לסיכונים משמעותיים לאובדן נתונים ולהשליך גם על אבטחת " "מידע. יש לנקוט במשנה זהירות." #: src/ui/pages/processes/mod.rs:2174 msgid "" "Killing a process can come with serious risks such as losing data and security " "implications. Use with caution." msgstr "" "חיסול תהליך יכול לגרום לסיכונים משמעותיים לאובדן נתונים ולהשליך גם על אבטחת " "מידע. יש לנקוט במשנה זהירות." #: src/ui/window.rs:466 msgid "GPU {}" msgstr "מעבד גרפי {}" #: src/ui/window.rs:496 msgid "NPU {}" msgstr "מעבד עצבי {}" #: src/ui/window.rs:498 msgid "NPU" msgstr "מעבד עצבי" #: src/ui/window.rs:1174 msgid "Successfully adjusted {}" msgstr "{} הותאם בהצלחה" #: src/ui/window.rs:1175 msgid "There was a problem adjusting {}" msgstr "אירעה בעיה בכיוון {}" #: src/ui/window.rs:1257 msgid "Successfully ended {}" msgstr "{} הסתיים בהצלחה" #: src/ui/window.rs:1258 msgid "Successfully halted {}" msgstr "{} הוקפא בהצלחה" #: src/ui/window.rs:1259 msgid "Successfully killed {}" msgstr "{} חוסל בהצלחה" #: src/ui/window.rs:1260 msgid "Successfully continued {}" msgstr "{} נמשך בהצלחה" #: src/ui/window.rs:1267 msgid "Successfully ended the process" msgid_plural "Successfully ended {} processes" msgstr[0] "סיים את התהליך בהצלחה" msgstr[1] "סיים שני תהליכים בהצלחה" msgstr[2] "סיים {} תהליכים בהצלחה" msgstr[3] "סיים {} תהליכים בהצלחה" #: src/ui/window.rs:1273 msgid "Successfully halted the process" msgid_plural "Successfully halted {} processes" msgstr[0] "הקפיא את התהליך בהצלחה" msgstr[1] "הקפיא שני תהליכים בהצלחה" msgstr[2] "הקפיא {} תהליכים בהצלחה" msgstr[3] "הקפיא {} תהליכים בהצלחה" #: src/ui/window.rs:1279 msgid "Successfully killed the process" msgid_plural "Successfully killed {} processes" msgstr[0] "חיסל את התהליך בהצלחה" msgstr[1] "חיסל שני תהליכים בהצלחה" msgstr[2] "חיסל {} תהליכים בהצלחה" msgstr[3] "חיסל {} תהליכים בהצלחה" #: src/ui/window.rs:1285 msgid "Successfully continued the process" msgid_plural "Successfully continued {} processes" msgstr[0] "המשיך את התהליך בהצלחה" msgstr[1] "המשיך שני תהליכים בהצלחה" msgstr[2] "המשיך {} תהליכים בהצלחה" msgstr[3] "המשיך {} תהליכים בהצלחה" #: src/ui/window.rs:1296 msgid "There was a problem ending a process" msgid_plural "There were problems ending {} processes" msgstr[0] "אירעה בעיה בסיום תהליך" msgstr[1] "אירעה בעיה בסיום שני תהליכים" msgstr[2] "אירעה בעיה בסיום {} תהליכים" msgstr[3] "אירעה בעיה בסיום {} תהליכים" #: src/ui/window.rs:1302 msgid "There was a problem halting a process" msgid_plural "There were problems halting {} processes" msgstr[0] "אירעה בעיה בהקפאת תהליך" msgstr[1] "אירעה בעיה בהקפאת שני תהליכים" msgstr[2] "אירעה בעיה בהקפאת {} תהליכים" msgstr[3] "אירעה בעיה בהקפאת {} תהליכים" #: src/ui/window.rs:1308 msgid "There was a problem killing a process" msgid_plural "There were problems killing {} processes" msgstr[0] "אירעה בעיה בחיסול תהליך" msgstr[1] "אירעה בעיה בחיסול שני תהליכים" msgstr[2] "אירעה בעיה בחיסול {} תהליכים" msgstr[3] "אירעה בעיה בחיסול {} תהליכים" #: src/ui/window.rs:1314 msgid "There was a problem continuing a process" msgid_plural "There were problems continuing {} processes" msgstr[0] "אירעה בעיה בהמשך תהליך" msgstr[1] "אירעה בעיה בהמשך שני תהליכים" msgstr[2] "אירעה בעיה בהמשך {} תהליכים" msgstr[3] "אירעה בעיה בהמשך {} תהליכים" #: src/ui/window.rs:1324 msgid "There was a problem ending {}" msgstr "אירעה בעיה בסיום {}" #: src/ui/window.rs:1325 msgid "There was a problem halting {}" msgstr "אירעה בעיה בהקפאת {}" #: src/ui/window.rs:1326 msgid "There was a problem killing {}" msgstr "אירעה בעיה בחיסול {}" #: src/ui/window.rs:1327 msgid "There was a problem continuing {}" msgstr "אירעה בעיה בהמשך {}" #: src/utils/app.rs:222 msgid "System Processes" msgstr "תהליכי מערכת" #: src/utils/battery.rs:93 msgid "Charging" msgstr "בטעינה" #: src/utils/battery.rs:94 msgid "Discharging" msgstr "בפריקה" #: src/utils/battery.rs:95 msgid "Empty" msgstr "ריק" #: src/utils/battery.rs:96 msgid "Full" msgstr "מלא" #: src/utils/battery.rs:97 msgid "Unknown" msgstr "לא ידועה" #: src/utils/battery.rs:143 msgid "Nickel-Metal Hydride" msgstr "ניקל מתכת הידריד" #: src/utils/battery.rs:144 msgid "Nickel-Cadmium" msgstr "ניקל קדמיום" #: src/utils/battery.rs:145 msgid "Nickel-Zinc" msgstr "ניקל אבץ" #: src/utils/battery.rs:146 msgid "Lead-Acid" msgstr "עופרת חומצה" #: src/utils/battery.rs:147 msgid "Lithium-Ion" msgstr "ליתיום יון" #: src/utils/battery.rs:148 msgid "Lithium Iron Phosphate" msgstr "ליתיום ברזל פוספט" #: src/utils/battery.rs:149 msgid "Lithium Polymer" msgstr "ליתיום פולימר" #: src/utils/battery.rs:151 msgid "Rechargeable Alkaline Managanese" msgstr "אלקלית-מנגן נטענת" #: src/utils/battery.rs:256 msgid "{} Battery" msgstr "סוללת {}" #: src/utils/units.rs:91 msgid "{} K" msgstr "{} קלווין" #: src/utils/units.rs:93 msgid "{} °C" msgstr "{} ‎°C" #: src/utils/units.rs:95 msgid "{} °F" msgstr "{} ‎°F" #: src/utils/units.rs:113 src/utils/units.rs:127 src/utils/units.rs:147 #: src/utils/units.rs:161 msgid "{} B" msgstr "{} ב׳" #: src/utils/units.rs:114 src/utils/units.rs:128 msgid "{} kB" msgstr "{} ק״ב" #: src/utils/units.rs:115 src/utils/units.rs:129 msgid "{} MB" msgstr "{} מ״ב" #: src/utils/units.rs:116 src/utils/units.rs:130 msgid "{} GB" msgstr "{} ג״ב" #: src/utils/units.rs:117 src/utils/units.rs:131 msgid "{} TB" msgstr "{} ט״ב" #: src/utils/units.rs:118 src/utils/units.rs:132 msgid "{} PB" msgstr "{} פ״ב" #: src/utils/units.rs:119 src/utils/units.rs:133 msgid "{} EB" msgstr "{} א״ב" #: src/utils/units.rs:120 src/utils/units.rs:134 msgid "{} ZB" msgstr "{} ז״ב" #: src/utils/units.rs:121 src/utils/units.rs:135 msgid "{} YB" msgstr "{} י״ב" #: src/utils/units.rs:122 src/utils/units.rs:136 msgid "{} RB" msgstr "{} ר״ב" #: src/utils/units.rs:123 src/utils/units.rs:137 msgid "{} QB" msgstr "{} QB" #: src/utils/units.rs:148 src/utils/units.rs:162 msgid "{} KiB" msgstr "{} KiB" #: src/utils/units.rs:149 src/utils/units.rs:163 msgid "{} MiB" msgstr "{} MiB" #: src/utils/units.rs:150 src/utils/units.rs:164 msgid "{} GiB" msgstr "{} GiB" #: src/utils/units.rs:151 src/utils/units.rs:165 msgid "{} TiB" msgstr "{} TiB" #: src/utils/units.rs:152 src/utils/units.rs:166 msgid "{} PiB" msgstr "{} PiB" #: src/utils/units.rs:153 src/utils/units.rs:167 msgid "{} EiB" msgstr "{} EiB" #: src/utils/units.rs:154 src/utils/units.rs:168 msgid "{} ZiB" msgstr "{} ZiB" #: src/utils/units.rs:155 src/utils/units.rs:169 msgid "{} YiB" msgstr "{} YiB" #: src/utils/units.rs:156 src/utils/units.rs:170 msgid "{} RiB" msgstr "{} RiB" #: src/utils/units.rs:157 src/utils/units.rs:171 msgid "{} QiB" msgstr "{} QiB" #: src/utils/units.rs:198 src/utils/units.rs:215 msgid "{} B/s" msgstr "{} ב׳ לשנ׳" #: src/utils/units.rs:199 msgid "{} kB/s" msgstr "{} ק״ב לשנ׳" #: src/utils/units.rs:200 msgid "{} MB/s" msgstr "{} מ״ב לשנ׳" #: src/utils/units.rs:201 msgid "{} GB/s" msgstr "{} ג״ב לשנ׳" #: src/utils/units.rs:202 msgid "{} TB/s" msgstr "{} ט״ב לשנ׳" #: src/utils/units.rs:203 msgid "{} PB/s" msgstr "{} פ״ב לשנ׳" #: src/utils/units.rs:204 msgid "{} EB/s" msgstr "" #: src/utils/units.rs:205 msgid "{} ZB/s" msgstr "" #: src/utils/units.rs:206 msgid "{} YB/s" msgstr "" #: src/utils/units.rs:207 msgid "{} RB/s" msgstr "" #: src/utils/units.rs:208 msgid "{} QB/s" msgstr "" #: src/utils/units.rs:216 msgid "{} KiB/s" msgstr "" #: src/utils/units.rs:217 msgid "{} MiB/s" msgstr "{} MiB/s" #: src/utils/units.rs:218 msgid "{} GiB/s" msgstr "" #: src/utils/units.rs:219 msgid "{} TiB/s" msgstr "" #: src/utils/units.rs:220 msgid "{} PiB/s" msgstr "" #: src/utils/units.rs:221 msgid "{} EiB/s" msgstr "" #: src/utils/units.rs:222 msgid "{} ZiB/s" msgstr "" #: src/utils/units.rs:223 msgid "{} YiB/s" msgstr "" #: src/utils/units.rs:224 msgid "{} RiB/s" msgstr "" #: src/utils/units.rs:225 msgid "{} QiB/s" msgstr "" #: src/utils/units.rs:239 src/utils/units.rs:256 msgid "{} b/s" msgstr "{} סיביות לשנ׳" #: src/utils/units.rs:240 msgid "{} kb/s" msgstr "{} קסל״ש" #: src/utils/units.rs:241 msgid "{} Mb/s" msgstr "{} מסל״ש" #: src/utils/units.rs:242 msgid "{} Gb/s" msgstr "{} גסל״ש" #: src/utils/units.rs:243 msgid "{} Tb/s" msgstr "{} טסל״ש" #: src/utils/units.rs:244 msgid "{} Pb/s" msgstr "{} פסל״ש" #: src/utils/units.rs:245 msgid "{} Eb/s" msgstr "" #: src/utils/units.rs:246 msgid "{} Zb/s" msgstr "" #: src/utils/units.rs:247 msgid "{} Yb/s" msgstr "" #: src/utils/units.rs:248 msgid "{} Rb/s" msgstr "" #: src/utils/units.rs:249 msgid "{} Qb/s" msgstr "" #: src/utils/units.rs:257 msgid "{} Kib/s" msgstr "" #: src/utils/units.rs:258 msgid "{} Mib/s" msgstr "{} Mib לשנ׳" #: src/utils/units.rs:259 msgid "{} Gib/s" msgstr "" #: src/utils/units.rs:260 msgid "{} Tib/s" msgstr "" #: src/utils/units.rs:261 msgid "{} Pib/s" msgstr "" #: src/utils/units.rs:262 msgid "{} Eib/s" msgstr "" #: src/utils/units.rs:263 msgid "{} Zib/s" msgstr "" #: src/utils/units.rs:264 msgid "{} Yib/s" msgstr "" #: src/utils/units.rs:265 msgid "{} Rib/s" msgstr "" #: src/utils/units.rs:266 msgid "{} Qib/s" msgstr "" #: src/utils/units.rs:273 msgid "{} Hz" msgstr "{} הרץ" #: src/utils/units.rs:274 msgid "{} kHz" msgstr "{} קה״ץ" #: src/utils/units.rs:275 msgid "{} MHz" msgstr "{} מה״ץ" #: src/utils/units.rs:276 msgid "{} GHz" msgstr "{} גה״ץ" #: src/utils/units.rs:277 msgid "{} THz" msgstr "{} טה״ץ" #: src/utils/units.rs:278 msgid "{} PHz" msgstr "פה״ץ" #: src/utils/units.rs:279 msgid "{} EHz" msgstr "{} אה״ץ" #: src/utils/units.rs:280 msgid "{} ZHz" msgstr "" #: src/utils/units.rs:281 msgid "{} YHz" msgstr "" #: src/utils/units.rs:282 msgid "{} RHz" msgstr "" #: src/utils/units.rs:283 msgid "{} QHz" msgstr "" #: src/utils/units.rs:290 msgid "{} W" msgstr "{} ואט" #: src/utils/units.rs:291 msgid "{} kW" msgstr "{} קילוואט" #: src/utils/units.rs:292 msgid "{} MW" msgstr "{} מגהוואט" #: src/utils/units.rs:293 msgid "{} GW" msgstr "{} גיגהוואט" #: src/utils/units.rs:294 msgid "{} TW" msgstr "{} טרהוואט" #: src/utils/units.rs:295 msgid "{} PW" msgstr "{} פטהוואט" #: src/utils/units.rs:296 msgid "{} EW" msgstr "" #: src/utils/units.rs:297 msgid "{} ZW" msgstr "" #: src/utils/units.rs:298 msgid "{} YW" msgstr "" #: src/utils/units.rs:299 msgid "{} RW" msgstr "" #: src/utils/units.rs:300 msgid "{} QW" msgstr "" #: src/utils/units.rs:309 src/utils/units.rs:323 msgid "{} Wh" msgstr "" #: src/utils/units.rs:310 src/utils/units.rs:324 msgid "{} kWh" msgstr "" #: src/utils/units.rs:311 src/utils/units.rs:325 msgid "{} MWh" msgstr "{} מגהוואט לשעה" #: src/utils/units.rs:312 src/utils/units.rs:326 msgid "{} GWh" msgstr "" #: src/utils/units.rs:313 src/utils/units.rs:327 msgid "{} TWh" msgstr "" #: src/utils/units.rs:314 src/utils/units.rs:328 msgid "{} PWh" msgstr "" #: src/utils/units.rs:315 src/utils/units.rs:329 msgid "{} EWh" msgstr "" #: src/utils/units.rs:316 src/utils/units.rs:330 msgid "{} ZWh" msgstr "" #: src/utils/units.rs:317 src/utils/units.rs:331 msgid "{} YWh" msgstr "" #: src/utils/units.rs:318 src/utils/units.rs:332 msgid "{} RWh" msgstr "" #: src/utils/units.rs:319 src/utils/units.rs:333 msgid "{} QWh" msgstr "" #: src/utils/drive.rs:129 src/utils/drive.rs:208 msgid "CD/DVD/Blu-ray Drive" msgstr "כונן CD/DVD/Blu-ray" #: src/utils/drive.rs:130 msgid "eMMC Storage" msgstr "אחסון eMMC" #: src/utils/drive.rs:131 msgid "Flash Storage" msgstr "אחסון פלאש" #: src/utils/drive.rs:132 src/utils/drive.rs:209 msgid "Floppy Drive" msgstr "כונן תקליטונים" #: src/utils/drive.rs:133 msgid "Hard Disk Drive" msgstr "כונן קשיח" #: src/utils/drive.rs:134 msgid "Loop Device" msgstr "התקן לולאה" #: src/utils/drive.rs:135 msgid "Mapped Device" msgstr "התקן ממופה" #: src/utils/drive.rs:136 msgid "NVMe Drive" msgstr "כונן NVMe" #: src/utils/drive.rs:138 msgid "Software Raid" msgstr "Raid תוכנית" #: src/utils/drive.rs:139 msgid "RAM Disk" msgstr "כונן זיכרון RAM" #: src/utils/drive.rs:140 msgid "Solid State Drive" msgstr "כונן במצב יציב" #: src/utils/drive.rs:141 msgid "ZFS Volume" msgstr "כרך ZFS" #: src/utils/drive.rs:142 msgid "Compressed RAM Disk (zram)" msgstr "כונן זיכרון RAM דחוס (zram)" #: src/utils/drive.rs:210 msgid "{} Loop Device" msgstr "התקן לולאה {}" #: src/utils/drive.rs:211 msgid "{} Mapped Device" msgstr "התקן {} ממופה" #: src/utils/drive.rs:212 msgid "{} RAID" msgstr "RAID {}" #: src/utils/drive.rs:213 msgid "{} RAM Disk" msgstr "כונן זיכרון RAM {}" #: src/utils/drive.rs:214 msgid "{} zram Device" msgstr "התקן zram {}" #: src/utils/drive.rs:215 msgid "{} ZFS Volume" msgstr "כרך ZFS {}" #: src/utils/drive.rs:216 msgid "{} Drive" msgstr "כונן {}" #: src/utils/network.rs:123 msgid "Bluetooth Tether" msgstr "קשירת בלוטות׳" #: src/utils/network.rs:124 msgid "Network Bridge" msgstr "גישור רשת" #: src/utils/network.rs:125 msgid "Ethernet Connection" msgstr "חיבור אתרנט" #: src/utils/network.rs:126 msgid "Docker Bridge" msgstr "גישור של Docker" #: src/utils/network.rs:127 msgid "InfiniBand Connection" msgstr "חיבור אינפיניבנד" #: src/utils/network.rs:128 msgid "Serial Line IP Connection" msgstr "חיבור IP טורי" #: src/utils/network.rs:129 msgid "Virtual Ethernet Device" msgstr "התקן אתרנט וירטואלי" #: src/utils/network.rs:130 msgid "VM Network Bridge" msgstr "גישור קישוריות למכונה וירטואליות" #: src/utils/network.rs:131 msgid "VPN Tunnel" msgstr "תעלת VPN" #: src/utils/network.rs:132 msgid "VPN Tunnel (WireGuard)" msgstr "תעלת VPN‏ (WireGuard)" #: src/utils/network.rs:133 msgid "Wi-Fi Connection" msgstr "חיבור רשת אלחוטית" #: src/utils/network.rs:134 msgid "WWAN Connection" msgstr "חיבור WWAN" resources-1.9.1/po/hi.po000066400000000000000000001364111510634446000151230ustar00rootroot00000000000000# Hindi translation for resources. # Copyright (C) 2024 resources's COPYRIGHT HOLDER # This file is distributed under the same license as the resources package. # Scrambled777 , 2024. # msgid "" msgstr "" "Project-Id-Version: resources\n" "Report-Msgid-Bugs-To: https://github.com/nokyan/resources/issues\n" "POT-Creation-Date: 2024-07-07 18:21+0200\n" "PO-Revision-Date: 2024-08-02 23:51+0530\n" "Last-Translator: Scrambled777 \n" "Language-Team: Hindi \n" "Language: hi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Gtranslator 46.1\n" #: data/net.nokyan.Resources.desktop.in.in:3 #: data/net.nokyan.Resources.metainfo.xml.in.in:4 src/application.rs:191 msgid "Resources" msgstr "रिसोर्सेज" #. Translators: The summary should be 35 characters or less according to Flathub appstream guidelines #: data/net.nokyan.Resources.desktop.in.in:4 #: data/net.nokyan.Resources.metainfo.xml.in.in:5 msgid "Keep an eye on system resources" msgstr "सिस्टम संसाधनों पर नज़र रखें" #: data/net.nokyan.Resources.desktop.in.in:10 msgid "" "System;Resources;Monitor;Processes;Usage;Task;Manager;CPU;RAM;Memory;GPU;" msgstr "सिस्टम;संसाधन;निगरानी;प्रक्रियाएं;उपयोग;कार्य;प्रबंधक;सीपीयू;रैम;मेमोरी;जीपीयू;" #: data/net.nokyan.Resources.metainfo.xml.in.in:17 msgid "" "Resources allows you to check the utilization of your system resources and " "control your running processes and apps. It’s designed to be user-friendly " "and feel right at home on a modern desktop by using GNOME’s libadwaita." msgstr "" "रिसोर्सेज आपको अपने सिस्टम संसाधनों के उपयोग की जांच करने और आपकी चल रही प्रक्रियाओं और " "अनुप्रयोगों को नियंत्रित करने की अनुमति देता है। इसे गनोम के libadwaita का उपयोग करके " "उपयोगकर्ता के अनुकूल और आधुनिक डेस्कटॉप पर घर जैसा अनुभव देने के लिए डिज़ाइन किया गया है।" #: data/net.nokyan.Resources.metainfo.xml.in.in:20 msgid "Resources supports monitoring the following components:" msgstr "संसाधन निम्नलिखित घटकों की निगरानी का समर्थन करते हैं:" #: data/net.nokyan.Resources.metainfo.xml.in.in:24 msgid "CPU" msgstr "सीपीयू" #: data/net.nokyan.Resources.metainfo.xml.in.in:25 #: src/ui/pages/applications/mod.rs:670 src/ui/pages/memory.rs:132 #: src/ui/pages/memory.rs:205 src/ui/pages/processes/mod.rs:726 #: data/resources/ui/window.ui:158 data/resources/ui/window.ui:165 #: data/resources/ui/dialogs/app_dialog.ui:86 #: data/resources/ui/dialogs/process_dialog.ui:68 #: data/resources/ui/dialogs/settings_dialog.ui:133 #: data/resources/ui/dialogs/settings_dialog.ui:204 msgid "Memory" msgstr "मेमोरी" #: data/net.nokyan.Resources.metainfo.xml.in.in:26 #: src/ui/pages/applications/mod.rs:965 src/ui/pages/gpu.rs:146 #: src/ui/pages/processes/mod.rs:1032 src/ui/window.rs:286 #: data/resources/ui/dialogs/app_dialog.ui:135 #: data/resources/ui/dialogs/process_dialog.ui:113 #: data/resources/ui/dialogs/settings_dialog.ui:163 #: data/resources/ui/dialogs/settings_dialog.ui:234 msgid "GPU" msgstr "जीपीयू" #: data/net.nokyan.Resources.metainfo.xml.in.in:27 #: data/resources/ui/dialogs/settings_dialog.ui:288 msgid "Network Interfaces" msgstr "नेटवर्क इंटरफेस" #: data/net.nokyan.Resources.metainfo.xml.in.in:28 msgid "Storage Devices" msgstr "स्टोरेज उपकरण" #: src/application.rs:193 msgid "The Nalux Team" msgstr "नालक्स टीम" #: src/application.rs:201 msgid "Report Issues" msgstr "मुद्दे रिपोर्ट करें" #. Translator credits. Replace "translator-credits" with your name/username, and optionally an email or URL. #. One name per line, please do not remove previous names. #: src/application.rs:207 msgid "translator-credits" msgstr "Scrambled777 " #: src/application.rs:208 msgid "Icon by" msgstr "आइकॉन प्रदानकर्ता" #: src/ui/dialogs/app_dialog.rs:145 src/ui/dialogs/process_dialog.rs:140 #: src/ui/pages/drive.rs:418 src/ui/pages/drive.rs:428 msgid "No" msgstr "नहीं" #: src/ui/dialogs/app_dialog.rs:146 src/ui/dialogs/process_dialog.rs:141 msgid "Yes (Flatpak)" msgstr "हां (फ्लैटपैक)" #: src/ui/dialogs/app_dialog.rs:147 src/ui/dialogs/process_dialog.rs:142 msgid "Yes (Snap)" msgstr "हां (स्नैप)" #: src/ui/dialogs/process_dialog.rs:128 src/ui/dialogs/process_dialog.rs:135 #: src/ui/dialogs/process_dialog.rs:137 src/ui/dialogs/process_dialog.rs:162 #: src/ui/dialogs/process_dialog.rs:169 src/ui/dialogs/process_dialog.rs:176 #: src/ui/dialogs/process_dialog.rs:183 src/ui/pages/applications/mod.rs:784 #: src/ui/pages/applications/mod.rs:882 src/ui/pages/battery.rs:223 #: src/ui/pages/battery.rs:244 src/ui/pages/battery.rs:250 #: src/ui/pages/battery.rs:253 src/ui/pages/battery.rs:279 #: src/ui/pages/battery.rs:303 src/ui/pages/battery.rs:305 #: src/ui/pages/battery.rs:315 src/ui/pages/cpu.rs:237 src/ui/pages/cpu.rs:252 #: src/ui/pages/cpu.rs:266 src/ui/pages/cpu.rs:272 src/ui/pages/cpu.rs:278 #: src/ui/pages/cpu.rs:284 src/ui/pages/cpu.rs:288 src/ui/pages/cpu.rs:291 #: src/ui/pages/cpu.rs:384 src/ui/pages/drive.rs:325 src/ui/pages/drive.rs:355 #: src/ui/pages/drive.rs:357 src/ui/pages/drive.rs:385 #: src/ui/pages/drive.rs:387 src/ui/pages/drive.rs:403 #: src/ui/pages/drive.rs:404 src/ui/pages/drive.rs:411 #: src/ui/pages/drive.rs:421 src/ui/pages/drive.rs:431 src/ui/pages/gpu.rs:251 #: src/ui/pages/gpu.rs:293 src/ui/pages/gpu.rs:318 src/ui/pages/gpu.rs:321 #: src/ui/pages/gpu.rs:332 src/ui/pages/gpu.rs:352 src/ui/pages/gpu.rs:364 #: src/ui/pages/gpu.rs:378 src/ui/pages/gpu.rs:380 src/ui/pages/gpu.rs:392 #: src/ui/pages/gpu.rs:399 src/ui/pages/gpu.rs:403 src/ui/pages/memory.rs:240 #: src/ui/pages/memory.rs:241 src/ui/pages/memory.rs:245 #: src/ui/pages/memory.rs:246 src/ui/pages/memory.rs:250 #: src/ui/pages/memory.rs:251 src/ui/pages/memory.rs:279 #: src/ui/pages/memory.rs:333 src/ui/pages/network.rs:257 #: src/ui/pages/network.rs:264 src/ui/pages/network.rs:271 #: src/ui/pages/network.rs:277 src/ui/pages/network.rs:280 #: src/ui/pages/network.rs:341 src/ui/pages/network.rs:344 #: src/ui/pages/network.rs:346 src/ui/pages/network.rs:375 #: src/ui/pages/network.rs:378 src/ui/pages/network.rs:380 #: src/ui/pages/processes/mod.rs:839 src/ui/pages/processes/mod.rs:892 #: src/ui/pages/processes/mod.rs:945 src/ui/pages/processes/mod.rs:998 #: src/utils/app.rs:689 src/utils/app.rs:765 src/utils/battery.rs:144 #: src/utils/drive.rs:90 src/utils/gpu/mod.rs:258 src/utils/gpu/mod.rs:264 msgid "N/A" msgstr "N/A" #: src/ui/pages/applications/mod.rs:153 data/resources/ui/window.ui:65 #: data/resources/ui/window.ui:72 #: data/resources/ui/dialogs/settings_dialog.ui:127 msgid "Apps" msgstr "ऐप्स" #: src/ui/pages/applications/mod.rs:571 msgid "Running Apps: {}" msgstr "चालू ऐप्स: {}" #: src/ui/pages/applications/mod.rs:597 src/ui/pages/processes/mod.rs:572 msgid "Cancel" msgstr "रद्द करें" #: src/ui/pages/applications/mod.rs:624 msgid "App" msgstr "ऐप" #: src/ui/pages/applications/mod.rs:716 src/ui/pages/cpu.rs:149 #: src/ui/pages/processes/mod.rs:771 src/ui/window.rs:332 #: data/resources/ui/window.ui:127 data/resources/ui/window.ui:134 #: data/resources/ui/dialogs/app_dialog.ui:77 #: data/resources/ui/dialogs/process_dialog.ui:59 #: data/resources/ui/dialogs/settings_dialog.ui:138 #: data/resources/ui/dialogs/settings_dialog.ui:209 msgid "Processor" msgstr "प्रोसेसर" #: src/ui/pages/applications/mod.rs:766 src/ui/pages/processes/mod.rs:821 #: data/resources/ui/dialogs/app_dialog.ui:95 #: data/resources/ui/dialogs/process_dialog.ui:73 #: data/resources/ui/dialogs/settings_dialog.ui:143 #: data/resources/ui/dialogs/settings_dialog.ui:214 msgid "Drive Read" msgstr "ड्राइव पठित" #: src/ui/pages/applications/mod.rs:817 src/ui/pages/processes/mod.rs:874 #: data/resources/ui/dialogs/app_dialog.ui:104 #: data/resources/ui/dialogs/process_dialog.ui:82 #: data/resources/ui/dialogs/settings_dialog.ui:148 #: data/resources/ui/dialogs/settings_dialog.ui:219 msgid "Drive Read Total" msgstr "कुल ड्राइव पठित" #: src/ui/pages/applications/mod.rs:864 src/ui/pages/processes/mod.rs:927 #: data/resources/ui/dialogs/app_dialog.ui:113 #: data/resources/ui/dialogs/process_dialog.ui:91 #: data/resources/ui/dialogs/settings_dialog.ui:153 #: data/resources/ui/dialogs/settings_dialog.ui:224 msgid "Drive Write" msgstr "ड्राइव लिखित" #: src/ui/pages/applications/mod.rs:917 src/ui/pages/processes/mod.rs:980 #: data/resources/ui/dialogs/app_dialog.ui:122 #: data/resources/ui/dialogs/process_dialog.ui:100 #: data/resources/ui/dialogs/settings_dialog.ui:158 #: data/resources/ui/dialogs/settings_dialog.ui:229 msgid "Drive Write Total" msgstr "कुल ड्राइव लिखित" #: src/ui/pages/applications/mod.rs:1010 src/ui/pages/processes/mod.rs:1077 #: data/resources/ui/dialogs/app_dialog.ui:153 #: data/resources/ui/dialogs/process_dialog.ui:131 #: data/resources/ui/dialogs/settings_dialog.ui:173 #: data/resources/ui/dialogs/settings_dialog.ui:244 msgid "Video Encoder" msgstr "वीडियो एनकोडर" #: src/ui/pages/applications/mod.rs:1057 src/ui/pages/processes/mod.rs:1124 #: data/resources/ui/dialogs/app_dialog.ui:162 #: data/resources/ui/dialogs/process_dialog.ui:140 #: data/resources/ui/dialogs/settings_dialog.ui:178 #: data/resources/ui/dialogs/settings_dialog.ui:249 msgid "Video Decoder" msgstr "वीडियो डिकोडर" #: src/ui/pages/applications/mod.rs:1103 src/ui/pages/processes/mod.rs:1171 #: data/resources/ui/dialogs/app_dialog.ui:144 #: data/resources/ui/dialogs/process_dialog.ui:122 #: data/resources/ui/dialogs/settings_dialog.ui:168 #: data/resources/ui/dialogs/settings_dialog.ui:239 msgid "Video Memory" msgstr "वीडियो मेमोरी" #: src/ui/pages/applications/mod.rs:1147 src/ui/pages/processes/mod.rs:1354 msgid "End {}?" msgstr "{} को समाप्त करें?" #: src/ui/pages/applications/mod.rs:1148 src/ui/pages/processes/mod.rs:1355 msgid "Halt {}?" msgstr "{} को रोकें?" #: src/ui/pages/applications/mod.rs:1149 src/ui/pages/processes/mod.rs:1356 msgid "Kill {}?" msgstr "{} को खत्म करें?" #: src/ui/pages/applications/mod.rs:1150 src/ui/pages/processes/mod.rs:1357 msgid "Continue {}?" msgstr "{} को जारी रखें?" #: src/ui/pages/applications/mod.rs:1156 src/ui/pages/processes/mod.rs:1363 msgid "Unsaved work might be lost." msgstr "सहेजा न गया काम खो सकता है।" #: src/ui/pages/applications/mod.rs:1157 msgid "" "Halting an app can come with serious risks such as losing data and security " "implications. Use with caution." msgstr "" "किसी ऐप को रोकने से डेटा खोने और सुरक्षा निहितार्थ जैसे गंभीर जोखिम आ सकते हैं। सावधानी से " "प्रयोग करें।" #: src/ui/pages/applications/mod.rs:1158 msgid "" "Killing an app can come with serious risks such as losing data and security " "implications. Use with caution." msgstr "" "किसी ऐप को खत्म करने से डेटा खोने और सुरक्षा निहितार्थ जैसे गंभीर जोखिम आ सकते हैं। " "सावधानी से प्रयोग करें।" #: src/ui/pages/applications/mod.rs:1165 #: data/resources/ui/pages/applications.ui:97 msgid "End App" msgstr "ऐप समाप्त करें" #: src/ui/pages/applications/mod.rs:1166 #: data/resources/ui/pages/applications.ui:10 msgid "Halt App" msgstr "ऐप रोकें" #: src/ui/pages/applications/mod.rs:1167 #: data/resources/ui/pages/applications.ui:6 msgid "Kill App" msgstr "ऐप खत्म करें" #: src/ui/pages/applications/mod.rs:1168 #: data/resources/ui/pages/applications.ui:14 msgid "Continue App" msgstr "ऐप जारी रखें" #: src/ui/pages/battery.rs:136 src/ui/pages/drive.rs:157 msgid "Drive" msgstr "ड्राइव" #: src/ui/pages/battery.rs:228 msgid "Battery Charge" msgstr "बैटरी चार्ज" #: src/ui/pages/battery.rs:235 data/resources/ui/pages/gpu.ui:55 msgid "Power Usage" msgstr "ऊर्जा उपयोग" #: src/ui/pages/battery.rs:293 src/ui/pages/drive.rs:349 #: src/ui/pages/drive.rs:379 src/ui/pages/network.rs:333 #: src/ui/pages/network.rs:367 msgid "Highest:" msgstr "उच्चतम:" #: src/ui/pages/cpu.rs:236 src/ui/pages/gpu.rs:222 msgid "Total Usage" msgstr "कुल उपयोग" #: src/ui/pages/cpu.rs:251 src/ui/pages/cpu.rs:368 src/ui/pages/cpu.rs:372 msgid "CPU {}" msgstr "सीपीयू {}" #: src/ui/pages/drive.rs:251 msgid "Drive Activity" msgstr "ड्राइव गतिविधि" #: src/ui/pages/drive.rs:258 msgid "Read Speed" msgstr "पठन गति" #: src/ui/pages/drive.rs:262 msgid "Write Speed" msgstr "लेखन गति" #: src/ui/pages/drive.rs:416 src/ui/pages/drive.rs:426 msgid "Yes" msgstr "हां" #. Translators: This is an abbreviation for "Read" and "Write". This is displayed in the sidebar so your #. translation should preferably be quite short or an abbreviation #: src/ui/pages/drive.rs:438 msgid "R: {} · W: {}" msgstr "प: {} · लि: {}" #: src/ui/pages/gpu.rs:230 msgid "Video Encoder/Decoder Usage" msgstr "वीडियो एनकोडर/डिकोडर का उपयोग" #: src/ui/pages/gpu.rs:236 msgid "Video Encoder Usage" msgstr "वीडियो एनकोडर उपयोग" #: src/ui/pages/gpu.rs:241 msgid "Video Decoder Usage" msgstr "वीडियो डिकोडर उपयोग" #: src/ui/pages/gpu.rs:246 msgid "Video Memory Usage" msgstr "वीडियो मेमोरी उपयोग" #: src/ui/pages/gpu.rs:409 msgid "VRAM: {}" msgstr "वीआरएएम: {}" #: src/ui/pages/memory.rs:211 msgid "Swap" msgstr "स्वैप" #: src/ui/pages/memory.rs:275 msgid "{} of {}" msgstr "{} का {}" #: src/ui/pages/memory.rs:278 msgid "{} MT/s" msgstr "{} MT/s" #. Translators: This will be displayed in the sidebar, so your translation for "Swap" should #. preferably be quite short or an abbreviation #: src/ui/pages/memory.rs:352 msgid "{} / {} · Swap: {} %" msgstr "{} / {} · स्वैप: {} %" #: src/ui/pages/network.rs:149 src/utils/network.rs:128 msgid "Network Interface" msgstr "नेटवर्क इंटरफेस" #: src/ui/pages/network.rs:245 msgid "Receiving" msgstr "प्राप्ति" #: src/ui/pages/network.rs:249 msgid "Sending" msgstr "भेजना" #. Translators: This is an abbreviation for "Receive" and "Send". This is displayed in the sidebar so #. your translation should preferably be quite short or an abbreviation #: src/ui/pages/network.rs:390 msgid "R: {} · S: {}" msgstr "प्रा: {} · भे: {}" #: src/ui/pages/processes/mod.rs:157 data/resources/ui/window.ui:96 #: data/resources/ui/window.ui:103 #: data/resources/ui/dialogs/settings_dialog.ui:188 msgid "Processes" msgstr "प्रक्रियाएं" #: src/ui/pages/processes/mod.rs:546 msgid "Running Processes: {}" msgstr "चालू प्रक्रियाएं: {}" #: src/ui/pages/processes/mod.rs:599 msgid "Process" msgstr "प्रक्रिया" #: src/ui/pages/processes/mod.rs:645 #: data/resources/ui/dialogs/process_dialog.ui:181 #: data/resources/ui/dialogs/settings_dialog.ui:194 msgid "Process ID" msgstr "प्रक्रिया आईडी" #: src/ui/pages/processes/mod.rs:685 #: data/resources/ui/dialogs/process_dialog.ui:208 #: data/resources/ui/dialogs/settings_dialog.ui:199 msgid "User" msgstr "उपयोक्ता" #: src/ui/pages/processes/mod.rs:1217 #: data/resources/ui/dialogs/process_dialog.ui:149 #: data/resources/ui/dialogs/settings_dialog.ui:254 msgid "Total CPU Time" msgstr "कुल सीपीयू समय" #: src/ui/pages/processes/mod.rs:1263 #: data/resources/ui/dialogs/process_dialog.ui:158 #: data/resources/ui/dialogs/settings_dialog.ui:259 msgid "User CPU Time" msgstr "उपयोक्ता सीपीयू समय" #: src/ui/pages/processes/mod.rs:1309 #: data/resources/ui/dialogs/process_dialog.ui:167 #: data/resources/ui/dialogs/settings_dialog.ui:264 msgid "System CPU Time" msgstr "सिस्टम सीपीयू समय" #: src/ui/pages/processes/mod.rs:1364 msgid "" "Halting a process can come with serious risks such as losing data and " "security implications. Use with caution." msgstr "" "किसी प्रक्रिया को रोकने से डेटा खोने और सुरक्षा निहितार्थ जैसे गंभीर जोखिम आ सकते हैं। " "सावधानी से प्रयोग करें।" #: src/ui/pages/processes/mod.rs:1365 msgid "" "Killing a process can come with serious risks such as losing data and " "security implications. Use with caution." msgstr "" "किसी प्रक्रिया को खत्म करने से डेटा खोने और सुरक्षा निहितार्थ जैसे गंभीर जोखिम आ सकते हैं। " "सावधानी से प्रयोग करें।" #: src/ui/pages/processes/mod.rs:1372 data/resources/ui/pages/processes.ui:97 msgid "End Process" msgstr "प्रक्रिया समाप्त करें" #: src/ui/pages/processes/mod.rs:1373 data/resources/ui/pages/processes.ui:10 msgid "Halt Process" msgstr "प्रक्रिया रोकें" #: src/ui/pages/processes/mod.rs:1374 data/resources/ui/pages/processes.ui:6 msgid "Kill Process" msgstr "प्रक्रिया खत्म करें" #: src/ui/pages/processes/mod.rs:1375 data/resources/ui/pages/processes.ui:14 msgid "Continue Process" msgstr "प्रक्रिया जारी रखें" #: src/ui/window.rs:284 msgid "GPU {}" msgstr "जीपीयू {}" #: src/ui/window.rs:884 msgid "Successfully ended {}" msgstr "{} को सफलतापूर्वक समाप्त किया" #: src/ui/window.rs:885 msgid "Successfully halted {}" msgstr "{} को सफलतापूर्वक रोका गया" #: src/ui/window.rs:886 msgid "Successfully killed {}" msgstr "{} को सफलतापूर्वक खत्म किया" #: src/ui/window.rs:887 msgid "Successfully continued {}" msgstr "{} को सफलतापूर्वक जारी रखा" #: src/ui/window.rs:894 msgid "There was a problem ending a process" msgid_plural "There were problems ending {} processes" msgstr[0] "एक प्रक्रिया को समाप्त करने में समस्या हुई" msgstr[1] "{} प्रक्रियाओं को समाप्त करने में समस्याएं हुई" #: src/ui/window.rs:900 msgid "There was a problem halting a process" msgid_plural "There were problems halting {} processes" msgstr[0] "एक प्रक्रिया को रोकने में समस्या हुई" msgstr[1] "{} प्रक्रियाओं को रोकने में समस्याएं हुई" #: src/ui/window.rs:906 msgid "There was a problem killing a process" msgid_plural "There were problems killing {} processes" msgstr[0] "एक प्रक्रिया को खत्म करने में समस्या हुई" msgstr[1] "{} प्रक्रियाओं को बंद करने में समस्याएं हुई" #: src/ui/window.rs:912 msgid "There was a problem continuing a process" msgid_plural "There were problems continuing {} processes" msgstr[0] "एक प्रक्रिया जारी रखने में समस्या हुई" msgstr[1] "{} प्रक्रियाओं को जारी रखने में समस्याएं हुई" #: src/ui/window.rs:922 msgid "There was a problem ending {}" msgstr "{} को समाप्त करने में एक समस्या हुई" #: src/ui/window.rs:923 msgid "There was a problem halting {}" msgstr "{} को रोकने करने में एक समस्या हुई" #: src/ui/window.rs:924 msgid "There was a problem killing {}" msgstr "{} को खत्म करने में एक समस्या हुई" #: src/ui/window.rs:925 msgid "There was a problem continuing {}" msgstr "{} को जारी रहने रखने में एक समस्या हुई" #: src/utils/app.rs:771 msgid "System Processes" msgstr "सिस्टम प्रक्रियाएं" #: src/utils/battery.rs:80 msgid "Charging" msgstr "चार्ज हो रहा है" #: src/utils/battery.rs:81 msgid "Discharging" msgstr "डिस्चार्ज हो रहा है" #: src/utils/battery.rs:82 msgid "Empty" msgstr "खाली" #: src/utils/battery.rs:83 msgid "Full" msgstr "पूर्ण" #: src/utils/battery.rs:84 msgid "Unknown" msgstr "अज्ञात" #: src/utils/battery.rs:135 msgid "Nickel-Metal Hydride" msgstr "निकल-धातु हाइड्राइड" #: src/utils/battery.rs:136 msgid "Nickel-Cadmium" msgstr "निकल-कैडमियम" #: src/utils/battery.rs:137 msgid "Nickel-Zinc" msgstr "निकल-जिंक" #: src/utils/battery.rs:138 msgid "Lead-Acid" msgstr "लैड-एसिड" #: src/utils/battery.rs:139 msgid "Lithium-Ion" msgstr "लिथियम-आयन" #: src/utils/battery.rs:140 msgid "Lithium Iron Phosphate" msgstr "लिथियम आयरन फॉस्फेट" #: src/utils/battery.rs:141 msgid "Lithium Polymer" msgstr "लिथियम पॉलिमर" #: src/utils/battery.rs:143 msgid "Rechargeable Alkaline Managanese" msgstr "रिचार्जेबल अल्कलाइन मैंगनीज" #: src/utils/battery.rs:239 msgid "{} Battery" msgstr "{} बैटरी" #: src/utils/battery.rs:241 msgid "Battery" msgstr "बैटरी" #: src/utils/drive.rs:82 src/utils/drive.rs:153 msgid "CD/DVD/Blu-ray Drive" msgstr "सीडी/डीवीडी/ब्लू-रे ड्राइव" #: src/utils/drive.rs:83 msgid "eMMC Storage" msgstr "eMMC स्टोरेज" #: src/utils/drive.rs:84 msgid "Flash Storage" msgstr "फ़्लैश स्टोरेज" #: src/utils/drive.rs:85 src/utils/drive.rs:154 msgid "Floppy Drive" msgstr "फ़्लॉपी ड्राइव" #: src/utils/drive.rs:86 msgid "Hard Disk Drive" msgstr "हार्ड डिस्क ड्राइव" #: src/utils/drive.rs:87 msgid "Loop Device" msgstr "लूप उपकरण" #: src/utils/drive.rs:88 msgid "Mapped Device" msgstr "मैप किये गये उपकरण" #: src/utils/drive.rs:89 msgid "NVMe Drive" msgstr "NVMe ड्राइव" #: src/utils/drive.rs:91 msgid "Software Raid" msgstr "सॉफ्टवेयर रैड" #: src/utils/drive.rs:92 msgid "RAM Disk" msgstr "रैम डिस्क" #: src/utils/drive.rs:93 msgid "Solid State Drive" msgstr "सॉलिड स्टेट ड्राइव" #: src/utils/drive.rs:94 msgid "ZFS Volume" msgstr "जेडएफएस वॉल्यूम" #: src/utils/drive.rs:95 msgid "Compressed RAM Disk (zram)" msgstr "संपीड़ित रैम डिस्क (zram)" #: src/utils/drive.rs:155 msgid "{} Loop Device" msgstr "{} लूप उपकरण" #: src/utils/drive.rs:156 msgid "{} Mapped Device" msgstr "{} मैप किया गया उपकरण" #: src/utils/drive.rs:157 msgid "{} RAID" msgstr "{} रैड" #: src/utils/drive.rs:158 msgid "{} RAM Disk" msgstr "{} रैम डिस्क" #: src/utils/drive.rs:159 msgid "{} zram Device" msgstr "{} zram उपकरण" #: src/utils/drive.rs:160 msgid "{} ZFS Volume" msgstr "{} जेडएफएस वॉल्यूम" #: src/utils/drive.rs:161 msgid "{} Drive" msgstr "{} ड्राइव" #: src/utils/network.rs:116 msgid "Bluetooth Tether" msgstr "ब्लूटूथ टेदर" #: src/utils/network.rs:117 msgid "Network Bridge" msgstr "नेटवर्क ब्रिज" #: src/utils/network.rs:118 msgid "Ethernet Connection" msgstr "ईथरनेट कनेक्शन" #: src/utils/network.rs:119 msgid "Docker Bridge" msgstr "डॉकर ब्रिज" #: src/utils/network.rs:120 msgid "InfiniBand Connection" msgstr "इनफिनीबैंड कनेक्शन" #: src/utils/network.rs:121 msgid "Serial Line IP Connection" msgstr "सीरियल लाइन IP कनेक्शन" #: src/utils/network.rs:122 msgid "Virtual Ethernet Device" msgstr "वर्चुअल ईथरनेट उपकरण" #: src/utils/network.rs:123 msgid "VM Network Bridge" msgstr "वीएम नेटवर्क ब्रिज" #: src/utils/network.rs:124 msgid "VPN Tunnel" msgstr "वीपीएन टनल" #: src/utils/network.rs:125 msgid "VPN Tunnel (WireGuard)" msgstr "वीपीएन टनल (वायरगार्ड)" #: src/utils/network.rs:126 msgid "Wi-Fi Connection" msgstr "वाई-फाई कनेक्शन" #: src/utils/network.rs:127 msgid "WWAN Connection" msgstr "डब्ल्यूडब्ल्यूएएन कनेक्शन" #: src/utils/units.rs:59 msgid "{} K" msgstr "{} K" #: src/utils/units.rs:61 msgid "{} °C" msgstr "{} °C" #: src/utils/units.rs:63 msgid "{} °F" msgstr "{} °F" #: src/utils/units.rs:81 src/utils/units.rs:95 src/utils/units.rs:115 #: src/utils/units.rs:129 msgid "{} B" msgstr "{} B" #: src/utils/units.rs:82 src/utils/units.rs:96 msgid "{} kB" msgstr "{} kB" #: src/utils/units.rs:83 src/utils/units.rs:97 msgid "{} MB" msgstr "{} MB" #: src/utils/units.rs:84 src/utils/units.rs:98 msgid "{} GB" msgstr "{} GB" #: src/utils/units.rs:85 src/utils/units.rs:99 msgid "{} TB" msgstr "{} TB" #: src/utils/units.rs:86 src/utils/units.rs:100 msgid "{} PB" msgstr "{} PB" #: src/utils/units.rs:87 src/utils/units.rs:101 msgid "{} EB" msgstr "{} EB" #: src/utils/units.rs:88 src/utils/units.rs:102 msgid "{} ZB" msgstr "{} ZB" #: src/utils/units.rs:89 src/utils/units.rs:103 msgid "{} YB" msgstr "{} YB" #: src/utils/units.rs:90 src/utils/units.rs:104 msgid "{} RB" msgstr "{} RB" #: src/utils/units.rs:91 src/utils/units.rs:105 msgid "{} QB" msgstr "{} QB" #: src/utils/units.rs:116 src/utils/units.rs:130 msgid "{} KiB" msgstr "{} KiB" #: src/utils/units.rs:117 src/utils/units.rs:131 msgid "{} MiB" msgstr "{} MiB" #: src/utils/units.rs:118 src/utils/units.rs:132 msgid "{} GiB" msgstr "{} GiB" #: src/utils/units.rs:119 src/utils/units.rs:133 msgid "{} TiB" msgstr "{} TiB" #: src/utils/units.rs:120 src/utils/units.rs:134 msgid "{} PiB" msgstr "{} PiB" #: src/utils/units.rs:121 src/utils/units.rs:135 msgid "{} EiB" msgstr "{} EiB" #: src/utils/units.rs:122 src/utils/units.rs:136 msgid "{} ZiB" msgstr "{} ZiB" #: src/utils/units.rs:123 src/utils/units.rs:137 msgid "{} YiB" msgstr "{} YiB" #: src/utils/units.rs:124 src/utils/units.rs:138 msgid "{} RiB" msgstr "{} RiB" #: src/utils/units.rs:125 src/utils/units.rs:139 msgid "{} QiB" msgstr "{} QiB" #: src/utils/units.rs:166 src/utils/units.rs:183 msgid "{} B/s" msgstr "{} B/s" #: src/utils/units.rs:167 msgid "{} kB/s" msgstr "{} kB/s" #: src/utils/units.rs:168 msgid "{} MB/s" msgstr "{} MB/s" #: src/utils/units.rs:169 msgid "{} GB/s" msgstr "{} GB/s" #: src/utils/units.rs:170 msgid "{} TB/s" msgstr "{} TB/s" #: src/utils/units.rs:171 msgid "{} PB/s" msgstr "{} PB/s" #: src/utils/units.rs:172 msgid "{} EB/s" msgstr "{} EB/s" #: src/utils/units.rs:173 msgid "{} ZB/s" msgstr "{} ZB/s" #: src/utils/units.rs:174 msgid "{} YB/s" msgstr "{} YB/s" #: src/utils/units.rs:175 msgid "{} RB/s" msgstr "{} RB/s" #: src/utils/units.rs:176 msgid "{} QB/s" msgstr "{} QB/s" #: src/utils/units.rs:184 msgid "{} KiB/s" msgstr "{} KiB/s" #: src/utils/units.rs:185 msgid "{} MiB/s" msgstr "{} MiB/s" #: src/utils/units.rs:186 msgid "{} GiB/s" msgstr "{} GiB/s" #: src/utils/units.rs:187 msgid "{} TiB/s" msgstr "{} TiB/s" #: src/utils/units.rs:188 msgid "{} PiB/s" msgstr "{} PiB/s" #: src/utils/units.rs:189 msgid "{} EiB/s" msgstr "{} EiB/s" #: src/utils/units.rs:190 msgid "{} ZiB/s" msgstr "{} ZiB/s" #: src/utils/units.rs:191 msgid "{} YiB/s" msgstr "{} YiB/s" #: src/utils/units.rs:192 msgid "{} RiB/s" msgstr "{} RiB/s" #: src/utils/units.rs:193 msgid "{} QiB/s" msgstr "{} QiB/s" #: src/utils/units.rs:200 src/utils/units.rs:217 msgid "{} b/s" msgstr "{} b/s" #: src/utils/units.rs:201 msgid "{} kb/s" msgstr "{} kb/s" #: src/utils/units.rs:202 msgid "{} Mb/s" msgstr "{} Mb/s" #: src/utils/units.rs:203 msgid "{} Gb/s" msgstr "{} Gb/s" #: src/utils/units.rs:204 msgid "{} Tb/s" msgstr "{} Tb/s" #: src/utils/units.rs:205 msgid "{} Pb/s" msgstr "{} Pb/s" #: src/utils/units.rs:206 msgid "{} Eb/s" msgstr "{} Eb/s" #: src/utils/units.rs:207 msgid "{} Zb/s" msgstr "{} Zb/s" #: src/utils/units.rs:208 msgid "{} Yb/s" msgstr "{} Yb/s" #: src/utils/units.rs:209 msgid "{} Rb/s" msgstr "{} Rb/s" #: src/utils/units.rs:210 msgid "{} Qb/s" msgstr "{} Qb/s" #: src/utils/units.rs:218 msgid "{} Kib/s" msgstr "{} Kib/s" #: src/utils/units.rs:219 msgid "{} Mib/s" msgstr "{} Mib/s" #: src/utils/units.rs:220 msgid "{} Gib/s" msgstr "{} Gib/s" #: src/utils/units.rs:221 msgid "{} Tib/s" msgstr "{} Tib/s" #: src/utils/units.rs:222 msgid "{} Pib/s" msgstr "{} Pib/s" #: src/utils/units.rs:223 msgid "{} Eib/s" msgstr "{} Eib/s" #: src/utils/units.rs:224 msgid "{} Zib/s" msgstr "{} Zib/s" #: src/utils/units.rs:225 msgid "{} Yib/s" msgstr "{} Yib/s" #: src/utils/units.rs:226 msgid "{} Rib/s" msgstr "{} Rib/s" #: src/utils/units.rs:227 msgid "{} Qib/s" msgstr "{} Qib/s" #: src/utils/units.rs:234 msgid "{} Hz" msgstr "{} Hz" #: src/utils/units.rs:235 msgid "{} kHz" msgstr "{} kHz" #: src/utils/units.rs:236 msgid "{} MHz" msgstr "{} MHz" #: src/utils/units.rs:237 msgid "{} GHz" msgstr "{} GHz" #: src/utils/units.rs:238 msgid "{} THz" msgstr "{} THz" #: src/utils/units.rs:239 msgid "{} PHz" msgstr "{} PHz" #: src/utils/units.rs:240 msgid "{} EHz" msgstr "{} EHz" #: src/utils/units.rs:241 msgid "{} ZHz" msgstr "{} ZHz" #: src/utils/units.rs:242 msgid "{} YHz" msgstr "{} YHz" #: src/utils/units.rs:243 msgid "{} RHz" msgstr "{} RHz" #: src/utils/units.rs:244 msgid "{} QHz" msgstr "{} QHz" #: src/utils/units.rs:251 msgid "{} W" msgstr "{} W" #: src/utils/units.rs:252 msgid "{} kW" msgstr "{} kW" #: src/utils/units.rs:253 msgid "{} MW" msgstr "{} MW" #: src/utils/units.rs:254 msgid "{} GW" msgstr "{} GW" #: src/utils/units.rs:255 msgid "{} TW" msgstr "{} TW" #: src/utils/units.rs:256 msgid "{} PW" msgstr "{} PW" #: src/utils/units.rs:257 msgid "{} EW" msgstr "{} EW" #: src/utils/units.rs:258 msgid "{} ZW" msgstr "{} ZW" #: src/utils/units.rs:259 msgid "{} YW" msgstr "{} YW" #: src/utils/units.rs:260 msgid "{} RW" msgstr "{} RW" #: src/utils/units.rs:261 msgid "{} QW" msgstr "{} QW" #: src/utils/units.rs:270 src/utils/units.rs:284 msgid "{} Wh" msgstr "{} Wh" #: src/utils/units.rs:271 src/utils/units.rs:285 msgid "{} kWh" msgstr "{} kWh" #: src/utils/units.rs:272 src/utils/units.rs:286 msgid "{} MWh" msgstr "{} MWh" #: src/utils/units.rs:273 src/utils/units.rs:287 msgid "{} GWh" msgstr "{} GWh" #: src/utils/units.rs:274 src/utils/units.rs:288 msgid "{} TWh" msgstr "{} TWh" #: src/utils/units.rs:275 src/utils/units.rs:289 msgid "{} PWh" msgstr "{} PWh" #: src/utils/units.rs:276 src/utils/units.rs:290 msgid "{} EWh" msgstr "{} EWh" #: src/utils/units.rs:277 src/utils/units.rs:291 msgid "{} ZWh" msgstr "{} ZWh" #: src/utils/units.rs:278 src/utils/units.rs:292 msgid "{} YWh" msgstr "{} YWh" #: src/utils/units.rs:279 src/utils/units.rs:293 msgid "{} RWh" msgstr "{} RWh" #: src/utils/units.rs:280 src/utils/units.rs:294 msgid "{} QWh" msgstr "{} QWh" #: data/resources/ui/shortcuts.ui:11 msgctxt "shortcut window" msgid "General" msgstr "सामान्य" #: data/resources/ui/shortcuts.ui:14 msgctxt "shortcut window" msgid "Preferences" msgstr "प्राथमिकताएं" #: data/resources/ui/shortcuts.ui:20 msgctxt "shortcut window" msgid "Show Shortcuts" msgstr "शॉर्टकट दिखाएं" #: data/resources/ui/shortcuts.ui:26 msgctxt "shortcut window" msgid "Quit" msgstr "बंद करें" #: data/resources/ui/shortcuts.ui:32 msgctxt "shortcut window" msgid "Toggle Search Field" msgstr "खोज क्षेत्र टॉगल करें" #: data/resources/ui/shortcuts.ui:38 msgctxt "shortcut window" msgid "End App/Process" msgstr "ऐप/प्रक्रिया समाप्त करें" #: data/resources/ui/shortcuts.ui:44 msgctxt "shortcut window" msgid "Kill App/Process" msgstr "ऐप/प्रक्रिया खत्म करें" #: data/resources/ui/shortcuts.ui:50 msgctxt "shortcut window" msgid "Halt App/Process" msgstr "ऐप/प्रक्रिया रोकें" #: data/resources/ui/shortcuts.ui:56 msgctxt "shortcut window" msgid "Continue App/Process" msgstr "ऐप/प्रक्रिया जारी रखें" #: data/resources/ui/shortcuts.ui:62 msgctxt "shortcut window" msgid "Show Information for App/Process" msgstr "ऐप/प्रक्रिया के लिए जानकारी दिखाएं" #: data/resources/ui/window.ui:6 msgid "Preferences" msgstr "प्राथमिकताएं" #: data/resources/ui/window.ui:10 msgid "Keyboard Shortcuts" msgstr "कीबोर्ड शॉर्टकट" #: data/resources/ui/window.ui:14 msgid "About Resources" msgstr "रिसोर्सेज के बारे में" #: data/resources/ui/dialogs/app_dialog.ui:7 msgid "App Information" msgstr "ऐप जानकारी" #: data/resources/ui/dialogs/app_dialog.ui:74 #: data/resources/ui/dialogs/process_dialog.ui:52 #: data/resources/ui/pages/battery.ui:22 data/resources/ui/pages/cpu.ui:37 #: data/resources/ui/pages/cpu.ui:50 data/resources/ui/pages/drive.ui:22 #: data/resources/ui/pages/gpu.ui:22 data/resources/ui/pages/memory.ui:31 #: data/resources/ui/pages/network.ui:22 msgid "Usage" msgstr "उपयोग" #: data/resources/ui/dialogs/app_dialog.ui:169 #: data/resources/ui/dialogs/process_dialog.ui:174 #: data/resources/ui/pages/battery.ui:33 data/resources/ui/pages/cpu.ui:89 #: data/resources/ui/pages/drive.ui:54 data/resources/ui/pages/gpu.ui:80 #: data/resources/ui/pages/memory.ui:42 data/resources/ui/pages/network.ui:51 msgid "Properties" msgstr "प्रॉपर्टी" #: data/resources/ui/dialogs/app_dialog.ui:175 msgid "ID" msgstr "आईडी" #: data/resources/ui/dialogs/app_dialog.ui:185 #: data/resources/ui/dialogs/process_dialog.ui:190 msgid "Running Since" msgstr "तब से चालू" #: data/resources/ui/dialogs/app_dialog.ui:193 msgid "Running Processes" msgstr "चालू प्रक्रियाएं" #: data/resources/ui/dialogs/app_dialog.ui:202 #: data/resources/ui/dialogs/process_dialog.ui:226 msgid "Containerized" msgstr "कंटेनरीकृत" #: data/resources/ui/dialogs/process_dialog.ui:7 msgid "Process Information" msgstr "प्रक्रिया जानकारी" #: data/resources/ui/dialogs/process_dialog.ui:199 msgid "Commandline" msgstr "कमांडलाइन" #: data/resources/ui/dialogs/process_dialog.ui:217 msgid "Control Group" msgstr "नियंत्रण समूह" #: data/resources/ui/dialogs/settings_dialog.ui:7 msgid "General" msgstr "सामान्य" #: data/resources/ui/dialogs/settings_dialog.ui:10 msgid "Units" msgstr "इकाइयां" #: data/resources/ui/dialogs/settings_dialog.ui:13 msgid "Data Unit Prefix" msgstr "डेटा इकाई उपसर्ग" #: data/resources/ui/dialogs/settings_dialog.ui:17 msgid "Decimal" msgstr "दशमलव" #: data/resources/ui/dialogs/settings_dialog.ui:18 msgid "Binary" msgstr "बाइनरी" #: data/resources/ui/dialogs/settings_dialog.ui:26 msgid "Show Network Speeds in Bits per Second" msgstr "बिट्स प्रति सेकंड में नेटवर्क स्पीड दिखाएं" #: data/resources/ui/dialogs/settings_dialog.ui:31 msgid "Temperature Unit" msgstr "तापमान इकाई" #: data/resources/ui/dialogs/settings_dialog.ui:35 msgid "Celsius" msgstr "सेल्सियस" #: data/resources/ui/dialogs/settings_dialog.ui:36 msgid "Kelvin" msgstr "केल्विन" #: data/resources/ui/dialogs/settings_dialog.ui:37 msgid "Fahrenheit" msgstr "फारेनहाइट" #: data/resources/ui/dialogs/settings_dialog.ui:47 msgid "User Interface" msgstr "उपयोक्ता इंटरफेस" #: data/resources/ui/dialogs/settings_dialog.ui:50 msgid "Refresh Speed" msgstr "ताजा करने की गति" #: data/resources/ui/dialogs/settings_dialog.ui:51 msgid "Higher refresh speeds can lead to higher processor usage" msgstr "उच्च ताजा गति से प्रोसेसर का अधिक उपयोग हो सकता है" #: data/resources/ui/dialogs/settings_dialog.ui:55 msgid "Very Slow" msgstr "बहुत धीमा" #: data/resources/ui/dialogs/settings_dialog.ui:56 msgid "Slow" msgstr "धीमा" #: data/resources/ui/dialogs/settings_dialog.ui:57 msgid "Normal" msgstr "सामान्य" #: data/resources/ui/dialogs/settings_dialog.ui:58 msgid "Fast" msgstr "तेज" #: data/resources/ui/dialogs/settings_dialog.ui:59 msgid "Very Fast" msgstr "बहुत तेज" #: data/resources/ui/dialogs/settings_dialog.ui:67 msgid "Show Graph Grids" msgstr "लेखाचित्र ग्रिड दिखाएं" #: data/resources/ui/dialogs/settings_dialog.ui:72 msgid "Graph Data Points" msgstr "लेखाचित्र डेटा बिंदु" #: data/resources/ui/dialogs/settings_dialog.ui:86 msgid "Show Search Fields on Launch" msgstr "शुरू होने पर खोज क्षेत्र दिखाएं" #: data/resources/ui/dialogs/settings_dialog.ui:91 msgid "Show Usage Details in Sidebar" msgstr "पार्श्वपट्टी में उपयोग विवरण दिखाएं" #: data/resources/ui/dialogs/settings_dialog.ui:92 msgid "If enabled, the usage along with other information will be displayed" msgstr "सक्षम होने पर, उपयोग के साथ-साथ अन्य जानकारी भी प्रदर्शित की जाएगी" #: data/resources/ui/dialogs/settings_dialog.ui:97 msgid "Show Device Descriptions in Sidebar" msgstr "पार्श्वपट्टी में उपकरण विवरण दिखाएं" #: data/resources/ui/dialogs/settings_dialog.ui:98 msgid "" "If enabled, a device identifier like its name or device type will be " "displayed" msgstr "" "सक्षम होने पर, उपकरण पहचानकर्ता जैसे उसका नाम या उपकरण प्रकार प्रदर्शित किया जाएगा" #: data/resources/ui/dialogs/settings_dialog.ui:103 msgid "Sidebar Meter Type" msgstr "पार्श्वपट्टी मीटर प्रकार" #: data/resources/ui/dialogs/settings_dialog.ui:107 msgid "Bar" msgstr "पट्टी" #: data/resources/ui/dialogs/settings_dialog.ui:108 msgid "Graph" msgstr "लेखाचित्र" #: data/resources/ui/dialogs/settings_dialog.ui:116 msgid "Normalize Processor Usage" msgstr "सामान्यीकृत प्रोसेसर उपयोग" #: data/resources/ui/dialogs/settings_dialog.ui:117 msgid "" "If enabled, the total usage of all cores will be divided by the amount of " "cores" msgstr "सक्षम होने पर, सभी कोर का कुल उपयोग कोर की मात्रा से विभाजित किया जाएगा" #: data/resources/ui/dialogs/settings_dialog.ui:130 #: data/resources/ui/dialogs/settings_dialog.ui:191 msgid "Information Columns" msgstr "सूचना कॉलम" #: data/resources/ui/dialogs/settings_dialog.ui:274 msgid "Devices" msgstr "उपकरण" #: data/resources/ui/dialogs/settings_dialog.ui:277 msgid "Drives" msgstr "ड्राइव" #: data/resources/ui/dialogs/settings_dialog.ui:280 msgid "Show Virtual Drives" msgstr "वर्चुअल ड्राइव दिखाएं" #: data/resources/ui/dialogs/settings_dialog.ui:281 msgid "Virtual drives are for example ZFS volumes or mapped devices" msgstr "वर्चुअल ड्राइव उदाहरण के लिए जेडएफएस वॉल्यूम या मैप किए गए उपकरण हैं" #: data/resources/ui/dialogs/settings_dialog.ui:291 msgid "Show Virtual Network Interfaces" msgstr "वर्चुअल नेटवर्क इंटरफेस दिखाएं" #: data/resources/ui/dialogs/settings_dialog.ui:292 msgid "Virtual network interfaces are for example bridges or VPN tunnels" msgstr "वर्चुअल नेटवर्क इंटरफेस उदाहरण ब्रिज या वीपीएन टनल के लिए हैं" #: data/resources/ui/pages/applications.ui:50 msgid "Search applications" msgstr "अनुप्रयोग खोजें" #: data/resources/ui/pages/applications.ui:68 #: data/resources/ui/pages/processes.ui:68 msgid "Search" msgstr "खोजें" #: data/resources/ui/pages/applications.ui:70 #: data/resources/ui/pages/processes.ui:70 msgid "Toggle search field" msgstr "खोज क्षेत्र टॉगल करें" #: data/resources/ui/pages/applications.ui:86 #: data/resources/ui/pages/applications.ui:88 msgid "Show App Information" msgstr "ऐप जानकारी दिखाएं" #: data/resources/ui/pages/battery.ui:36 msgid "Battery Health" msgstr "बैटरी स्वास्थ्य" #: data/resources/ui/pages/battery.ui:45 msgid "Design Capacity" msgstr "डिज़ाइन क्षमता" #: data/resources/ui/pages/battery.ui:54 msgid "Charge Cycles" msgstr "चार्ज चक्र" #: data/resources/ui/pages/battery.ui:63 msgid "Technology" msgstr "प्रौद्योगिकी" #: data/resources/ui/pages/battery.ui:72 data/resources/ui/pages/gpu.ui:87 #: data/resources/ui/pages/network.ui:58 msgid "Manufacturer" msgstr "उत्पादक" #: data/resources/ui/pages/battery.ui:81 msgid "Model Name" msgstr "मॉडल नाम" #: data/resources/ui/pages/battery.ui:90 data/resources/ui/pages/drive.ui:66 msgid "Device" msgstr "उपकरण" #: data/resources/ui/pages/cpu.ui:22 msgid "Options" msgstr "विकल्प" #: data/resources/ui/pages/cpu.ui:26 msgid "Show Usages of Logical CPUs" msgstr "तार्किक सीपीयू के उपयोग दिखाएं" #: data/resources/ui/pages/cpu.ui:75 data/resources/ui/pages/gpu.ui:66 msgid "Sensors" msgstr "संवेदक" #: data/resources/ui/pages/cpu.ui:82 data/resources/ui/pages/gpu.ui:69 msgid "Temperature" msgstr "तापमान" #: data/resources/ui/pages/cpu.ui:96 msgid "Max Frequency" msgstr "अधि आवृत्ति" #: data/resources/ui/pages/cpu.ui:105 msgid "Logical Cores" msgstr "तार्किक कोर" #: data/resources/ui/pages/cpu.ui:114 msgid "Physical Cores" msgstr "भौतिक कोर" #: data/resources/ui/pages/cpu.ui:123 msgid "Sockets" msgstr "सॉकेट" #: data/resources/ui/pages/cpu.ui:132 msgid "Virtualization" msgstr "आभासीकरण" #: data/resources/ui/pages/cpu.ui:141 msgid "Architecture" msgstr "आर्किटेक्चर" #: data/resources/ui/pages/drive.ui:38 msgid "Total Read" msgstr "कुल पठित" #: data/resources/ui/pages/drive.ui:47 msgid "Total Written" msgstr "कुल लिखित" #: data/resources/ui/pages/drive.ui:57 data/resources/ui/pages/memory.ui:72 msgid "Type" msgstr "प्रकार" #: data/resources/ui/pages/drive.ui:75 msgid "Capacity" msgstr "क्षमता" #: data/resources/ui/pages/drive.ui:84 msgid "Writable" msgstr "लिखने योग्य" #: data/resources/ui/pages/drive.ui:93 msgid "Removable" msgstr "हटाने योग्य" #: data/resources/ui/pages/gpu.ui:37 msgid "GPU Frequency" msgstr "जीपीयू आवृत्ति" #: data/resources/ui/pages/gpu.ui:50 msgid "Video Memory Frequency" msgstr "वीडियो मेमोरी आवृत्ति" #: data/resources/ui/pages/gpu.ui:96 msgid "PCI Slot" msgstr "पीसीआई स्लॉट" #: data/resources/ui/pages/gpu.ui:105 data/resources/ui/pages/network.ui:67 msgid "Driver Used" msgstr "ड्राइवर प्रयुक्त" #: data/resources/ui/pages/gpu.ui:114 msgid "Max Power Cap" msgstr "अधि. ऊर्जा क्षमता" #: data/resources/ui/pages/memory.ui:9 msgid "You need to authenticate to see memory properties" msgstr "मेमोरी प्रॉपर्टी देखने के लिए आपको प्रमाणित करना होगा" #: data/resources/ui/pages/memory.ui:10 msgid "Authenticate" msgstr "प्रमाणीकृत करें" #: data/resources/ui/pages/memory.ui:45 msgid "Slots Used" msgstr "स्लॉट प्रयुक्त" #: data/resources/ui/pages/memory.ui:54 msgid "Speed" msgstr "गति" #: data/resources/ui/pages/memory.ui:63 msgid "Form Factor" msgstr "स्वरुप कारक" #: data/resources/ui/pages/memory.ui:81 msgid "Type Detail" msgstr "प्रकार विवरण" #: data/resources/ui/pages/network.ui:35 msgid "Total Received" msgstr "कुल प्राप्त" #: data/resources/ui/pages/network.ui:44 msgid "Total Sent" msgstr "कुल प्रेषित" #: data/resources/ui/pages/network.ui:76 msgid "Interface" msgstr "इंटरफेस" #: data/resources/ui/pages/network.ui:85 msgid "Hardware Address" msgstr "हार्डवेयर पता" #: data/resources/ui/pages/processes.ui:50 msgid "Search processes" msgstr "प्रक्रियाएं खोजें" #: data/resources/ui/pages/processes.ui:86 #: data/resources/ui/pages/processes.ui:88 msgid "Show Process Information" msgstr "प्रक्रिया जानकारी दिखाएं" resources-1.9.1/po/hu.po000066400000000000000000001443701510634446000151420ustar00rootroot00000000000000# Hungarian translation for resources. # Copyright (C) 2025 Free Software Foundation, Inc. # This file is distributed under the same license as the resources package. # # Balázs Meskó , 2025. # Balázs Úr , 2025. msgid "" msgstr "" "Project-Id-Version: resources main\n" "Report-Msgid-Bugs-To: https://github.com/nokyan/resources/issues/\n" "POT-Creation-Date: 2025-08-31 15:32+0000\n" "PO-Revision-Date: 2025-09-03 15:25+0200\n" "Last-Translator: Balázs Úr \n" "Language-Team: Hungarian \n" "Language: hu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Lokalize 24.12.3\n" #: data/net.nokyan.Resources.desktop.in.in:2 #: data/net.nokyan.Resources.metainfo.xml.in.in:4 #: data/resources/ui/window.ui:22 src/application.rs:272 msgid "Resources" msgstr "Erőforrások" #. Translators: The summary should be 35 characters or less according to Flathub appstream guidelines #: data/net.nokyan.Resources.desktop.in.in:3 #: data/net.nokyan.Resources.metainfo.xml.in.in:5 msgid "Keep an eye on system resources" msgstr "Tartsa szemmel a rendszer erőforrásait" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/net.nokyan.Resources.desktop.in.in:9 msgid "" "System;Resources;Monitor;Processes;Usage;Task;Manager;CPU;RAM;Memory;GPU;" msgstr "" "Rendszer;Erőforrások;Megfigyelés;Követés;Felügyelet;Folyamatok;Használat;Felad" "atkezelő;CPU;RAM;Memória;GPU;" #: data/net.nokyan.Resources.metainfo.xml.in.in:17 msgid "" "Resources allows you to check the utilization of your system resources and " "control your running processes and apps. It’s designed to be user-friendly " "and feel right at home on a modern desktop by using GNOME’s libadwaita." msgstr "" "Az Erőforrások lehetővé teszi a rendszererőforrások kihasználtságának " "ellenőrzését, valamint a futó folyamatok és alkalmazások vezérlését. Úgy " "tervezték, hogy felhasználóbarát legyen, és a GNOME libadwaita " "programkönyvtárának köszönhetően otthonosan érezze benne magát egy modern " "asztali környezetben." #: data/net.nokyan.Resources.metainfo.xml.in.in:20 msgid "Resources supports monitoring the following components:" msgstr "Az Erőforrások a következő összetevők felügyeletét támogatja:" #: data/net.nokyan.Resources.metainfo.xml.in.in:24 msgid "CPU" msgstr "CPU" #: data/net.nokyan.Resources.metainfo.xml.in.in:25 #: data/resources/ui/dialogs/app_dialog.ui:82 #: data/resources/ui/dialogs/process_dialog.ui:64 #: data/resources/ui/dialogs/settings_dialog.ui:128 #: data/resources/ui/dialogs/settings_dialog.ui:220 #: data/resources/ui/window.ui:176 data/resources/ui/window.ui:183 #: src/ui/pages/applications/mod.rs:803 src/ui/pages/memory.rs:106 #: src/ui/pages/memory.rs:192 src/ui/pages/processes/mod.rs:1079 msgid "Memory" msgstr "Memória" #: data/net.nokyan.Resources.metainfo.xml.in.in:26 #: data/resources/ui/dialogs/app_dialog.ui:140 #: data/resources/ui/dialogs/process_dialog.ui:118 #: data/resources/ui/dialogs/settings_dialog.ui:158 #: data/resources/ui/dialogs/settings_dialog.ui:250 #: src/ui/pages/applications/mod.rs:1181 src/ui/pages/gpu.rs:118 #: src/ui/pages/processes/mod.rs:1469 src/ui/window.rs:468 msgid "GPU" msgstr "GPU" #: data/net.nokyan.Resources.metainfo.xml.in.in:27 #: data/resources/ui/dialogs/settings_dialog.ui:319 msgid "Network Interfaces" msgstr "Hálózati csatolók" #: data/net.nokyan.Resources.metainfo.xml.in.in:28 msgid "Storage Devices" msgstr "Tárolóeszközök" #: data/net.nokyan.Resources.metainfo.xml.in.in:29 msgid "Batteries" msgstr "Akkumulátorok" #: data/net.nokyan.Resources.metainfo.xml.in.in:51 msgid "Apps page in light theme" msgstr "Alkalmazások oldal világos témával" #: data/net.nokyan.Resources.metainfo.xml.in.in:55 msgid "Processes page in dark theme" msgstr "Folyamatok oldal sötét témával" #: data/net.nokyan.Resources.metainfo.xml.in.in:59 msgid "Processor page in light theme" msgstr "Processzor oldal világos témával" #: data/net.nokyan.Resources.metainfo.xml.in.in:63 msgid "Memory page in dark theme" msgstr "Memória oldal sötét témával" #: data/net.nokyan.Resources.metainfo.xml.in.in:67 msgid "GPU page in light theme" msgstr "GPU oldal világos témával" #: data/net.nokyan.Resources.metainfo.xml.in.in:71 msgid "Drive page in dark theme" msgstr "Meghajtó oldal sötét témával" #: data/net.nokyan.Resources.metainfo.xml.in.in:75 msgid "Network Interface page in light theme" msgstr "Hálózati csatoló oldal világos témával" #: data/net.nokyan.Resources.metainfo.xml.in.in:79 msgid "Battery page in dark theme" msgstr "Akkumulátor oldal sötét témával" #: data/net.nokyan.Resources.policy.in.in:9 msgid "Control Process" msgstr "Folyamat vezérlése" #: data/net.nokyan.Resources.policy.in.in:10 msgid "" "Authentication is required to control superuser’s or other users’ processes" msgstr "" "Hitelesítés szükséges a rendszergazda vagy más felhasználók folyamatainak " "vezérléséhez" #: data/resources/ui/dialogs/app_dialog.ui:7 msgid "App Information" msgstr "Alkalmazásinformációk" #: data/resources/ui/dialogs/app_dialog.ui:70 #: data/resources/ui/dialogs/process_dialog.ui:48 #: data/resources/ui/pages/battery.ui:22 data/resources/ui/pages/cpu.ui:37 #: data/resources/ui/pages/cpu.ui:50 data/resources/ui/pages/drive.ui:22 #: data/resources/ui/pages/gpu.ui:22 data/resources/ui/pages/memory.ui:31 #: data/resources/ui/pages/network.ui:22 data/resources/ui/pages/npu.ui:22 msgid "Usage" msgstr "Használat" #: data/resources/ui/dialogs/app_dialog.ui:73 #: data/resources/ui/dialogs/process_dialog.ui:55 #: data/resources/ui/dialogs/settings_dialog.ui:133 #: data/resources/ui/dialogs/settings_dialog.ui:225 #: data/resources/ui/window.ui:145 data/resources/ui/window.ui:152 #: src/ui/pages/applications/mod.rs:862 src/ui/pages/cpu.rs:128 #: src/ui/pages/processes/mod.rs:1138 src/ui/window.rs:290 msgid "Processor" msgstr "Processzor" #: data/resources/ui/dialogs/app_dialog.ui:91 #: data/resources/ui/dialogs/process_dialog.ui:73 #: data/resources/ui/dialogs/settings_dialog.ui:178 #: data/resources/ui/dialogs/settings_dialog.ui:290 #: src/ui/pages/applications/mod.rs:1420 src/ui/pages/memory.rs:198 #: src/ui/pages/processes/mod.rs:1954 msgid "Swap" msgstr "Cserehely" #: data/resources/ui/dialogs/app_dialog.ui:100 #: data/resources/ui/dialogs/process_dialog.ui:78 #: data/resources/ui/dialogs/settings_dialog.ui:138 #: data/resources/ui/dialogs/settings_dialog.ui:230 #: src/ui/pages/applications/mod.rs:926 src/ui/pages/processes/mod.rs:1202 msgid "Drive Read" msgstr "Lemezolvasás" #: data/resources/ui/dialogs/app_dialog.ui:109 #: data/resources/ui/dialogs/process_dialog.ui:87 #: data/resources/ui/dialogs/settings_dialog.ui:143 #: data/resources/ui/dialogs/settings_dialog.ui:235 #: src/ui/pages/applications/mod.rs:991 src/ui/pages/processes/mod.rs:1269 msgid "Drive Read Total" msgstr "Lemezolvasás összesen" #: data/resources/ui/dialogs/app_dialog.ui:118 #: data/resources/ui/dialogs/process_dialog.ui:96 #: data/resources/ui/dialogs/settings_dialog.ui:148 #: data/resources/ui/dialogs/settings_dialog.ui:240 #: src/ui/pages/applications/mod.rs:1052 src/ui/pages/processes/mod.rs:1336 msgid "Drive Write" msgstr "Lemezírás" #: data/resources/ui/dialogs/app_dialog.ui:127 #: data/resources/ui/dialogs/process_dialog.ui:105 #: data/resources/ui/dialogs/settings_dialog.ui:153 #: data/resources/ui/dialogs/settings_dialog.ui:245 #: src/ui/pages/applications/mod.rs:1119 src/ui/pages/processes/mod.rs:1403 msgid "Drive Write Total" msgstr "Lemezírás összesen" #: data/resources/ui/dialogs/app_dialog.ui:149 #: data/resources/ui/dialogs/process_dialog.ui:127 #: data/resources/ui/dialogs/settings_dialog.ui:163 #: data/resources/ui/dialogs/settings_dialog.ui:255 #: src/ui/pages/applications/mod.rs:1361 src/ui/pages/processes/mod.rs:1650 msgid "Video Memory" msgstr "Videomemória" #: data/resources/ui/dialogs/app_dialog.ui:158 #: data/resources/ui/dialogs/process_dialog.ui:136 #: data/resources/ui/dialogs/settings_dialog.ui:168 #: data/resources/ui/dialogs/settings_dialog.ui:260 #: src/ui/pages/applications/mod.rs:1240 src/ui/pages/processes/mod.rs:1528 msgid "Video Encoder" msgstr "Videókódoló" #: data/resources/ui/dialogs/app_dialog.ui:167 #: data/resources/ui/dialogs/process_dialog.ui:145 #: data/resources/ui/dialogs/settings_dialog.ui:173 #: data/resources/ui/dialogs/settings_dialog.ui:265 #: src/ui/pages/applications/mod.rs:1301 src/ui/pages/processes/mod.rs:1589 msgid "Video Decoder" msgstr "Videódekódoló" #: data/resources/ui/dialogs/app_dialog.ui:174 #: data/resources/ui/dialogs/process_dialog.ui:179 #: data/resources/ui/pages/battery.ui:33 data/resources/ui/pages/cpu.ui:83 #: data/resources/ui/pages/drive.ui:54 data/resources/ui/pages/gpu.ui:74 #: data/resources/ui/pages/memory.ui:42 data/resources/ui/pages/network.ui:51 #: data/resources/ui/pages/npu.ui:68 msgid "Properties" msgstr "Tulajdonságok" #: data/resources/ui/dialogs/app_dialog.ui:180 msgid "ID" msgstr "Azonosító" #: data/resources/ui/dialogs/app_dialog.ui:190 #: data/resources/ui/dialogs/process_dialog.ui:195 msgid "Running Since" msgstr "Futás kezdete" #: data/resources/ui/dialogs/app_dialog.ui:198 msgid "Running Processes" msgstr "Futó folyamatok" #: data/resources/ui/dialogs/app_dialog.ui:207 #: data/resources/ui/dialogs/process_dialog.ui:231 msgid "Containerized" msgstr "Konténerizált" #: data/resources/ui/dialogs/process_dialog.ui:7 msgid "Process Information" msgstr "Folyamatinformációk" #: data/resources/ui/dialogs/process_dialog.ui:154 #: data/resources/ui/dialogs/settings_dialog.ui:270 #: src/ui/pages/processes/mod.rs:1710 msgid "Total CPU Time" msgstr "Teljes CPU-idő" #: data/resources/ui/dialogs/process_dialog.ui:163 #: data/resources/ui/dialogs/settings_dialog.ui:275 #: src/ui/pages/processes/mod.rs:1769 msgid "User CPU Time" msgstr "Felhasználói CPU-idő" #: data/resources/ui/dialogs/process_dialog.ui:172 #: data/resources/ui/dialogs/settings_dialog.ui:280 #: src/ui/pages/processes/mod.rs:1828 msgid "System CPU Time" msgstr "Rendszerszintű CPU-idő" #: data/resources/ui/dialogs/process_dialog.ui:186 #: data/resources/ui/dialogs/settings_dialog.ui:210 #: src/ui/pages/processes/mod.rs:972 msgid "Process ID" msgstr "Folyamatazonosító" #: data/resources/ui/dialogs/process_dialog.ui:204 msgid "Commandline" msgstr "Parancssor" #: data/resources/ui/dialogs/process_dialog.ui:213 #: data/resources/ui/dialogs/settings_dialog.ui:215 #: src/ui/pages/processes/mod.rs:1025 msgid "User" msgstr "Felhasználó" #: data/resources/ui/dialogs/process_dialog.ui:222 msgid "Control Group" msgstr "Vezérlési csoport" #: data/resources/ui/dialogs/process_options_dialog.ui:7 #: data/resources/ui/dialogs/process_options_dialog.ui:69 msgid "Process Options" msgstr "Folyamatbeállítások" #: data/resources/ui/dialogs/process_options_dialog.ui:29 msgid "Apply" msgstr "Alkalmaz" #: data/resources/ui/dialogs/process_options_dialog.ui:72 msgid "Niceness" msgstr "Nice érték" #: data/resources/ui/dialogs/process_options_dialog.ui:73 msgid "" "The priority of a process is given by its niceness. A lower niceness value " "correspond to a higher priority." msgstr "" "Egy folyamat prioritása a nice értéke alapján van megadva. Az alacsonyabb nice" " érték magasabb prioritásnak felel meg." #: data/resources/ui/dialogs/process_options_dialog.ui:87 #: data/resources/ui/dialogs/settings_dialog.ui:285 #: src/ui/pages/processes/mod.rs:1887 msgid "Priority" msgstr "Prioritás" #: data/resources/ui/dialogs/process_options_dialog.ui:91 msgctxt "process priority" msgid "Very High" msgstr "Nagyon magas" #: data/resources/ui/dialogs/process_options_dialog.ui:92 msgctxt "process priority" msgid "High" msgstr "Magas" #: data/resources/ui/dialogs/process_options_dialog.ui:93 msgctxt "process priority" msgid "Normal" msgstr "Normál" #: data/resources/ui/dialogs/process_options_dialog.ui:94 msgctxt "process priority" msgid "Low" msgstr "Alacsony" #: data/resources/ui/dialogs/process_options_dialog.ui:95 msgctxt "process priority" msgid "Very Low" msgstr "Nagyon alacsony" #: data/resources/ui/dialogs/process_options_dialog.ui:103 msgid "Processor Affinity" msgstr "Processzoraffinitás" #: data/resources/ui/dialogs/process_options_dialog.ui:108 msgid "Toggle All" msgstr "Összes be- és kikapcsolása" #: data/resources/ui/dialogs/process_options_dialog.ui:111 msgid "Select which processor cores the process is allowed to run on" msgstr "Annak kiválasztása, hogy a folyamat mely processzormagokon futhat" #: data/resources/ui/dialogs/settings_dialog.ui:7 msgid "General" msgstr "Általános" #: data/resources/ui/dialogs/settings_dialog.ui:10 msgid "Units" msgstr "Mértékegységek" #: data/resources/ui/dialogs/settings_dialog.ui:13 msgid "Data Unit Prefix" msgstr "Adatmértékegység-előtag" #: data/resources/ui/dialogs/settings_dialog.ui:17 msgid "Decimal" msgstr "Decimális" #: data/resources/ui/dialogs/settings_dialog.ui:18 msgid "Binary" msgstr "Bináris" #: data/resources/ui/dialogs/settings_dialog.ui:26 msgid "Show Network Speeds in Bits per Second" msgstr "Hálózati sebességek megjelenítése bit per másodpercben" #: data/resources/ui/dialogs/settings_dialog.ui:31 msgid "Temperature Unit" msgstr "Hőmérséklet mértékegysége" #: data/resources/ui/dialogs/settings_dialog.ui:35 msgid "Celsius" msgstr "Celsius" #: data/resources/ui/dialogs/settings_dialog.ui:36 msgid "Kelvin" msgstr "Kelvin" #: data/resources/ui/dialogs/settings_dialog.ui:37 msgid "Fahrenheit" msgstr "Fahrenheit" #: data/resources/ui/dialogs/settings_dialog.ui:47 msgid "User Interface" msgstr "Felhasználói felület" #: data/resources/ui/dialogs/settings_dialog.ui:50 msgid "Refresh Speed" msgstr "Frissítési sebesség" #: data/resources/ui/dialogs/settings_dialog.ui:51 msgid "Higher refresh speeds can lead to higher processor usage" msgstr "" "A magasabb frissítési sebességek magasabb processzorhasználatot eredményezhetn" "ek" #: data/resources/ui/dialogs/settings_dialog.ui:55 msgctxt "UI refresh speed" msgid "Very Slow" msgstr "Nagyon lassú" #: data/resources/ui/dialogs/settings_dialog.ui:56 msgctxt "UI refresh speed" msgid "Slow" msgstr "Lassú" #: data/resources/ui/dialogs/settings_dialog.ui:57 msgctxt "UI refresh speed" msgid "Normal" msgstr "Normál" #: data/resources/ui/dialogs/settings_dialog.ui:58 msgctxt "UI refresh speed" msgid "Fast" msgstr "Gyors" #: data/resources/ui/dialogs/settings_dialog.ui:59 msgctxt "UI refresh speed" msgid "Very Fast" msgstr "Nagyon gyors" #: data/resources/ui/dialogs/settings_dialog.ui:67 msgid "Show Graph Grids" msgstr "Grafikonrács megjelenítése" #: data/resources/ui/dialogs/settings_dialog.ui:72 msgid "Graph Data Points" msgstr "Grafikon adatpontjai" #: data/resources/ui/dialogs/settings_dialog.ui:86 msgid "Show Usage Details in Sidebar" msgstr "Használat részleteinek megjelenítése az oldalsávban" #: data/resources/ui/dialogs/settings_dialog.ui:87 msgid "If enabled, the usage along with other information will be displayed" msgstr "" "Ha engedélyezve van, akkor a használat és egyéb információk lesznek megjelenít" "ve" #: data/resources/ui/dialogs/settings_dialog.ui:92 msgid "Show Device Descriptions in Sidebar" msgstr "Eszközleírások megjelenítése az oldalsávban" #: data/resources/ui/dialogs/settings_dialog.ui:93 msgid "" "If enabled, a device identifier like its name or device type will be " "displayed" msgstr "" "Ha engedélyezve van, akkor az eszköz azonosítója, például a neve vagy az eszkö" "z típusa meg lesz jelenítve" #: data/resources/ui/dialogs/settings_dialog.ui:98 msgid "Sidebar Meter Type" msgstr "Oldalsávban lévő mérő típusa" #: data/resources/ui/dialogs/settings_dialog.ui:102 msgid "Bar" msgstr "Oszlop" #: data/resources/ui/dialogs/settings_dialog.ui:103 msgid "Graph" msgstr "Grafikon" #: data/resources/ui/dialogs/settings_dialog.ui:111 msgid "Normalize Processor Usage" msgstr "Processzorhasználat normalizálása" #: data/resources/ui/dialogs/settings_dialog.ui:112 msgid "" "If enabled, the total usage of all cores will be divided by the amount of " "cores" msgstr "" "Ha engedélyezve van, akkor az összes mag teljes használata el lesz osztva a ma" "gok számával" #: data/resources/ui/dialogs/settings_dialog.ui:122 #: data/resources/ui/window.ui:65 data/resources/ui/window.ui:72 #: src/ui/pages/applications/mod.rs:131 msgid "Apps" msgstr "Alkalmazások" #: data/resources/ui/dialogs/settings_dialog.ui:125 #: data/resources/ui/dialogs/settings_dialog.ui:207 msgid "Information Columns" msgstr "Információs oszlopok" #: data/resources/ui/dialogs/settings_dialog.ui:183 #: data/resources/ui/dialogs/settings_dialog.ui:295 #: src/ui/pages/applications/mod.rs:1479 src/ui/pages/processes/mod.rs:2013 msgid "Combined Memory" msgstr "Kombinált memória" #: data/resources/ui/dialogs/settings_dialog.ui:193 #: data/resources/ui/window.ui:105 data/resources/ui/window.ui:112 #: src/ui/pages/processes/mod.rs:175 msgid "Processes" msgstr "Folyamatok" #: data/resources/ui/dialogs/settings_dialog.ui:196 #: data/resources/ui/pages/cpu.ui:22 data/resources/ui/pages/processes.ui:56 msgid "Options" msgstr "Beállítások" #: data/resources/ui/dialogs/settings_dialog.ui:199 msgid "Show Niceness Values" msgstr "Nice értékek megjelenítése" #: data/resources/ui/dialogs/settings_dialog.ui:200 msgid "" "Display priorities as niceness to allow for more fine-grained adjustments" msgstr "" "A prioritások nice értékként való megjelenítése, hogy finomabb hangolást " "tegyen lehetővé" #: data/resources/ui/dialogs/settings_dialog.ui:305 msgid "Devices" msgstr "Eszközök" #: data/resources/ui/dialogs/settings_dialog.ui:308 msgid "Drives" msgstr "Meghajtók" #: data/resources/ui/dialogs/settings_dialog.ui:311 msgid "Show Virtual Drives" msgstr "Virtuális meghajtók megjelenítése" #: data/resources/ui/dialogs/settings_dialog.ui:312 msgid "Virtual drives are for example ZFS volumes or mapped devices" msgstr "Virtuális meghajtók például a ZFS-kötetek vagy a leképezett eszközök" #: data/resources/ui/dialogs/settings_dialog.ui:322 msgid "Show Virtual Network Interfaces" msgstr "Virtuális hálózati csatolók megjelenítése" #: data/resources/ui/dialogs/settings_dialog.ui:323 msgid "Virtual network interfaces are for example bridges or VPN tunnels" msgstr "Virtuális hálózati csatolók például a hidak vagy a VPN-alagutak" #: data/resources/ui/pages/applications.ui:6 #: data/resources/ui/pages/applications.ui:26 #: src/ui/pages/applications/mod.rs:1563 msgid "Kill App" msgstr "Alkalmazás kilövése" #: data/resources/ui/pages/applications.ui:10 #: data/resources/ui/pages/applications.ui:30 #: src/ui/pages/applications/mod.rs:1562 msgid "Halt App" msgstr "Alkalmazás megállítása" #: data/resources/ui/pages/applications.ui:14 #: data/resources/ui/pages/applications.ui:34 #: src/ui/pages/applications/mod.rs:1564 msgid "Continue App" msgstr "Alkalmazás folytatása" #: data/resources/ui/pages/applications.ui:22 #: data/resources/ui/pages/applications.ui:98 #: src/ui/pages/applications/mod.rs:1561 msgid "End App" msgstr "Alkalmazás befejezése" #: data/resources/ui/pages/applications.ui:40 #: data/resources/ui/pages/processes.ui:62 msgid "Information" msgstr "Információk" #: data/resources/ui/pages/applications.ui:57 msgid "Search applications" msgstr "Alkalmazások keresése" #: data/resources/ui/pages/applications.ui:87 #: data/resources/ui/pages/applications.ui:89 msgid "Show App Information" msgstr "Alkalmazásinformációk megjelenítése" #: data/resources/ui/pages/battery.ui:36 msgid "Battery Health" msgstr "Akkumulátor egészsége" #: data/resources/ui/pages/battery.ui:45 msgid "Design Capacity" msgstr "Tervezett kapacitás" #: data/resources/ui/pages/battery.ui:54 msgid "Charge Cycles" msgstr "Töltési ciklusok" #: data/resources/ui/pages/battery.ui:63 msgid "Technology" msgstr "Technológia" #: data/resources/ui/pages/battery.ui:72 data/resources/ui/pages/gpu.ui:81 #: data/resources/ui/pages/network.ui:58 data/resources/ui/pages/npu.ui:75 msgid "Manufacturer" msgstr "Gyártó" #: data/resources/ui/pages/battery.ui:81 msgid "Model Name" msgstr "Modell neve" #: data/resources/ui/pages/battery.ui:90 data/resources/ui/pages/drive.ui:66 msgid "Device" msgstr "Eszköz" #: data/resources/ui/pages/cpu.ui:26 msgid "Show Usages of Logical CPUs" msgstr "Logikai CPU-k használatának megjelenítése" #: data/resources/ui/pages/cpu.ui:75 data/resources/ui/pages/gpu.ui:66 #: data/resources/ui/pages/npu.ui:60 msgid "Sensors" msgstr "Érzékelők" #: data/resources/ui/pages/cpu.ui:90 msgid "Max Frequency" msgstr "Legnagyobb frekvencia" #: data/resources/ui/pages/cpu.ui:99 msgid "Logical Cores" msgstr "Logikai magok" #: data/resources/ui/pages/cpu.ui:108 msgid "Physical Cores" msgstr "Fizikai magok" #: data/resources/ui/pages/cpu.ui:117 msgid "Sockets" msgstr "Foglalatok" #: data/resources/ui/pages/cpu.ui:126 msgid "Uptime" msgstr "Üzemidő" #: data/resources/ui/pages/cpu.ui:135 msgid "Virtualization" msgstr "Virtualizáció" #: data/resources/ui/pages/cpu.ui:144 msgid "Architecture" msgstr "Architektúra" #: data/resources/ui/pages/drive.ui:38 msgid "Total Read" msgstr "Olvasva összesen" #: data/resources/ui/pages/drive.ui:47 msgid "Total Written" msgstr "Írva összesen" #: data/resources/ui/pages/drive.ui:57 data/resources/ui/pages/memory.ui:72 msgid "Type" msgstr "Típus" #: data/resources/ui/pages/drive.ui:75 msgid "Capacity" msgstr "Kapacitás" #: data/resources/ui/pages/drive.ui:84 msgid "Writable" msgstr "Írható" #: data/resources/ui/pages/drive.ui:93 msgid "Removable" msgstr "Eltávolítható" #. Translators: "Link" refers to something like "PCIe 4.0 ×16" #: data/resources/ui/pages/drive.ui:102 data/resources/ui/pages/gpu.ui:113 #: data/resources/ui/pages/network.ui:103 data/resources/ui/pages/npu.ui:107 msgid "Link" msgstr "Kapcsolat" #: data/resources/ui/pages/gpu.ui:37 msgid "GPU Frequency" msgstr "GPU órajele" #: data/resources/ui/pages/gpu.ui:50 msgid "Video Memory Frequency" msgstr "Videomemória órajele" #: data/resources/ui/pages/gpu.ui:55 data/resources/ui/pages/npu.ui:49 #: src/ui/pages/battery.rs:217 msgid "Power Usage" msgstr "Energiahasználat" #: data/resources/ui/pages/gpu.ui:90 data/resources/ui/pages/npu.ui:84 msgid "PCI Slot" msgstr "PCI foglalat" #: data/resources/ui/pages/gpu.ui:99 data/resources/ui/pages/network.ui:67 #: data/resources/ui/pages/npu.ui:93 msgid "Driver Used" msgstr "Használt illesztőprogram" #: data/resources/ui/pages/gpu.ui:108 data/resources/ui/pages/npu.ui:102 msgid "Max Power Cap" msgstr "Legnagyobb energiakorlát" #: data/resources/ui/pages/memory.ui:9 msgid "You need to authenticate to see memory properties" msgstr "Hitelesítés szükséges a memóriatulajdonságok megtekintéséhez" #: data/resources/ui/pages/memory.ui:10 msgid "Authenticate" msgstr "Hitelesítés" #: data/resources/ui/pages/memory.ui:45 msgid "Slots Used" msgstr "Használt foglalatok" #: data/resources/ui/pages/memory.ui:54 msgid "Speed" msgstr "Sebesség" #: data/resources/ui/pages/memory.ui:63 msgid "Form Factor" msgstr "Fizikai formátum" #: data/resources/ui/pages/memory.ui:81 msgid "Type Detail" msgstr "Típus részletei" #: data/resources/ui/pages/network.ui:35 msgid "Total Received" msgstr "Fogadva összesen" #: data/resources/ui/pages/network.ui:44 msgid "Total Sent" msgstr "Küldve összesen" #: data/resources/ui/pages/network.ui:76 msgid "Interface" msgstr "Csatoló" #: data/resources/ui/pages/network.ui:85 msgid "Hardware Address" msgstr "Hardvercím" #: data/resources/ui/pages/network.ui:94 #| msgid "Network Bridge" msgid "Network Name" msgstr "Hálózat neve" #: data/resources/ui/pages/network.ui:112 msgid "Link Speed" msgstr "Kapcsolat sebessége" #: data/resources/ui/pages/npu.ui:31 msgid "NPU Frequency" msgstr "NPU órajele" #: data/resources/ui/pages/npu.ui:44 msgid "Memory Frequency" msgstr "Memória órajele" #: data/resources/ui/pages/processes.ui:6 #: data/resources/ui/pages/processes.ui:42 src/ui/pages/processes/mod.rs:2126 msgid "Kill Process" msgstr "Folyamat kilövése" #: data/resources/ui/pages/processes.ui:10 #: data/resources/ui/pages/processes.ui:46 src/ui/pages/processes/mod.rs:2125 msgid "Halt Process" msgstr "Folyamat megállítása" #: data/resources/ui/pages/processes.ui:14 #: data/resources/ui/pages/processes.ui:50 src/ui/pages/processes/mod.rs:2127 msgid "Continue Process" msgstr "Folyamat folytatása" #: data/resources/ui/pages/processes.ui:22 #: data/resources/ui/pages/processes.ui:74 msgid "Kill Processes" msgstr "Folyamatok kilövése" #: data/resources/ui/pages/processes.ui:26 #: data/resources/ui/pages/processes.ui:78 msgid "Halt Processes" msgstr "Folyamatok megállítása" #: data/resources/ui/pages/processes.ui:30 #: data/resources/ui/pages/processes.ui:82 msgid "Continue Processes" msgstr "Folyamatok folytatása" #: data/resources/ui/pages/processes.ui:38 #: data/resources/ui/pages/processes.ui:157 src/ui/pages/processes/mod.rs:523 #: src/ui/pages/processes/mod.rs:2124 msgid "End Process" msgstr "Folyamat befejezése" #: data/resources/ui/pages/processes.ui:70 src/ui/pages/processes/mod.rs:527 msgid "End Processes" msgstr "Folyamatok befejezése" #: data/resources/ui/pages/processes.ui:103 msgid "Search processes" msgstr "Folyamatok keresése" #: data/resources/ui/pages/processes.ui:133 #: data/resources/ui/pages/processes.ui:135 msgid "Show Process Options" msgstr "Folyamatbeállítások megjelenítése" #: data/resources/ui/pages/processes.ui:146 #: data/resources/ui/pages/processes.ui:148 msgid "Show Process Information" msgstr "Folyamatinformációk megjelenítése" #: data/resources/ui/shortcuts.ui:11 msgctxt "shortcut window" msgid "General" msgstr "Általános" #: data/resources/ui/shortcuts.ui:14 msgctxt "shortcut window" msgid "Preferences" msgstr "Beállítások" #: data/resources/ui/shortcuts.ui:20 msgctxt "shortcut window" msgid "Show Shortcuts" msgstr "Gyorsbillentyűk megjelenítése" #: data/resources/ui/shortcuts.ui:26 msgctxt "shortcut window" msgid "Quit" msgstr "Kilépés" #: data/resources/ui/shortcuts.ui:32 msgctxt "shortcut window" msgid "Toggle Search Field" msgstr "Keresési mező be- és kikapcsolása" #: data/resources/ui/shortcuts.ui:38 msgctxt "shortcut window" msgid "End App/Process" msgstr "Alkalmazás vagy folyamat befejezése" #: data/resources/ui/shortcuts.ui:44 msgctxt "shortcut window" msgid "Kill App/Process" msgstr "Alkalmazás vagy folyamat kilövése" #: data/resources/ui/shortcuts.ui:50 msgctxt "shortcut window" msgid "Halt App/Process" msgstr "Alkalmazás vagy folyamat megállítása" #: data/resources/ui/shortcuts.ui:56 msgctxt "shortcut window" msgid "Continue App/Process" msgstr "Alkalmazás vagy folyamat folytatása" #: data/resources/ui/shortcuts.ui:62 msgctxt "shortcut window" msgid "Show Information for App/Process" msgstr "Alkalmazás- vagy folyamatinformációk megjelenítése" #: data/resources/ui/shortcuts.ui:68 msgctxt "shortcut window" msgid "Show Process Options" msgstr "Folyamatbeállítások megjelenítése" #: data/resources/ui/window.ui:6 msgid "Preferences" msgstr "Beállítások" #: data/resources/ui/window.ui:10 msgid "Keyboard Shortcuts" msgstr "Gyorsbillentyűk" #: data/resources/ui/window.ui:14 msgid "About Resources" msgstr "Az Erőforrások névjegye" #: data/resources/ui/window.ui:88 data/resources/ui/window.ui:128 msgid "Search" msgstr "Keresés" #: data/resources/ui/window.ui:90 data/resources/ui/window.ui:130 msgid "Toggle search field" msgstr "Keresési mező be- és kikapcsolása" #: src/application.rs:274 msgid "The Nalux Team" msgstr "A Nalux csapata" #: src/application.rs:282 msgid "Report Issues" msgstr "Problémák jelentése" #. Translator credits. Replace "translator-credits" with your name/username, and optionally an email or URL. #. One name per line, please do not remove previous names. #: src/application.rs:288 msgid "translator-credits" msgstr "Meskó Balázs , 2025." #: src/application.rs:289 msgid "Icon by" msgstr "Ikont készítette:" #: src/ui/dialogs/app_dialog.rs:155 src/ui/dialogs/process_dialog.rs:133 #: src/ui/dialogs/process_dialog.rs:137 src/ui/dialogs/process_dialog.rs:146 #: src/ui/dialogs/process_dialog.rs:148 src/ui/dialogs/process_dialog.rs:171 #: src/ui/dialogs/process_dialog.rs:178 src/ui/dialogs/process_dialog.rs:185 #: src/ui/dialogs/process_dialog.rs:192 src/ui/pages/applications/mod.rs:948 #: src/ui/pages/applications/mod.rs:1074 src/ui/pages/battery.rs:205 #: src/ui/pages/battery.rs:225 src/ui/pages/battery.rs:231 #: src/ui/pages/battery.rs:234 src/ui/pages/battery.rs:265 #: src/ui/pages/battery.rs:289 src/ui/pages/battery.rs:291 #: src/ui/pages/battery.rs:301 src/ui/pages/cpu.rs:243 src/ui/pages/cpu.rs:258 #: src/ui/pages/cpu.rs:277 src/ui/pages/cpu.rs:283 src/ui/pages/cpu.rs:289 #: src/ui/pages/cpu.rs:295 src/ui/pages/cpu.rs:299 src/ui/pages/cpu.rs:302 #: src/ui/pages/cpu.rs:340 src/ui/pages/cpu.rs:447 src/ui/pages/drive.rs:319 #: src/ui/pages/drive.rs:350 src/ui/pages/drive.rs:352 #: src/ui/pages/drive.rs:381 src/ui/pages/drive.rs:383 #: src/ui/pages/drive.rs:399 src/ui/pages/drive.rs:400 #: src/ui/pages/drive.rs:407 src/ui/pages/drive.rs:417 #: src/ui/pages/drive.rs:427 src/ui/pages/drive.rs:433 src/ui/pages/gpu.rs:244 #: src/ui/pages/gpu.rs:251 src/ui/pages/gpu.rs:296 src/ui/pages/gpu.rs:321 #: src/ui/pages/gpu.rs:324 src/ui/pages/gpu.rs:335 src/ui/pages/gpu.rs:355 #: src/ui/pages/gpu.rs:367 src/ui/pages/gpu.rs:378 src/ui/pages/gpu.rs:390 #: src/ui/pages/gpu.rs:397 src/ui/pages/gpu.rs:401 src/ui/pages/gpu.rs:431 #: src/ui/pages/gpu.rs:437 src/ui/pages/memory.rs:227 #: src/ui/pages/memory.rs:228 src/ui/pages/memory.rs:232 #: src/ui/pages/memory.rs:233 src/ui/pages/memory.rs:237 #: src/ui/pages/memory.rs:238 src/ui/pages/memory.rs:266 #: src/ui/pages/memory.rs:327 src/ui/pages/network.rs:252 #: src/ui/pages/network.rs:259 src/ui/pages/network.rs:266 #: src/ui/pages/network.rs:272 src/ui/pages/network.rs:275 #: src/ui/pages/network.rs:285 src/ui/pages/network.rs:292 #: src/ui/pages/network.rs:302 src/ui/pages/network.rs:370 #: src/ui/pages/network.rs:373 src/ui/pages/network.rs:375 #: src/ui/pages/network.rs:404 src/ui/pages/network.rs:407 #: src/ui/pages/network.rs:409 src/ui/pages/network.rs:417 #: src/ui/pages/network.rs:424 src/ui/pages/network.rs:434 #: src/ui/pages/processes/mod.rs:1224 src/ui/pages/processes/mod.rs:1291 #: src/ui/pages/processes/mod.rs:1358 src/ui/pages/processes/mod.rs:1425 #: src/ui/pages/processes/mod.rs:1911 src/ui/pages/processes/mod.rs:1913 #: src/utils/battery.rs:149 src/utils/drive.rs:136 src/utils/gpu/mod.rs:275 #: src/utils/gpu/mod.rs:287 src/utils/link/mod.rs:61 src/utils/npu/mod.rs:243 #: src/utils/npu/mod.rs:249 msgid "N/A" msgstr "N/A" #: src/ui/dialogs/process_options_dialog.rs:147 src/ui/pages/cpu.rs:257 #: src/ui/pages/cpu.rs:416 src/ui/pages/cpu.rs:420 msgid "CPU {}" msgstr "{}. CPU" #: src/ui/pages/applications/application_entry.rs:190 src/ui/pages/drive.rs:414 #: src/ui/pages/drive.rs:424 src/ui/pages/processes/process_entry.rs:211 msgid "No" msgstr "Nem" #: src/ui/pages/applications/application_entry.rs:191 #: src/ui/pages/processes/process_entry.rs:212 msgid "Yes (Flatpak)" msgstr "Igen (Flatpak)" #: src/ui/pages/applications/application_entry.rs:192 #: src/ui/pages/processes/process_entry.rs:213 msgid "Yes (Snap)" msgstr "Igen (Snap)" #: src/ui/pages/applications/mod.rs:660 msgid "Running Apps: {}" msgstr "Futó alkalmazások: {}" #: src/ui/pages/applications/mod.rs:700 src/ui/pages/processes/mod.rs:862 msgid "Cancel" msgstr "Mégse" #: src/ui/pages/applications/mod.rs:746 msgid "App" msgstr "Alkalmazás" #: src/ui/pages/applications/mod.rs:1539 src/ui/pages/processes/mod.rs:2073 msgid "End {}?" msgstr "A(z) {} befejezése?" #: src/ui/pages/applications/mod.rs:1540 src/ui/pages/processes/mod.rs:2074 msgid "Halt {}?" msgstr "A(z) {} megállítása?" #: src/ui/pages/applications/mod.rs:1541 src/ui/pages/processes/mod.rs:2075 msgid "Kill {}?" msgstr "A(z) {} kilövése?" #: src/ui/pages/applications/mod.rs:1542 src/ui/pages/processes/mod.rs:2076 msgid "Continue {}?" msgstr "A(z) {} folytatása?" #: src/ui/pages/applications/mod.rs:1548 src/ui/pages/processes/mod.rs:2111 msgid "Unsaved work might be lost." msgstr "A mentetlen munka elveszhet." #: src/ui/pages/applications/mod.rs:1550 msgid "" "Halting an app can come with serious risks such as losing data and security " "implications. Use with caution." msgstr "" "Egy alkalmazás megállítása komoly kockázatokkal járhat, például adatvesztéssel" " és biztonsági következményekkel. Használja körültekintően." #: src/ui/pages/applications/mod.rs:1553 msgid "" "Killing an app can come with serious risks such as losing data and security " "implications. Use with caution." msgstr "" "Egy alkalmazás kilövése komoly kockázatokkal járhat, például adatvesztéssel és" " biztonsági következményekkel. Használja körültekintően." #: src/ui/pages/battery.rs:102 src/utils/battery.rs:261 msgid "Battery" msgstr "Akkumulátor" #: src/ui/pages/battery.rs:210 msgid "Battery Charge" msgstr "Akkumulátortöltés" #: src/ui/pages/battery.rs:279 src/ui/pages/cpu.rs:437 #: src/ui/pages/drive.rs:344 src/ui/pages/drive.rs:375 src/ui/pages/gpu.rs:423 #: src/ui/pages/network.rs:362 src/ui/pages/network.rs:396 msgid "Highest:" msgstr "Legmagasabb:" #: src/ui/pages/cpu.rs:242 src/ui/pages/gpu.rs:211 msgid "Total Usage" msgstr "Teljes használat" #: src/ui/pages/cpu.rs:270 src/ui/pages/gpu.rs:238 msgid "Temperature" msgstr "Hőmérséklet" #: src/ui/pages/drive.rs:126 msgid "Drive" msgstr "Meghajtó" #: src/ui/pages/drive.rs:236 msgid "Drive Activity" msgstr "Meghajtótevékenység" #: src/ui/pages/drive.rs:243 msgid "Read Speed" msgstr "Olvasási sebesség" #: src/ui/pages/drive.rs:247 msgid "Write Speed" msgstr "Írási sebesség" #: src/ui/pages/drive.rs:412 src/ui/pages/drive.rs:422 msgid "Yes" msgstr "Igen" # Ezt eredetiben hagyom, mert biztosan panaszkodnának miatta #. Translators: This is an abbreviation for "Read" and "Write". This is displayed in the sidebar so your #. translation should preferably be quite short or an abbreviation #: src/ui/pages/drive.rs:440 msgid "R: {} · W: {}" msgstr "O: {} · Í: {}" #: src/ui/pages/gpu.rs:219 msgid "Video Encoder/Decoder Usage" msgstr "Videókódoló vagy -dekódoló használata" #: src/ui/pages/gpu.rs:225 msgid "Video Encoder Usage" msgstr "Videókódoló használata" #: src/ui/pages/gpu.rs:230 msgid "Video Decoder Usage" msgstr "Videódekódoló használata" #: src/ui/pages/gpu.rs:235 msgid "Video Memory Usage" msgstr "Videomemória használata" #. Translators: This will be displayed in the sidebar, please try to keep your translation as short as (or even #. shorter than) 'Memory' #: src/ui/pages/gpu.rs:409 msgid "Memory: {}" msgstr "Memória: {}" #: src/ui/pages/memory.rs:262 msgid "{} of {}" msgstr "{} / {}" #: src/ui/pages/memory.rs:265 msgid "{} MT/s" msgstr "{} MT/mp" #. Translators: This will be displayed in the sidebar, so your translation for "Swap" should #. preferably be quite short or an abbreviation #: src/ui/pages/memory.rs:346 msgid "{} / {} · Swap: {} %" msgstr "{} / {} · Cserehely: {} %" #: src/ui/pages/network.rs:127 src/utils/network.rs:135 msgid "Network Interface" msgstr "Hálózati csatoló" #: src/ui/pages/network.rs:241 msgid "Receiving" msgstr "Fogadás" #: src/ui/pages/network.rs:245 msgid "Sending" msgstr "Küldés" #. Translators: This is an abbreviation for "Receive" and "Send". This is displayed in the sidebar so #. your translation should preferably be quite short or an abbreviation #: src/ui/pages/network.rs:445 msgid "R: {} · S: {}" msgstr "F: {} · K: {}" #: src/ui/pages/processes/mod.rs:813 msgid "Running Processes: {}" msgstr "Futó folyamatok: {}" #: src/ui/pages/processes/mod.rs:911 msgid "Process" msgstr "Folyamat" #: src/ui/pages/processes/mod.rs:2083 msgid "End process?" msgid_plural "End {} processes?" msgstr[0] "Befejezi a folyamatot?" msgstr[1] "Befejez {} folyamatot?" #: src/ui/pages/processes/mod.rs:2089 msgid "Halt process?" msgid_plural "Halt {} processes?" msgstr[0] "Megállítja a folyamatot?" msgstr[1] "Megállít {} folyamatot?" #: src/ui/pages/processes/mod.rs:2095 src/ui/pages/processes/mod.rs:2101 msgid "Kill process?" msgid_plural "Kill {} processes?" msgstr[0] "Kilövi a folyamatot?" msgstr[1] "Kilő {} folyamatot?" #: src/ui/pages/processes/mod.rs:2113 msgid "" "Halting a process can come with serious risks such as losing data and " "security implications. Use with caution." msgstr "" "Egy folyamat megállítása komoly kockázatokkal járhat, például adatvesztéssel " "vagy biztonsági következményekkel. Használja körültekintően." #: src/ui/pages/processes/mod.rs:2116 msgid "" "Killing a process can come with serious risks such as losing data and " "security implications. Use with caution." msgstr "" "Egy folyamat kilövése komoly kockázatokkal járhat, például adatvesztéssel " "vagy biztonsági következményekkel. Használja körültekintően." #: src/ui/window.rs:466 msgid "GPU {}" msgstr "{}. GPU" #: src/ui/window.rs:496 msgid "NPU {}" msgstr "{}. NPU" #: src/ui/window.rs:498 msgid "NPU" msgstr "NPU" #: src/ui/window.rs:1167 msgid "Successfully adjusted {}" msgstr "A(z) {} sikeresen módosítva" #: src/ui/window.rs:1168 msgid "There was a problem adjusting {}" msgstr "Hiba történt a(z) {} módosítása során" #: src/ui/window.rs:1250 msgid "Successfully ended {}" msgstr "A(z) {} sikeresen befejezve" #: src/ui/window.rs:1251 msgid "Successfully halted {}" msgstr "A(z) {} sikeresen megállítva" #: src/ui/window.rs:1252 msgid "Successfully killed {}" msgstr "A(z) {} sikeresen kilőve" #: src/ui/window.rs:1253 msgid "Successfully continued {}" msgstr "A(z) {} sikeresen folytatva" #: src/ui/window.rs:1260 msgid "Successfully ended the process" msgid_plural "Successfully ended {} processes" msgstr[0] "A folyamat sikeresen befejezve" msgstr[1] "{} folyamat sikeresen befejezve" #: src/ui/window.rs:1266 msgid "Successfully halted the process" msgid_plural "Successfully halted {} processes" msgstr[0] "A folyamat sikeresen megállítva" msgstr[1] "{} folyamat sikeresen megállítva" #: src/ui/window.rs:1272 msgid "Successfully killed the process" msgid_plural "Successfully killed {} processes" msgstr[0] "A folyamat sikeresen kilőve" msgstr[1] "{} folyamat sikeresen kilőve" #: src/ui/window.rs:1278 msgid "Successfully continued the process" msgid_plural "Successfully continued {} processes" msgstr[0] "A folyamat sikeresen folytatva" msgstr[1] "{} folyamat sikeresen folytatva" #: src/ui/window.rs:1289 msgid "There was a problem ending a process" msgid_plural "There were problems ending {} processes" msgstr[0] "Hiba történt a folyamat befejezése során" msgstr[1] "Hiba történt {} folyamat befejezése során" #: src/ui/window.rs:1295 msgid "There was a problem halting a process" msgid_plural "There were problems halting {} processes" msgstr[0] "Hiba történt a folyamat megállítása során" msgstr[1] "Hiba történt {} folyamat megállítása során" #: src/ui/window.rs:1301 msgid "There was a problem killing a process" msgid_plural "There were problems killing {} processes" msgstr[0] "Hiba történt a folyamat kilövése során" msgstr[1] "Hiba történt {} folyamat kilövése során" #: src/ui/window.rs:1307 msgid "There was a problem continuing a process" msgid_plural "There were problems continuing {} processes" msgstr[0] "Hiba történt a folyamat folytatása során" msgstr[1] "Hiba történt {} folyamat folytatása során" #: src/ui/window.rs:1317 msgid "There was a problem ending {}" msgstr "Hiba történt a(z) {} befejezése során" #: src/ui/window.rs:1318 msgid "There was a problem halting {}" msgstr "Hiba történt a(z) {} megállítása során" #: src/ui/window.rs:1319 msgid "There was a problem killing {}" msgstr "Hiba történt a(z) {} kilövése során" #: src/ui/window.rs:1320 msgid "There was a problem continuing {}" msgstr "Hiba történt a(z) {} folytatása során" #: src/utils/app.rs:219 msgid "System Processes" msgstr "Rendszerfolyamatok" #: src/utils/battery.rs:90 msgid "Charging" msgstr "Töltés" #: src/utils/battery.rs:91 msgid "Discharging" msgstr "Kisülés" #: src/utils/battery.rs:92 msgid "Empty" msgstr "Üres" #: src/utils/battery.rs:93 msgid "Full" msgstr "Tele" #: src/utils/battery.rs:94 msgid "Unknown" msgstr "Ismeretlen" #: src/utils/battery.rs:140 msgid "Nickel-Metal Hydride" msgstr "Nikkel–fém-hidrid" #: src/utils/battery.rs:141 msgid "Nickel-Cadmium" msgstr "Nikkel–kadmium" #: src/utils/battery.rs:142 msgid "Nickel-Zinc" msgstr "Nikkel–cink" #: src/utils/battery.rs:143 msgid "Lead-Acid" msgstr "Ólom-savas" #: src/utils/battery.rs:144 msgid "Lithium-Ion" msgstr "Lítium ion" #: src/utils/battery.rs:145 msgid "Lithium Iron Phosphate" msgstr "Lítium-vasfoszfát" #: src/utils/battery.rs:146 msgid "Lithium Polymer" msgstr "Lítium-polimer" #: src/utils/battery.rs:148 msgid "Rechargeable Alkaline Managanese" msgstr "Újratölthető alkáli-mangán" #: src/utils/battery.rs:259 msgid "{} Battery" msgstr "{} akkumulátor" #: src/utils/units.rs:91 msgid "{} K" msgstr "{} K" #: src/utils/units.rs:93 msgid "{} °C" msgstr "{} °C" #: src/utils/units.rs:95 msgid "{} °F" msgstr "{} °F" #: src/utils/units.rs:113 src/utils/units.rs:127 src/utils/units.rs:147 #: src/utils/units.rs:161 msgid "{} B" msgstr "{} B" #: src/utils/units.rs:114 src/utils/units.rs:128 msgid "{} kB" msgstr "{} kB" #: src/utils/units.rs:115 src/utils/units.rs:129 msgid "{} MB" msgstr "{} MB" #: src/utils/units.rs:116 src/utils/units.rs:130 msgid "{} GB" msgstr "{} GB" #: src/utils/units.rs:117 src/utils/units.rs:131 msgid "{} TB" msgstr "{} TB" #: src/utils/units.rs:118 src/utils/units.rs:132 msgid "{} PB" msgstr "{} PB" #: src/utils/units.rs:119 src/utils/units.rs:133 msgid "{} EB" msgstr "{} EB" #: src/utils/units.rs:120 src/utils/units.rs:134 msgid "{} ZB" msgstr "{} ZB" #: src/utils/units.rs:121 src/utils/units.rs:135 msgid "{} YB" msgstr "{} YB" #: src/utils/units.rs:122 src/utils/units.rs:136 msgid "{} RB" msgstr "{} RB" #: src/utils/units.rs:123 src/utils/units.rs:137 msgid "{} QB" msgstr "{} QB" #: src/utils/units.rs:148 src/utils/units.rs:162 msgid "{} KiB" msgstr "{} KiB" #: src/utils/units.rs:149 src/utils/units.rs:163 msgid "{} MiB" msgstr "{} MiB" #: src/utils/units.rs:150 src/utils/units.rs:164 msgid "{} GiB" msgstr "{} GiB" #: src/utils/units.rs:151 src/utils/units.rs:165 msgid "{} TiB" msgstr "{} TiB" #: src/utils/units.rs:152 src/utils/units.rs:166 msgid "{} PiB" msgstr "{} PiB" #: src/utils/units.rs:153 src/utils/units.rs:167 msgid "{} EiB" msgstr "{} EiB" #: src/utils/units.rs:154 src/utils/units.rs:168 msgid "{} ZiB" msgstr "{} ZiB" #: src/utils/units.rs:155 src/utils/units.rs:169 msgid "{} YiB" msgstr "{} YiB" #: src/utils/units.rs:156 src/utils/units.rs:170 msgid "{} RiB" msgstr "{} RiB" #: src/utils/units.rs:157 src/utils/units.rs:171 msgid "{} QiB" msgstr "{} QiB" #: src/utils/units.rs:198 src/utils/units.rs:215 msgid "{} B/s" msgstr "{} B/mp" #: src/utils/units.rs:199 msgid "{} kB/s" msgstr "{} kB/mp" #: src/utils/units.rs:200 msgid "{} MB/s" msgstr "{} MB/mp" #: src/utils/units.rs:201 msgid "{} GB/s" msgstr "{} GB/mp" #: src/utils/units.rs:202 msgid "{} TB/s" msgstr "{} TB/mp" #: src/utils/units.rs:203 msgid "{} PB/s" msgstr "{} PB/mp" #: src/utils/units.rs:204 msgid "{} EB/s" msgstr "{} EB/mp" #: src/utils/units.rs:205 msgid "{} ZB/s" msgstr "{} ZB/mp" #: src/utils/units.rs:206 msgid "{} YB/s" msgstr "{} YB/mp" #: src/utils/units.rs:207 msgid "{} RB/s" msgstr "{} RB/mp" #: src/utils/units.rs:208 msgid "{} QB/s" msgstr "{} QB/mp" #: src/utils/units.rs:216 msgid "{} KiB/s" msgstr "{} KiB/mp" #: src/utils/units.rs:217 msgid "{} MiB/s" msgstr "{} MiB/mp" #: src/utils/units.rs:218 msgid "{} GiB/s" msgstr "{} GiB/mp" #: src/utils/units.rs:219 msgid "{} TiB/s" msgstr "{} TiB/mp" #: src/utils/units.rs:220 msgid "{} PiB/s" msgstr "{} PiB/mp" #: src/utils/units.rs:221 msgid "{} EiB/s" msgstr "{} EiB/mp" #: src/utils/units.rs:222 msgid "{} ZiB/s" msgstr "{} ZiB/mp" #: src/utils/units.rs:223 msgid "{} YiB/s" msgstr "{} YiB/mp" #: src/utils/units.rs:224 msgid "{} RiB/s" msgstr "{} RiB/mp" #: src/utils/units.rs:225 msgid "{} QiB/s" msgstr "{} QiB/mp" #: src/utils/units.rs:239 src/utils/units.rs:256 msgid "{} b/s" msgstr "{} b/mp" #: src/utils/units.rs:240 msgid "{} kb/s" msgstr "{} kb/mp" #: src/utils/units.rs:241 msgid "{} Mb/s" msgstr "{} Mb/mp" #: src/utils/units.rs:242 msgid "{} Gb/s" msgstr "{} Gb/mp" #: src/utils/units.rs:243 msgid "{} Tb/s" msgstr "{} Tb/mp" #: src/utils/units.rs:244 msgid "{} Pb/s" msgstr "{} Pb/mp" #: src/utils/units.rs:245 msgid "{} Eb/s" msgstr "{} Eb/mp" #: src/utils/units.rs:246 msgid "{} Zb/s" msgstr "{} Zb/mp" #: src/utils/units.rs:247 msgid "{} Yb/s" msgstr "{} Yb/mp" #: src/utils/units.rs:248 msgid "{} Rb/s" msgstr "{} Rb/mp" #: src/utils/units.rs:249 msgid "{} Qb/s" msgstr "{} Qb/mp" #: src/utils/units.rs:257 msgid "{} Kib/s" msgstr "{} Kib/mp" #: src/utils/units.rs:258 msgid "{} Mib/s" msgstr "{} Mib/mp" #: src/utils/units.rs:259 msgid "{} Gib/s" msgstr "{} Gib/mp" #: src/utils/units.rs:260 msgid "{} Tib/s" msgstr "{} Tib/mp" #: src/utils/units.rs:261 msgid "{} Pib/s" msgstr "{} Pib/mp" #: src/utils/units.rs:262 msgid "{} Eib/s" msgstr "{} Eib/mp" #: src/utils/units.rs:263 msgid "{} Zib/s" msgstr "{} Zib/mp" #: src/utils/units.rs:264 msgid "{} Yib/s" msgstr "{} Yib/mp" #: src/utils/units.rs:265 msgid "{} Rib/s" msgstr "{} Rib/mp" #: src/utils/units.rs:266 msgid "{} Qib/s" msgstr "{} Qib/mp" #: src/utils/units.rs:273 msgid "{} Hz" msgstr "{} Hz" #: src/utils/units.rs:274 msgid "{} kHz" msgstr "{} kHz" #: src/utils/units.rs:275 msgid "{} MHz" msgstr "{} MHz" #: src/utils/units.rs:276 msgid "{} GHz" msgstr "{} GHz" #: src/utils/units.rs:277 msgid "{} THz" msgstr "{} THz" #: src/utils/units.rs:278 msgid "{} PHz" msgstr "{} PHz" #: src/utils/units.rs:279 msgid "{} EHz" msgstr "{} EHz" #: src/utils/units.rs:280 msgid "{} ZHz" msgstr "{} ZHz" #: src/utils/units.rs:281 msgid "{} YHz" msgstr "{} YHz" #: src/utils/units.rs:282 msgid "{} RHz" msgstr "{} RHz" #: src/utils/units.rs:283 msgid "{} QHz" msgstr "{} QHz" #: src/utils/units.rs:290 msgid "{} W" msgstr "{} W" #: src/utils/units.rs:291 msgid "{} kW" msgstr "{} kW" #: src/utils/units.rs:292 msgid "{} MW" msgstr "{} MW" #: src/utils/units.rs:293 msgid "{} GW" msgstr "{} GW" #: src/utils/units.rs:294 msgid "{} TW" msgstr "{} TW" #: src/utils/units.rs:295 msgid "{} PW" msgstr "{} PW" #: src/utils/units.rs:296 msgid "{} EW" msgstr "{} EW" #: src/utils/units.rs:297 msgid "{} ZW" msgstr "{} ZW" #: src/utils/units.rs:298 msgid "{} YW" msgstr "{} YW" #: src/utils/units.rs:299 msgid "{} RW" msgstr "{} RW" #: src/utils/units.rs:300 msgid "{} QW" msgstr "{} QW" #: src/utils/units.rs:309 src/utils/units.rs:323 msgid "{} Wh" msgstr "{} Wh" #: src/utils/units.rs:310 src/utils/units.rs:324 msgid "{} kWh" msgstr "{} kWh" #: src/utils/units.rs:311 src/utils/units.rs:325 msgid "{} MWh" msgstr "{} MWh" #: src/utils/units.rs:312 src/utils/units.rs:326 msgid "{} GWh" msgstr "{} GWh" #: src/utils/units.rs:313 src/utils/units.rs:327 msgid "{} TWh" msgstr "{} TWh" #: src/utils/units.rs:314 src/utils/units.rs:328 msgid "{} PWh" msgstr "{} PWh" #: src/utils/units.rs:315 src/utils/units.rs:329 msgid "{} EWh" msgstr "{} EWh" #: src/utils/units.rs:316 src/utils/units.rs:330 msgid "{} ZWh" msgstr "{} ZWh" #: src/utils/units.rs:317 src/utils/units.rs:331 msgid "{} YWh" msgstr "{} YWh" #: src/utils/units.rs:318 src/utils/units.rs:332 msgid "{} RWh" msgstr "{} RWh" #: src/utils/units.rs:319 src/utils/units.rs:333 msgid "{} QWh" msgstr "{} QWh" #: src/utils/drive.rs:128 src/utils/drive.rs:207 msgid "CD/DVD/Blu-ray Drive" msgstr "CD/DVD/Blu-ray-meghajtó" #: src/utils/drive.rs:129 msgid "eMMC Storage" msgstr "eMMC-tároló" #: src/utils/drive.rs:130 msgid "Flash Storage" msgstr "Flash-tároló" #: src/utils/drive.rs:131 src/utils/drive.rs:208 msgid "Floppy Drive" msgstr "Floppy-meghajtó" #: src/utils/drive.rs:132 msgid "Hard Disk Drive" msgstr "Merevlemez-meghajtó" #: src/utils/drive.rs:133 msgid "Loop Device" msgstr "Hurokeszköz" #: src/utils/drive.rs:134 msgid "Mapped Device" msgstr "Leképezett eszköz" #: src/utils/drive.rs:135 msgid "NVMe Drive" msgstr "NVMe-meghajtó" #: src/utils/drive.rs:137 msgid "Software Raid" msgstr "Szoftveres RAID" #: src/utils/drive.rs:138 msgid "RAM Disk" msgstr "RAM-lemez" #: src/utils/drive.rs:139 msgid "Solid State Drive" msgstr "Szilárdtest-meghajtó" #: src/utils/drive.rs:140 msgid "ZFS Volume" msgstr "ZFS-kötet" #: src/utils/drive.rs:141 msgid "Compressed RAM Disk (zram)" msgstr "Tömörített RAM-lemez (zram)" #: src/utils/drive.rs:209 msgid "{} Loop Device" msgstr "{} hurokeszköz" #: src/utils/drive.rs:210 msgid "{} Mapped Device" msgstr "{} leképezett eszköz" #: src/utils/drive.rs:211 msgid "{} RAID" msgstr "{} RAID" #: src/utils/drive.rs:212 msgid "{} RAM Disk" msgstr "{} RAM-lemez" #: src/utils/drive.rs:213 msgid "{} zram Device" msgstr "{} zram-eszköz" #: src/utils/drive.rs:214 msgid "{} ZFS Volume" msgstr "{} ZFS-kötet" #: src/utils/drive.rs:215 msgid "{} Drive" msgstr "{} meghajtó" #: src/utils/network.rs:123 msgid "Bluetooth Tether" msgstr "Bluetooth-alapú hálózatmegosztás" #: src/utils/network.rs:124 msgid "Network Bridge" msgstr "Hálózati híd" #: src/utils/network.rs:125 msgid "Ethernet Connection" msgstr "Ethernet-kapcsolat" #: src/utils/network.rs:126 msgid "Docker Bridge" msgstr "Docker-híd" #: src/utils/network.rs:127 msgid "InfiniBand Connection" msgstr "InfiniBand-kapcsolat" #: src/utils/network.rs:128 msgid "Serial Line IP Connection" msgstr "Soros vonali IP-kapcsolat" #: src/utils/network.rs:129 msgid "Virtual Ethernet Device" msgstr "Virtuális Ethernet-eszköz" #: src/utils/network.rs:130 msgid "VM Network Bridge" msgstr "VM hálózati híd" #: src/utils/network.rs:131 msgid "VPN Tunnel" msgstr "VPN-alagút" #: src/utils/network.rs:132 msgid "VPN Tunnel (WireGuard)" msgstr "VPN-alagút (WireGuard)" #: src/utils/network.rs:133 msgid "Wi-Fi Connection" msgstr "Wi-Fi-kapcsolat" #: src/utils/network.rs:134 msgid "WWAN Connection" msgstr "WWAN-kapcsolat" resources-1.9.1/po/it.po000066400000000000000000000553441510634446000151440ustar00rootroot00000000000000# # nokyan , 2023. # msgid "" msgstr "" "Project-Id-Version: resources\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2022-12-25 15:51+0100\n" "PO-Revision-Date: 2023-10-15 10:00+0200\n" "Last-Translator: l3nn4rt \n" "Language-Team: Unofficial Italian translators\n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.4\n" "X-Poedit-SourceCharset: UTF-8\n" #: data/net.nokyan.Resources.desktop.in.in:3 #: data/net.nokyan.Resources.metainfo.xml.in.in:4 src/application.rs:145 msgid "Resources" msgstr "Risorse" #: data/net.nokyan.Resources.desktop.in.in:4 #: data/net.nokyan.Resources.metainfo.xml.in.in:5 msgid "Monitor your system resources and processes" msgstr "Monitora risorse e processi del tuo sistema" #: data/net.nokyan.Resources.desktop.in.in:10 msgid "" "System;Resources;Monitor;Processes;Usage;Task;Manager;CPU;RAM;Memory;GPU;" msgstr "" "Sistema;Risorse;Monitor;Processi;Utilizzo;Attività;Gestore;CPU;RAM;Memoria;" "GPU;" #: data/net.nokyan.Resources.gschema.xml.in:6 msgid "Window width" msgstr "Larghezza finestra" #: data/net.nokyan.Resources.gschema.xml.in:10 msgid "Window height" msgstr "Altezza finestra" #: data/net.nokyan.Resources.gschema.xml.in:14 msgid "Window maximized state" msgstr "Stato finestra massimizzata" #: data/net.nokyan.Resources.gschema.xml.in:18 msgid "Temperature unit" msgstr "Unità per le temperature" #: data/net.nokyan.Resources.gschema.xml.in:22 msgid "Unit Prefix Base" msgstr "Base per unità dei prefissi" #: data/net.nokyan.Resources.gschema.xml.in:26 #: data/resources/ui/dialogs/settings_dialog.ui:48 msgid "Refresh Speed" msgstr "Velocità di aggiornamento" #: data/net.nokyan.Resources.metainfo.xml.in.in:14 msgid "" "Resources allows you to check the utilization of your system resources and " "control your running processes and applications. It’s designed to be user-" "friendly and feel right at home on a modern desktop by using GNOME’s " "libadwaita." msgstr "" "Risorse permette di controllare l'utilizzo delle risorse del tuo sistema e " "controllare i processi e le applicazioni in esecuzione. È progettato per " "essere user-friendly e ben integrato su moderni sistemi desktop che usando " "libadwaita di GNOME." #: data/net.nokyan.Resources.metainfo.xml.in.in:17 msgid "Resources supports monitoring the following components:" msgstr "Risorse supporta il monitoraggio delle seguenti componenti:" #: data/net.nokyan.Resources.metainfo.xml.in.in:21 src/ui/pages/cpu.rs:188 msgid "CPU" msgstr "CPU" #: data/net.nokyan.Resources.metainfo.xml.in.in:22 #: src/ui/pages/applications/mod.rs:251 src/ui/pages/memory.rs:85 #: src/ui/pages/memory.rs:151 src/ui/pages/processes/mod.rs:296 #: data/resources/ui/window.ui:155 data/resources/ui/window.ui:162 #: data/resources/ui/dialogs/app_dialog.ui:83 #: data/resources/ui/dialogs/process_dialog.ui:70 msgid "Memory" msgstr "Memoria" #: data/net.nokyan.Resources.metainfo.xml.in.in:23 src/ui/pages/gpu.rs:101 #: src/ui/window.rs:230 msgid "GPU" msgstr "GPU" #: data/net.nokyan.Resources.metainfo.xml.in.in:24 msgid "Network Interfaces" msgstr "Interfacce di rete" #: data/net.nokyan.Resources.metainfo.xml.in.in:25 msgid "Storage Devices" msgstr "Dispositivi di archiviazione" #: src/application.rs:147 msgid "The Nalux Team" msgstr "Team di Nalux" #: src/application.rs:155 msgid "Report Issues" msgstr "Segnala probelmi" #: src/application.rs:159 msgid "Icon by" msgstr "Icona da" #: src/ui/dialogs/app_dialog.rs:112 src/ui/dialogs/process_dialog.rs:108 #: src/ui/pages/drive.rs:214 src/ui/pages/drive.rs:220 msgid "No" msgstr "No" #: src/ui/dialogs/app_dialog.rs:113 src/ui/dialogs/process_dialog.rs:109 msgid "Yes (Flatpak)" msgstr "Sì (Flatpak)" #: src/ui/dialogs/process_dialog.rs:103 src/ui/dialogs/process_dialog.rs:105 #: src/ui/pages/cpu.rs:189 src/ui/pages/cpu.rs:201 src/ui/pages/cpu.rs:216 #: src/ui/pages/cpu.rs:222 src/ui/pages/cpu.rs:228 src/ui/pages/cpu.rs:234 #: src/ui/pages/cpu.rs:238 src/ui/pages/cpu.rs:241 src/ui/pages/cpu.rs:301 #: src/ui/pages/drive.rs:186 src/ui/pages/gpu.rs:177 src/ui/pages/gpu.rs:192 #: src/ui/pages/gpu.rs:210 src/ui/pages/gpu.rs:218 src/ui/pages/gpu.rs:224 #: src/ui/pages/gpu.rs:231 src/ui/pages/gpu.rs:238 src/ui/pages/gpu.rs:244 #: src/ui/pages/gpu.rs:250 src/ui/pages/memory.rs:183 #: src/ui/pages/memory.rs:187 src/ui/pages/memory.rs:191 #: src/ui/pages/memory.rs:245 src/ui/pages/network.rs:198 #: src/ui/pages/network.rs:205 src/ui/pages/network.rs:211 #: src/ui/pages/network.rs:217 src/ui/pages/network.rs:219 src/utils/gpu.rs:82 #: src/utils/gpu.rs:85 msgid "N/A" msgstr "N/A" #: src/ui/pages/applications/mod.rs:107 data/resources/ui/window.ui:62 #: data/resources/ui/window.ui:69 msgid "Applications" msgstr "Applicazioni" #: src/ui/pages/applications/mod.rs:228 msgid "Application" msgstr "Applicazione" #: src/ui/pages/applications/mod.rs:274 src/ui/pages/cpu.rs:102 #: src/ui/pages/processes/mod.rs:319 src/ui/window.rs:219 #: data/resources/ui/window.ui:124 data/resources/ui/window.ui:131 #: data/resources/ui/dialogs/app_dialog.ui:74 #: data/resources/ui/dialogs/process_dialog.ui:61 msgid "Processor" msgstr "Processore" #: src/ui/pages/applications/mod.rs:481 src/ui/pages/processes/mod.rs:506 msgid "Cancel" msgstr "Annulla" #: src/ui/pages/cpu.rs:200 msgid "CPU {}" msgstr "CPU {}" #: src/ui/pages/drive.rs:102 msgid "Drive" msgstr "Disco" #: src/ui/pages/drive.rs:175 msgid "Total Usage" msgstr "Utilizzo totale" #: src/ui/pages/drive.rs:180 src/ui/window.rs:310 msgid "CD/DVD/Blu-ray Drive" msgstr "CD/DVD/Disco Blu-ray" #: src/ui/pages/drive.rs:181 msgid "eMMC Storage" msgstr "Memoria eMMC" #: src/ui/pages/drive.rs:182 msgid "Flash Storage" msgstr "Memoria flash" #: src/ui/pages/drive.rs:183 src/ui/window.rs:311 msgid "Floppy Drive" msgstr "Disco floppy" #: src/ui/pages/drive.rs:184 msgid "Hard Disk Drive" msgstr "Disco rigido" #: src/ui/pages/drive.rs:185 msgid "NVMe Drive" msgstr "Memoria NVMe" #: src/ui/pages/drive.rs:187 msgid "Solid State Drive" msgstr "Disco a stato solido" #: src/ui/pages/drive.rs:212 src/ui/pages/drive.rs:218 msgid "Yes" msgstr "Sì" #: src/ui/pages/gpu.rs:170 msgid "GPU Usage" msgstr "Utilizzo GPU" #: src/ui/pages/gpu.rs:173 msgid "Video Memory Usage" msgstr "Utilizzo memoria video" #: src/ui/pages/memory.rs:154 msgid "Swap" msgstr "Swap" #: src/ui/pages/memory.rs:193 msgid "{} of {}" msgstr "{} of {}" #: src/ui/pages/network.rs:101 src/ui/window.rs:358 msgid "Network Interface" msgstr "Interfaccia di rete" #: src/ui/pages/network.rs:185 msgid "Receiving" msgstr "Ricezione" #: src/ui/pages/network.rs:189 msgid "Sending" msgstr "Invio" #: src/ui/pages/network.rs:268 src/ui/pages/network.rs:277 msgid "Highest:" msgstr "Più alto:" #: src/ui/pages/processes/mod.rs:111 data/resources/ui/window.ui:93 #: data/resources/ui/window.ui:100 msgid "Processes" msgstr "Processi" #: src/ui/pages/processes/mod.rs:232 msgid "Process" msgstr "Processo" #: src/ui/pages/processes/mod.rs:258 #: data/resources/ui/dialogs/process_dialog.ui:84 msgid "Process ID" msgstr "ID Processo" #: src/ui/pages/processes/mod.rs:277 #: data/resources/ui/dialogs/process_dialog.ui:102 msgid "User" msgstr "Utente" #: src/ui/pages/processes/mod.rs:542 msgid "root" msgstr "root" #: src/ui/window.rs:228 msgid "GPU {}" msgstr "GPU {}" #: src/ui/window.rs:312 msgid "{} Drive" msgstr "Disco da {}" #: src/ui/window.rs:351 msgid "Ethernet Connection" msgstr "Connessione Ethernet" #: src/ui/window.rs:352 msgid "InfiniBand Connection" msgstr "Connessione InfiniBand" #: src/ui/window.rs:353 msgid "Serial Line IP Connection" msgstr "Connessione Serial Line IP" #: src/ui/window.rs:354 msgid "Wi-Fi Connection" msgstr "Connessione Wi-Fi" #: src/ui/window.rs:355 msgid "WWAN Connection" msgstr "Connessione WWAN" #: src/ui/window.rs:356 msgid "Bluetooth Tether" msgstr "Condivisione Bluetooth" #: src/ui/window.rs:357 msgid "VPN Tunnel (WireGuard)" msgstr "Tunnel VPN (WireGuard)" #: src/ui/window.rs:504 msgid "End {}?" msgstr "Terminare {}?" #: src/ui/window.rs:505 msgid "Halt {}?" msgstr "Sospendere {}?" #: src/ui/window.rs:506 msgid "Kill {}?" msgstr "Uccidere {}?" #: src/ui/window.rs:507 msgid "Continue {}?" msgstr "Riprendere {}?" #: src/ui/window.rs:513 msgid "Unsaved work might be lost." msgstr "Il lavoro non salvato potrebbe andare perso." #: src/ui/window.rs:514 msgid "" "Halting an application can come with serious risks such as losing data and " "security implications. Use with caution." msgstr "" "Sospendere un'applicazione può causare perdita di dati e problemi di " "sicurezza. Usare con cautela." #: src/ui/window.rs:515 msgid "" "Killing an application can come with serious risks such as losing data and " "security implications. Use with caution." msgstr "" "Uccidere un'applicazione può causare perdita di dati e problemi di " "sicurezza. Usare con cautela." #: src/ui/window.rs:522 msgid "End application" msgstr "Termina applicazione" #: src/ui/window.rs:523 msgid "Halt application" msgstr "Sospendi applicazione" #: src/ui/window.rs:524 msgid "Kill application" msgstr "Uccidi applicazione" #: src/ui/window.rs:525 msgid "Continue application" msgstr "Riprendi applicazione" #: src/ui/window.rs:531 msgid "Successfully ended {}" msgstr "{} terminato con successo" #: src/ui/window.rs:532 msgid "Successfully halted {}" msgstr "{} sospeso con successo" #: src/ui/window.rs:533 msgid "Successfully killed {}" msgstr "{} ucciso con successo" #: src/ui/window.rs:534 msgid "Successfully continued {}" msgstr "{} ripreso con successo" #: src/ui/window.rs:541 msgid "There was a problem ending a process" msgid_plural "There were problems ending {} processes" msgstr[0] "C'è stato un problema nel terminare un processo" msgstr[1] "Ci sono stati problemi nel terminare {} processi" #: src/ui/window.rs:547 msgid "There was a problem halting a process" msgid_plural "There were problems halting {} processes" msgstr[0] "C'è stato un problema nel sospendere un processo" msgstr[1] "Ci sono stati problemi nel sospendere {} processi" #: src/ui/window.rs:553 msgid "There was a problem killing a process" msgid_plural "There were problems killing {} processes" msgstr[0] "C'è stato un problema nell'uccidere un processo" msgstr[1] "Ci sono stati problemi nell'uccidere {} processi" #: src/ui/window.rs:559 msgid "There was a problem continuing a process" msgid_plural "There were problems continuing {} processes" msgstr[0] "C'è stato un problema nel riprendere un processo" msgstr[1] "Ci sono stati problemi nel riprendere {} processi" #: src/ui/window.rs:569 msgid "There was a problem ending {}" msgstr "C'è stato un problema nel terminare {}" #: src/ui/window.rs:570 msgid "There was a problem halting {}" msgstr "C'è stato un problema nel sospendere {}" #: src/ui/window.rs:571 msgid "There was a problem killing {}" msgstr "C'è stato un problema nell'uccidere {}" #: src/ui/window.rs:572 msgid "There was a problem continuing {}" msgstr "C'è stato un problema nel riprendere {}" #: src/utils/app.rs:380 msgid "System Processes" msgstr "Processi di sistema" #: src/utils/units.rs:51 msgid "{} K" msgstr "{} K" #: src/utils/units.rs:53 msgid "{} °C" msgstr "{} °C" #: src/utils/units.rs:55 msgid "{} °F" msgstr "{} °F" #: src/utils/units.rs:73 src/utils/units.rs:87 src/utils/units.rs:107 #: src/utils/units.rs:121 msgid "{} B" msgstr "{} B" #: src/utils/units.rs:74 src/utils/units.rs:88 msgid "{} kB" msgstr "{} kB" #: src/utils/units.rs:75 src/utils/units.rs:89 msgid "{} MB" msgstr "{} MB" #: src/utils/units.rs:76 src/utils/units.rs:90 msgid "{} GB" msgstr "{} GB" #: src/utils/units.rs:77 src/utils/units.rs:91 msgid "{} TB" msgstr "{} TB" #: src/utils/units.rs:78 src/utils/units.rs:92 msgid "{} PB" msgstr "{} PB" #: src/utils/units.rs:79 src/utils/units.rs:93 msgid "{} EB" msgstr "{} EB" #: src/utils/units.rs:80 src/utils/units.rs:94 msgid "{} ZB" msgstr "{} ZB" #: src/utils/units.rs:81 src/utils/units.rs:95 msgid "{} YB" msgstr "{} YB" #: src/utils/units.rs:82 src/utils/units.rs:96 msgid "{} RB" msgstr "{} RB" #: src/utils/units.rs:83 src/utils/units.rs:97 msgid "{} QB" msgstr "{} QB" #: src/utils/units.rs:108 src/utils/units.rs:122 msgid "{} KiB" msgstr "{} KiB" #: src/utils/units.rs:109 src/utils/units.rs:123 msgid "{} MiB" msgstr "{} MiB" #: src/utils/units.rs:110 src/utils/units.rs:124 msgid "{} GiB" msgstr "{} GiB" #: src/utils/units.rs:111 src/utils/units.rs:125 msgid "{} TiB" msgstr "{} TiB" #: src/utils/units.rs:112 src/utils/units.rs:126 msgid "{} PiB" msgstr "{} PiB" #: src/utils/units.rs:113 src/utils/units.rs:127 msgid "{} EiB" msgstr "{} EiB" #: src/utils/units.rs:114 src/utils/units.rs:128 msgid "{} ZiB" msgstr "{} ZiB" #: src/utils/units.rs:115 src/utils/units.rs:129 msgid "{} YiB" msgstr "{} YiB" #: src/utils/units.rs:116 src/utils/units.rs:130 msgid "{} RiB" msgstr "{} RiB" #: src/utils/units.rs:117 src/utils/units.rs:131 msgid "{} QiB" msgstr "{} QiB" #: src/utils/units.rs:146 src/utils/units.rs:163 msgid "{} B/s" msgstr "{} B/s" #: src/utils/units.rs:147 msgid "{} kB/s" msgstr "{} kB/s" #: src/utils/units.rs:148 msgid "{} MB/s" msgstr "{} MB/s" #: src/utils/units.rs:149 msgid "{} GB/s" msgstr "{} GB/s" #: src/utils/units.rs:150 msgid "{} TB/s" msgstr "{} TB/s" #: src/utils/units.rs:151 msgid "{} PB/s" msgstr "{} PB/s" #: src/utils/units.rs:152 msgid "{} EB/s" msgstr "{} EB/s" #: src/utils/units.rs:153 msgid "{} ZB/s" msgstr "{} ZB/s" #: src/utils/units.rs:154 msgid "{} YB/s" msgstr "{} YB/s" #: src/utils/units.rs:155 msgid "{} RB/s" msgstr "{} RB/s" #: src/utils/units.rs:156 msgid "{} QB/s" msgstr "{} QB/s" #: src/utils/units.rs:164 msgid "{} KiB/s" msgstr "{} KiB/s" #: src/utils/units.rs:165 msgid "{} MiB/s" msgstr "{} MiB/s" #: src/utils/units.rs:166 msgid "{} GiB/s" msgstr "{} GiB/s" #: src/utils/units.rs:167 msgid "{} TiB/s" msgstr "{} TiB/s" #: src/utils/units.rs:168 msgid "{} PiB/s" msgstr "{} PiB/s" #: src/utils/units.rs:169 msgid "{} EiB/s" msgstr "{} EiB/s" #: src/utils/units.rs:170 msgid "{} ZiB/s" msgstr "{} ZiB/s" #: src/utils/units.rs:171 msgid "{} YiB/s" msgstr "{} YiB/s" #: src/utils/units.rs:172 msgid "{} RiB/s" msgstr "{} RiB/s" #: src/utils/units.rs:173 msgid "{} QiB/s" msgstr "{} QiB/s" #: src/utils/units.rs:180 msgid "{} Hz" msgstr "{} Hz" #: src/utils/units.rs:181 msgid "{} kHz" msgstr "{} kHz" #: src/utils/units.rs:182 msgid "{} MHz" msgstr "{} MHz" #: src/utils/units.rs:183 msgid "{} GHz" msgstr "{} GHz" #: src/utils/units.rs:184 msgid "{} THz" msgstr "{} THz" #: src/utils/units.rs:185 msgid "{} PHz" msgstr "{} PHz" #: src/utils/units.rs:186 msgid "{} EHz" msgstr "{} EHz" #: src/utils/units.rs:187 msgid "{} ZHz" msgstr "{} ZHz" #: src/utils/units.rs:188 msgid "{} YHz" msgstr "{} YHz" #: src/utils/units.rs:189 msgid "{} RHz" msgstr "{} RHz" #: src/utils/units.rs:190 msgid "{} QHz" msgstr "{} QHz" #: src/utils/units.rs:197 msgid "{} W" msgstr "{} W" #: src/utils/units.rs:198 msgid "{} kW" msgstr "{} kW" #: src/utils/units.rs:199 msgid "{} MW" msgstr "{} MW" #: src/utils/units.rs:200 msgid "{} GW" msgstr "{} GW" #: src/utils/units.rs:201 msgid "{} TW" msgstr "{} TW" #: src/utils/units.rs:202 msgid "{} PW" msgstr "{} PW" #: src/utils/units.rs:203 msgid "{} EW" msgstr "{} EW" #: src/utils/units.rs:204 msgid "{} ZW" msgstr "{} ZW" #: src/utils/units.rs:205 msgid "{} YW" msgstr "{} YW" #: src/utils/units.rs:206 msgid "{} RW" msgstr "{} RW" #: src/utils/units.rs:207 msgid "{} QW" msgstr "{} QW" #: data/resources/ui/shortcuts.ui:11 msgctxt "shortcut window" msgid "General" msgstr "Generale" #: data/resources/ui/shortcuts.ui:14 msgctxt "shortcut window" msgid "Show Shortcuts" msgstr "Mostra scorciatoie" #: data/resources/ui/shortcuts.ui:20 msgctxt "shortcut window" msgid "Quit" msgstr "Chiudi" #: data/resources/ui/window.ui:6 msgid "Preferences" msgstr "Preferenze" #: data/resources/ui/window.ui:10 msgid "Keyboard Shortcuts" msgstr "Scorciatoie dal tastiera" #: data/resources/ui/window.ui:14 msgid "About Resources" msgstr "A proposito di Risorse" #: data/resources/ui/dialogs/app_dialog.ui:9 msgid "Application Information" msgstr "Informazioni applicazione" #: data/resources/ui/dialogs/app_dialog.ui:71 #: data/resources/ui/dialogs/process_dialog.ui:54 #: data/resources/ui/pages/cpu.ui:42 data/resources/ui/pages/cpu.ui:55 #: data/resources/ui/pages/drive.ui:22 data/resources/ui/pages/gpu.ui:22 #: data/resources/ui/pages/memory.ui:31 data/resources/ui/pages/network.ui:22 msgid "Usage" msgstr "Utilizzo" #: data/resources/ui/dialogs/app_dialog.ui:94 #: data/resources/ui/dialogs/process_dialog.ui:77 #: data/resources/ui/pages/cpu.ui:91 data/resources/ui/pages/drive.ui:48 #: data/resources/ui/pages/gpu.ui:74 data/resources/ui/pages/memory.ui:42 #: data/resources/ui/pages/network.ui:51 msgid "Properties" msgstr "Proprietà" #: data/resources/ui/dialogs/app_dialog.ui:100 msgid "ID" msgstr "ID" #: data/resources/ui/dialogs/app_dialog.ui:109 msgid "Running Processes" msgstr "Processi in esecuzione" #: data/resources/ui/dialogs/app_dialog.ui:118 #: data/resources/ui/dialogs/process_dialog.ui:120 msgid "Containerized" msgstr "Containerizzato" #: data/resources/ui/dialogs/process_dialog.ui:9 msgid "Process Information" msgstr "Informazioni processo" #: data/resources/ui/dialogs/process_dialog.ui:93 msgid "Commandline" msgstr "Riga di comando" #: data/resources/ui/dialogs/process_dialog.ui:111 msgid "Control Group" msgstr "Gruppo di controllo" #: data/resources/ui/dialogs/settings_dialog.ui:10 msgid "General" msgstr "Generale" #: data/resources/ui/dialogs/settings_dialog.ui:13 msgid "Units" msgstr "Unità" #: data/resources/ui/dialogs/settings_dialog.ui:16 msgid "Data Unit Prefix" msgstr "Prefisso unità per i dati" #: data/resources/ui/dialogs/settings_dialog.ui:20 msgid "Decimal" msgstr "Decimale" #: data/resources/ui/dialogs/settings_dialog.ui:21 msgid "Binary" msgstr "Binario" #: data/resources/ui/dialogs/settings_dialog.ui:29 msgid "Temperature Unit" msgstr "Unità per le temperature" #: data/resources/ui/dialogs/settings_dialog.ui:33 msgid "Celsius" msgstr "Celsius" #: data/resources/ui/dialogs/settings_dialog.ui:34 msgid "Kelvin" msgstr "Kelvin" #: data/resources/ui/dialogs/settings_dialog.ui:35 msgid "Fahrenheit" msgstr "Fahrenheit" #: data/resources/ui/dialogs/settings_dialog.ui:45 msgid "User Interface" msgstr "Interfaccia utente" #: data/resources/ui/dialogs/settings_dialog.ui:52 msgid "Very Slow" msgstr "Molto lento" #: data/resources/ui/dialogs/settings_dialog.ui:53 msgid "Slow" msgstr "Lento" #: data/resources/ui/dialogs/settings_dialog.ui:54 msgid "Normal" msgstr "Normale" #: data/resources/ui/dialogs/settings_dialog.ui:55 msgid "Fast" msgstr "Veloce" #: data/resources/ui/dialogs/settings_dialog.ui:56 msgid "Very Fast" msgstr "Molto veloce" #: data/resources/ui/pages/applications.ui:6 msgid "Kill Application" msgstr "Uccidi applicazione" #: data/resources/ui/pages/applications.ui:10 msgid "Halt Application" msgstr "Sospendi applicazione" #: data/resources/ui/pages/applications.ui:14 msgid "Continue Application" msgstr "Riprendi applicazione" #: data/resources/ui/pages/applications.ui:81 msgid "End Application" msgstr "Termina applicazione" #: data/resources/ui/pages/cpu.ui:22 msgid "Options" msgstr "Opzioni" #: data/resources/ui/pages/cpu.ui:26 msgid "Show Usages of Logical CPUs" msgstr "Mostra utilizzo delle CPU logiche" #: data/resources/ui/pages/cpu.ui:77 data/resources/ui/pages/gpu.ui:60 msgid "Sensors" msgstr "Sensori" #: data/resources/ui/pages/cpu.ui:84 data/resources/ui/pages/gpu.ui:63 msgid "Temperature" msgstr "Temperatura" #: data/resources/ui/pages/cpu.ui:98 msgid "Max Frequency" msgstr "Frequenza massima" #: data/resources/ui/pages/cpu.ui:107 msgid "Logical Cores" msgstr "Core logici" #: data/resources/ui/pages/cpu.ui:116 msgid "Physical Cores" msgstr "Core fisici" #: data/resources/ui/pages/cpu.ui:125 msgid "Sockets" msgstr "Socket" #: data/resources/ui/pages/cpu.ui:134 msgid "Virtualization" msgstr "Virtualizzazione" #: data/resources/ui/pages/cpu.ui:143 msgid "Architecture" msgstr "Architettura" #: data/resources/ui/pages/drive.ui:28 msgid "Read Speed" msgstr "Velocità di lettura" #: data/resources/ui/pages/drive.ui:37 msgid "Write Speed" msgstr "Velocità di scrittura" #: data/resources/ui/pages/drive.ui:51 data/resources/ui/pages/memory.ui:72 msgid "Type" msgstr "Tipo" #: data/resources/ui/pages/drive.ui:60 msgid "Device" msgstr "Dispositivo" #: data/resources/ui/pages/drive.ui:69 msgid "Capacity" msgstr "Capacità" #: data/resources/ui/pages/drive.ui:78 msgid "Writable" msgstr "Scrivibile" #: data/resources/ui/pages/drive.ui:87 msgid "Removable" msgstr "Removibile" #: data/resources/ui/pages/gpu.ui:31 msgid "GPU Frequency" msgstr "Frequenza GPU" #: data/resources/ui/pages/gpu.ui:44 msgid "Video Memory Frequency" msgstr "Frequenza memoria video" #: data/resources/ui/pages/gpu.ui:49 msgid "Power Usage" msgstr "Potenza assorbita" #: data/resources/ui/pages/gpu.ui:81 data/resources/ui/pages/network.ui:58 msgid "Manufacturer" msgstr "Produttore" #: data/resources/ui/pages/gpu.ui:90 msgid "PCI Slot" msgstr "Slot PCI" #: data/resources/ui/pages/gpu.ui:99 data/resources/ui/pages/network.ui:67 msgid "Driver Used" msgstr "Driver in uso" #: data/resources/ui/pages/gpu.ui:108 msgid "Current Power Cap" msgstr "Limite attuale di potenza" #: data/resources/ui/pages/gpu.ui:117 msgid "Max Power Cap" msgstr "Limite massimo di potenza" #: data/resources/ui/pages/memory.ui:9 msgid "You need to authenticate to see memory properties" msgstr "Autenticazione necessaria per visualizzare le proprietà della memoria" #: data/resources/ui/pages/memory.ui:10 msgid "Authenticate" msgstr "Autenticati" #: data/resources/ui/pages/memory.ui:45 msgid "Slots Used" msgstr "Slot utilizzati" #: data/resources/ui/pages/memory.ui:54 msgid "Speed" msgstr "Velocità" #: data/resources/ui/pages/memory.ui:63 msgid "Form Factor" msgstr "Form factor" #: data/resources/ui/pages/memory.ui:81 msgid "Type Detail" msgstr "Dettagli di tipo" #: data/resources/ui/pages/network.ui:35 msgid "Total Received" msgstr "Totale ricevuti" #: data/resources/ui/pages/network.ui:44 msgid "Total Sent" msgstr "Totale inviati" #: data/resources/ui/pages/network.ui:76 msgid "Interface" msgstr "Interfaccia" #: data/resources/ui/pages/network.ui:85 msgid "Hardware Address" msgstr "Indirizzo fisico" #: data/resources/ui/pages/processes.ui:6 msgid "Kill Process" msgstr "Uccidi processo" #: data/resources/ui/pages/processes.ui:10 msgid "Halt Process" msgstr "Sospendi processo" #: data/resources/ui/pages/processes.ui:14 msgid "Continue Process" msgstr "Riprendi processo" #: data/resources/ui/pages/processes.ui:81 msgid "End Process" msgstr "Termina processo" resources-1.9.1/po/its/000077500000000000000000000000001510634446000147545ustar00rootroot00000000000000resources-1.9.1/po/its/polkit.its000066400000000000000000000004651510634446000170040ustar00rootroot00000000000000 resources-1.9.1/po/its/polkit.loc000066400000000000000000000003031510634446000167510ustar00rootroot00000000000000 resources-1.9.1/po/ja.po000066400000000000000000001447121510634446000151200ustar00rootroot00000000000000# Japanese translation of Resources. # Copyright (C) 2025 Resources's COPYRIGHT HOLDER # This file is distributed under the same license as the Resources package. # Gnuey56 , 2024-2025. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-10-19 13:51+0200\n" "PO-Revision-Date: 2025-01-16 18:48+0900\n" "Last-Translator: Gnuey56 \n" "Language-Team: \n" "Language: ja\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Poedit 3.5\n" #: data/net.nokyan.Resources.desktop.in.in:3 #: data/net.nokyan.Resources.metainfo.xml.in.in:4 src/application.rs:262 #: data/resources/ui/window.ui:22 msgid "Resources" msgstr "Resources" #. Translators: The summary should be 35 characters or less according to Flathub appstream guidelines #: data/net.nokyan.Resources.desktop.in.in:4 #: data/net.nokyan.Resources.metainfo.xml.in.in:5 msgid "Keep an eye on system resources" msgstr "システムリソースを監視" #: data/net.nokyan.Resources.desktop.in.in:10 msgid "" "System;Resources;Monitor;Processes;Usage;Task;Manager;CPU;RAM;Memory;GPU;" msgstr "" "System;Resources;Monitor;Processes;Usage;Task;Manager;CPU;RAM;Memory;GPU;シス" "テム;リソース;モニター;プロセス;使用量;タスク;マネージャー;メモリー;" #: data/net.nokyan.Resources.metainfo.xml.in.in:17 msgid "" "Resources allows you to check the utilization of your system resources and " "control your running processes and apps. It’s designed to be user-friendly " "and feel right at home on a modern desktop by using GNOME’s libadwaita." msgstr "" "Resource を使うことで、お使いのシステムのリソース使用率をチェックしたり、実行" "中のプロセスやアプリをコントロールすることができます。Resource は、GNOME の " "libadwaita を使用することで、ユーザーフレンドリーでモダンなデスクトップ上では" "心地よく使用できるように設計されています。" #: data/net.nokyan.Resources.metainfo.xml.in.in:20 msgid "Resources supports monitoring the following components:" msgstr "Resources は以下の項目のモニタリングに対応:" #: data/net.nokyan.Resources.metainfo.xml.in.in:24 msgid "CPU" msgstr "CPU" #: data/net.nokyan.Resources.metainfo.xml.in.in:25 #: src/ui/pages/applications/mod.rs:811 src/ui/pages/memory.rs:105 #: src/ui/pages/memory.rs:186 src/ui/pages/processes/mod.rs:1087 #: data/resources/ui/window.ui:158 data/resources/ui/window.ui:165 #: data/resources/ui/dialogs/app_dialog.ui:82 #: data/resources/ui/dialogs/process_dialog.ui:64 #: data/resources/ui/dialogs/settings_dialog.ui:133 #: data/resources/ui/dialogs/settings_dialog.ui:220 msgid "Memory" msgstr "メモリー" #: data/net.nokyan.Resources.metainfo.xml.in.in:26 #: src/ui/pages/applications/mod.rs:1184 src/ui/pages/gpu.rs:114 #: src/ui/pages/processes/mod.rs:1471 src/ui/window.rs:311 #: data/resources/ui/dialogs/app_dialog.ui:140 #: data/resources/ui/dialogs/process_dialog.ui:118 #: data/resources/ui/dialogs/settings_dialog.ui:163 #: data/resources/ui/dialogs/settings_dialog.ui:250 msgid "GPU" msgstr "GPU" #: data/net.nokyan.Resources.metainfo.xml.in.in:27 #: data/resources/ui/dialogs/settings_dialog.ui:314 msgid "Network Interfaces" msgstr "ネットワークインターフェイス" #: data/net.nokyan.Resources.metainfo.xml.in.in:28 msgid "Storage Devices" msgstr "ストレージデバイス" #: data/net.nokyan.Resources.metainfo.xml.in.in:29 msgid "Batteries" msgstr "バッテリー" #: data/net.nokyan.Resources.metainfo.xml.in.in:51 msgid "Apps page in light theme" msgstr "「アプリ」のページ(ライトテーマ)" #: data/net.nokyan.Resources.metainfo.xml.in.in:55 msgid "Processes page in dark theme" msgstr "「プロセス」のページ(ダークテーマ)" #: data/net.nokyan.Resources.metainfo.xml.in.in:59 msgid "Processor page in light theme" msgstr "「プロセッサ」のページ(ライトテーマ)" #: data/net.nokyan.Resources.metainfo.xml.in.in:63 msgid "Memory page in dark theme" msgstr "「メモリー」のページ(ダークテーマ)" #: data/net.nokyan.Resources.metainfo.xml.in.in:67 msgid "GPU page in light theme" msgstr "「GPU」のページ(ライトテーマ)" #: data/net.nokyan.Resources.metainfo.xml.in.in:71 msgid "Drive page in dark theme" msgstr "「ドライブ」のページ(ダークテーマ)" #: data/net.nokyan.Resources.metainfo.xml.in.in:75 msgid "Network Interface page in light theme" msgstr "「ネットワークインターフェイス」のページ(ライトテーマ)" #: data/net.nokyan.Resources.metainfo.xml.in.in:79 msgid "Battery page in dark theme" msgstr "「バッテリー」のページ(ダークテーマ)" #: src/application.rs:264 msgid "The Nalux Team" msgstr "The Nalux Team" #: src/application.rs:272 msgid "Report Issues" msgstr "問題を報告" #. Translator credits. Replace "translator-credits" with your name/username, and optionally an email or URL. #. One name per line, please do not remove previous names. #: src/application.rs:278 msgid "translator-credits" msgstr "Gnuey56 " #: src/application.rs:279 msgid "Icon by" msgstr "アイコン作成者" #: src/ui/dialogs/app_dialog.rs:148 src/ui/dialogs/process_dialog.rs:127 #: src/ui/dialogs/process_dialog.rs:131 src/ui/dialogs/process_dialog.rs:140 #: src/ui/dialogs/process_dialog.rs:142 src/ui/dialogs/process_dialog.rs:163 #: src/ui/dialogs/process_dialog.rs:170 src/ui/dialogs/process_dialog.rs:177 #: src/ui/dialogs/process_dialog.rs:184 src/ui/pages/applications/mod.rs:954 #: src/ui/pages/applications/mod.rs:1078 src/ui/pages/battery.rs:196 #: src/ui/pages/battery.rs:216 src/ui/pages/battery.rs:222 #: src/ui/pages/battery.rs:225 src/ui/pages/battery.rs:251 #: src/ui/pages/battery.rs:275 src/ui/pages/battery.rs:277 #: src/ui/pages/battery.rs:287 src/ui/pages/cpu.rs:218 src/ui/pages/cpu.rs:233 #: src/ui/pages/cpu.rs:248 src/ui/pages/cpu.rs:254 src/ui/pages/cpu.rs:260 #: src/ui/pages/cpu.rs:266 src/ui/pages/cpu.rs:270 src/ui/pages/cpu.rs:273 #: src/ui/pages/cpu.rs:370 src/ui/pages/drive.rs:298 src/ui/pages/drive.rs:329 #: src/ui/pages/drive.rs:331 src/ui/pages/drive.rs:360 #: src/ui/pages/drive.rs:362 src/ui/pages/drive.rs:378 #: src/ui/pages/drive.rs:379 src/ui/pages/drive.rs:386 #: src/ui/pages/drive.rs:396 src/ui/pages/drive.rs:406 src/ui/pages/gpu.rs:227 #: src/ui/pages/gpu.rs:267 src/ui/pages/gpu.rs:292 src/ui/pages/gpu.rs:295 #: src/ui/pages/gpu.rs:306 src/ui/pages/gpu.rs:326 src/ui/pages/gpu.rs:338 #: src/ui/pages/gpu.rs:352 src/ui/pages/gpu.rs:354 src/ui/pages/gpu.rs:366 #: src/ui/pages/gpu.rs:373 src/ui/pages/gpu.rs:377 src/ui/pages/memory.rs:221 #: src/ui/pages/memory.rs:222 src/ui/pages/memory.rs:226 #: src/ui/pages/memory.rs:227 src/ui/pages/memory.rs:231 #: src/ui/pages/memory.rs:232 src/ui/pages/memory.rs:260 #: src/ui/pages/memory.rs:317 src/ui/pages/network.rs:230 #: src/ui/pages/network.rs:237 src/ui/pages/network.rs:244 #: src/ui/pages/network.rs:250 src/ui/pages/network.rs:253 #: src/ui/pages/network.rs:314 src/ui/pages/network.rs:317 #: src/ui/pages/network.rs:319 src/ui/pages/network.rs:348 #: src/ui/pages/network.rs:351 src/ui/pages/network.rs:353 #: src/ui/pages/npu.rs:201 src/ui/pages/npu.rs:230 src/ui/pages/npu.rs:248 #: src/ui/pages/npu.rs:260 src/ui/pages/npu.rs:274 src/ui/pages/npu.rs:276 #: src/ui/pages/npu.rs:288 src/ui/pages/npu.rs:295 src/ui/pages/npu.rs:299 #: src/ui/pages/processes/mod.rs:1229 src/ui/pages/processes/mod.rs:1295 #: src/ui/pages/processes/mod.rs:1361 src/ui/pages/processes/mod.rs:1427 #: src/ui/pages/processes/mod.rs:1909 src/ui/pages/processes/mod.rs:1911 #: src/utils/battery.rs:136 src/utils/drive.rs:89 src/utils/gpu/mod.rs:274 #: src/utils/gpu/mod.rs:280 src/utils/npu/mod.rs:241 src/utils/npu/mod.rs:247 msgid "N/A" msgstr "なし" #: src/ui/dialogs/process_options_dialog.rs:141 src/ui/pages/cpu.rs:232 #: src/ui/pages/cpu.rs:354 src/ui/pages/cpu.rs:358 msgid "CPU {}" msgstr "CPU {}" #: src/ui/pages/applications/application_entry.rs:183 src/ui/pages/drive.rs:393 #: src/ui/pages/drive.rs:403 src/ui/pages/processes/process_entry.rs:204 msgid "No" msgstr "いいえ" #: src/ui/pages/applications/application_entry.rs:184 #: src/ui/pages/processes/process_entry.rs:205 msgid "Yes (Flatpak)" msgstr "はい (Flatpak)" #: src/ui/pages/applications/application_entry.rs:185 #: src/ui/pages/processes/process_entry.rs:206 msgid "Yes (Snap)" msgstr "はい (Snap)" #: src/ui/pages/applications/mod.rs:134 data/resources/ui/window.ui:65 #: data/resources/ui/window.ui:72 #: data/resources/ui/dialogs/settings_dialog.ui:127 msgid "Apps" msgstr "アプリ" #. -1 because we don't want to count System Processes #: src/ui/pages/applications/mod.rs:668 msgid "Running Apps: {}" msgstr "実行中のアプリ: {}" #: src/ui/pages/applications/mod.rs:708 src/ui/pages/processes/mod.rs:870 msgid "Cancel" msgstr "キャンセル" #: src/ui/pages/applications/mod.rs:754 msgid "App" msgstr "アプリ" #: src/ui/pages/applications/mod.rs:870 src/ui/pages/cpu.rs:122 #: src/ui/pages/processes/mod.rs:1145 src/ui/window.rs:403 #: data/resources/ui/window.ui:127 data/resources/ui/window.ui:134 #: data/resources/ui/dialogs/app_dialog.ui:73 #: data/resources/ui/dialogs/process_dialog.ui:55 #: data/resources/ui/dialogs/settings_dialog.ui:138 #: data/resources/ui/dialogs/settings_dialog.ui:225 msgid "Processor" msgstr "プロセッサー" #: src/ui/pages/applications/mod.rs:933 src/ui/pages/processes/mod.rs:1208 #: data/resources/ui/dialogs/app_dialog.ui:100 #: data/resources/ui/dialogs/process_dialog.ui:78 #: data/resources/ui/dialogs/settings_dialog.ui:143 #: data/resources/ui/dialogs/settings_dialog.ui:230 msgid "Drive Read" msgstr "ドライブ読み取り" #: src/ui/pages/applications/mod.rs:997 src/ui/pages/processes/mod.rs:1274 #: data/resources/ui/dialogs/app_dialog.ui:109 #: data/resources/ui/dialogs/process_dialog.ui:87 #: data/resources/ui/dialogs/settings_dialog.ui:148 #: data/resources/ui/dialogs/settings_dialog.ui:235 msgid "Drive Read Total" msgstr "ドライブ読み取りの合計" #: src/ui/pages/applications/mod.rs:1057 src/ui/pages/processes/mod.rs:1340 #: data/resources/ui/dialogs/app_dialog.ui:118 #: data/resources/ui/dialogs/process_dialog.ui:96 #: data/resources/ui/dialogs/settings_dialog.ui:153 #: data/resources/ui/dialogs/settings_dialog.ui:240 msgid "Drive Write" msgstr "ドライブ書き込み" #: src/ui/pages/applications/mod.rs:1123 src/ui/pages/processes/mod.rs:1406 #: data/resources/ui/dialogs/app_dialog.ui:127 #: data/resources/ui/dialogs/process_dialog.ui:105 #: data/resources/ui/dialogs/settings_dialog.ui:158 #: data/resources/ui/dialogs/settings_dialog.ui:245 msgid "Drive Write Total" msgstr "ドライブ書き込みの合計" #: src/ui/pages/applications/mod.rs:1242 src/ui/pages/processes/mod.rs:1529 #: data/resources/ui/dialogs/app_dialog.ui:158 #: data/resources/ui/dialogs/process_dialog.ui:136 #: data/resources/ui/dialogs/settings_dialog.ui:173 #: data/resources/ui/dialogs/settings_dialog.ui:260 msgid "Video Encoder" msgstr "ビデオエンコーダー" #: src/ui/pages/applications/mod.rs:1302 src/ui/pages/processes/mod.rs:1589 #: data/resources/ui/dialogs/app_dialog.ui:167 #: data/resources/ui/dialogs/process_dialog.ui:145 #: data/resources/ui/dialogs/settings_dialog.ui:178 #: data/resources/ui/dialogs/settings_dialog.ui:265 msgid "Video Decoder" msgstr "ビデオデコーダー" #: src/ui/pages/applications/mod.rs:1361 src/ui/pages/processes/mod.rs:1649 #: data/resources/ui/dialogs/app_dialog.ui:149 #: data/resources/ui/dialogs/process_dialog.ui:127 #: data/resources/ui/dialogs/settings_dialog.ui:168 #: data/resources/ui/dialogs/settings_dialog.ui:255 msgid "Video Memory" msgstr "ビデオメモリー" #: src/ui/pages/applications/mod.rs:1419 src/ui/pages/memory.rs:192 #: src/ui/pages/processes/mod.rs:1952 #: data/resources/ui/dialogs/app_dialog.ui:91 #: data/resources/ui/dialogs/process_dialog.ui:73 #: data/resources/ui/dialogs/settings_dialog.ui:183 #: data/resources/ui/dialogs/settings_dialog.ui:290 msgid "Swap" msgstr "スワップ" #: src/ui/pages/applications/mod.rs:1477 src/ui/pages/processes/mod.rs:2009 msgid "End {}?" msgstr "{} を終了しますか?" #: src/ui/pages/applications/mod.rs:1478 src/ui/pages/processes/mod.rs:2010 msgid "Halt {}?" msgstr "{} を停止しますか?" #: src/ui/pages/applications/mod.rs:1479 src/ui/pages/processes/mod.rs:2011 msgid "Kill {}?" msgstr "{} を強制終了しますか?" #: src/ui/pages/applications/mod.rs:1480 src/ui/pages/processes/mod.rs:2012 msgid "Continue {}?" msgstr "{} を再開しますか?" #: src/ui/pages/applications/mod.rs:1486 src/ui/pages/processes/mod.rs:2047 msgid "Unsaved work might be lost." msgstr "保存されていない作業内容は失われます。" #: src/ui/pages/applications/mod.rs:1487 msgid "" "Halting an app can come with serious risks such as losing data and security " "implications. Use with caution." msgstr "" "アプリを停止すると、データの損失やセキュリティ上の問題等が生じるリスクがあり" "ます。注意して続行してください。" #: src/ui/pages/applications/mod.rs:1488 msgid "" "Killing an app can come with serious risks such as losing data and security " "implications. Use with caution." msgstr "" "アプリを強制終了すると、データの損失やセキュリティ上の問題等が生じるリスクが" "あります。注意して続行してください。" #: src/ui/pages/applications/mod.rs:1495 #: data/resources/ui/pages/applications.ui:22 #: data/resources/ui/pages/applications.ui:127 msgid "End App" msgstr "アプリを終了" #: src/ui/pages/applications/mod.rs:1496 #: data/resources/ui/pages/applications.ui:10 #: data/resources/ui/pages/applications.ui:30 msgid "Halt App" msgstr "アプリを停止" #: src/ui/pages/applications/mod.rs:1497 #: data/resources/ui/pages/applications.ui:6 #: data/resources/ui/pages/applications.ui:26 msgid "Kill App" msgstr "アプリを強制終了" #: src/ui/pages/applications/mod.rs:1498 #: data/resources/ui/pages/applications.ui:14 #: data/resources/ui/pages/applications.ui:34 msgid "Continue App" msgstr "アプリを再開" #: src/ui/pages/battery.rs:101 src/ui/pages/drive.rs:122 msgid "Drive" msgstr "ドライブ" #: src/ui/pages/battery.rs:201 msgid "Battery Charge" msgstr "バッテリー充電" #: src/ui/pages/battery.rs:208 data/resources/ui/pages/gpu.ui:55 #: data/resources/ui/pages/npu.ui:49 msgid "Power Usage" msgstr "電源消費量" #: src/ui/pages/battery.rs:265 src/ui/pages/drive.rs:323 #: src/ui/pages/drive.rs:354 src/ui/pages/network.rs:306 #: src/ui/pages/network.rs:340 msgid "Highest:" msgstr "最高:" #: src/ui/pages/cpu.rs:217 src/ui/pages/gpu.rs:198 src/ui/pages/npu.rs:189 msgid "Total Usage" msgstr "合計使用量" #: src/ui/pages/drive.rs:224 msgid "Drive Activity" msgstr "ドライブの活動" #: src/ui/pages/drive.rs:231 msgid "Read Speed" msgstr "読み取り速度" #: src/ui/pages/drive.rs:235 msgid "Write Speed" msgstr "書き込み速度" #: src/ui/pages/drive.rs:391 src/ui/pages/drive.rs:401 msgid "Yes" msgstr "はい" #. Translators: This is an abbreviation for "Read" and "Write". This is displayed in the sidebar so your #. translation should preferably be quite short or an abbreviation #: src/ui/pages/drive.rs:413 msgid "R: {} · W: {}" msgstr "読: {} · 書: {}" #: src/ui/pages/gpu.rs:206 msgid "Video Encoder/Decoder Usage" msgstr "ビデオエンコーダー/デコーダーの使用量" #: src/ui/pages/gpu.rs:212 msgid "Video Encoder Usage" msgstr "ビデオエンコーダーの使用量" #: src/ui/pages/gpu.rs:217 msgid "Video Decoder Usage" msgstr "ビデオデコーダーの使用量" #: src/ui/pages/gpu.rs:222 msgid "Video Memory Usage" msgstr "ビデオメモリーの使用量" #. Translators: This will be displayed in the sidebar, please try to keep your translation as short as (or even #. shorter than) 'Memory' #: src/ui/pages/gpu.rs:385 src/ui/pages/npu.rs:307 msgid "Memory: {}" msgstr "メモリー: {}" #: src/ui/pages/memory.rs:256 msgid "{} of {}" msgstr "{} / {}" #: src/ui/pages/memory.rs:259 msgid "{} MT/s" msgstr "{} MT/s" #. Translators: This will be displayed in the sidebar, so your translation for "Swap" should #. preferably be quite short or an abbreviation #: src/ui/pages/memory.rs:336 msgid "{} / {} · Swap: {} %" msgstr "{} / {} · スワップ: {} %" #: src/ui/pages/network.rs:114 src/utils/network.rs:128 msgid "Network Interface" msgstr "ネットワークインターフェイス" #: src/ui/pages/network.rs:218 msgid "Receiving" msgstr "受信" #: src/ui/pages/network.rs:222 msgid "Sending" msgstr "送信" #. Translators: This is an abbreviation for "Receive" and "Send". This is displayed in the sidebar so #. your translation should preferably be quite short or an abbreviation #: src/ui/pages/network.rs:363 msgid "R: {} · S: {}" msgstr "受: {} · 送: {}" #: src/ui/pages/npu.rs:105 src/ui/window.rs:343 msgid "NPU" msgstr "NPU" #: src/ui/pages/npu.rs:196 msgid "Memory Usage" msgstr "メモリーの使用量" #: src/ui/pages/processes/mod.rs:178 data/resources/ui/window.ui:96 #: data/resources/ui/window.ui:103 #: data/resources/ui/dialogs/settings_dialog.ui:193 msgid "Processes" msgstr "プロセス" #: src/ui/pages/processes/mod.rs:523 src/ui/pages/processes/mod.rs:2056 #: data/resources/ui/pages/processes.ui:38 #: data/resources/ui/pages/processes.ui:186 msgid "End Process" msgstr "プロセスを終了" #: src/ui/pages/processes/mod.rs:527 data/resources/ui/pages/processes.ui:70 msgid "End Processes" msgstr "プロセスを終了" #: src/ui/pages/processes/mod.rs:821 msgid "Running Processes: {}" msgstr "実行中のプロセス: {}" #: src/ui/pages/processes/mod.rs:919 msgid "Process" msgstr "プロセス" #: src/ui/pages/processes/mod.rs:980 #: data/resources/ui/dialogs/process_dialog.ui:186 #: data/resources/ui/dialogs/settings_dialog.ui:210 msgid "Process ID" msgstr "プロセス ID" #: src/ui/pages/processes/mod.rs:1033 #: data/resources/ui/dialogs/process_dialog.ui:213 #: data/resources/ui/dialogs/settings_dialog.ui:215 msgid "User" msgstr "ユーザー" #: src/ui/pages/processes/mod.rs:1708 #: data/resources/ui/dialogs/process_dialog.ui:154 #: data/resources/ui/dialogs/settings_dialog.ui:270 msgid "Total CPU Time" msgstr "合計 CPU 時間" #: src/ui/pages/processes/mod.rs:1767 #: data/resources/ui/dialogs/process_dialog.ui:163 #: data/resources/ui/dialogs/settings_dialog.ui:275 msgid "User CPU Time" msgstr "ユーザーの CPU 時間" #: src/ui/pages/processes/mod.rs:1826 #: data/resources/ui/dialogs/process_dialog.ui:172 #: data/resources/ui/dialogs/settings_dialog.ui:280 msgid "System CPU Time" msgstr "システムの CPU 時間" #: src/ui/pages/processes/mod.rs:1885 #: data/resources/ui/dialogs/process_options_dialog.ui:87 #: data/resources/ui/dialogs/settings_dialog.ui:285 msgid "Priority" msgstr "優先度" #: src/ui/pages/processes/mod.rs:2019 msgid "End process?" msgid_plural "End {} processes?" msgstr[0] "プロセスを終了しますか?" #: src/ui/pages/processes/mod.rs:2025 msgid "Halt process?" msgid_plural "Halt {} processes?" msgstr[0] "プロセスを停止しますか?" #: src/ui/pages/processes/mod.rs:2031 src/ui/pages/processes/mod.rs:2037 msgid "Kill process?" msgid_plural "Kill {} processes?" msgstr[0] "プロセスを強制終了しますか?" #: src/ui/pages/processes/mod.rs:2048 msgid "" "Halting a process can come with serious risks such as losing data and " "security implications. Use with caution." msgstr "" "プロセスを停止すると、データの損失やセキュリティ上の問題等が生じるリスクがあ" "ります。注意して続行してください。" #: src/ui/pages/processes/mod.rs:2049 msgid "" "Killing a process can come with serious risks such as losing data and " "security implications. Use with caution." msgstr "" "プロセスを強制終了すると、データ損失やセキュリティ上の問題等が生じるリスクが" "あります。注意して続行してください。" #: src/ui/pages/processes/mod.rs:2057 data/resources/ui/pages/processes.ui:10 #: data/resources/ui/pages/processes.ui:46 msgid "Halt Process" msgstr "プロセスを停止" #: src/ui/pages/processes/mod.rs:2058 data/resources/ui/pages/processes.ui:6 #: data/resources/ui/pages/processes.ui:42 msgid "Kill Process" msgstr "プロセスを強制終了" #: src/ui/pages/processes/mod.rs:2059 data/resources/ui/pages/processes.ui:14 #: data/resources/ui/pages/processes.ui:50 msgid "Continue Process" msgstr "プロセスを再開" #: src/ui/window.rs:309 msgid "GPU {}" msgstr "GPU {}" #: src/ui/window.rs:341 msgid "NPU {}" msgstr "NPU {}" #: src/ui/window.rs:1039 msgid "Successfully adjusted {}" msgstr "{} は無事調整されました" #: src/ui/window.rs:1040 msgid "There was a problem adjusting {}" msgstr "{} の調整中に問題が発生しました" #: src/ui/window.rs:1120 msgid "Successfully ended {}" msgstr "{} は無事終了しました" #: src/ui/window.rs:1121 msgid "Successfully halted {}" msgstr "{} は無事停止しました" #: src/ui/window.rs:1122 msgid "Successfully killed {}" msgstr "{} は無事強制終了しました" #: src/ui/window.rs:1123 msgid "Successfully continued {}" msgstr "{} は無事再開しました" #: src/ui/window.rs:1130 msgid "Successfully ended the process" msgid_plural "Successfully ended {} processes" msgstr[0] "プロセスは無事終了しました" #: src/ui/window.rs:1136 msgid "Successfully halted the process" msgid_plural "Successfully halted {} processes" msgstr[0] "プロセスは無事停止しました" #: src/ui/window.rs:1142 msgid "Successfully killed the process" msgid_plural "Successfully killed {} processes" msgstr[0] "プロセスは無事強制終了しました" #: src/ui/window.rs:1148 msgid "Successfully continued the process" msgid_plural "Successfully continued {} processes" msgstr[0] "プロセスは無事再開しました" #: src/ui/window.rs:1159 msgid "There was a problem ending a process" msgid_plural "There were problems ending {} processes" msgstr[0] "プロセスの終了中に問題が発生しました" #: src/ui/window.rs:1165 msgid "There was a problem halting a process" msgid_plural "There were problems halting {} processes" msgstr[0] "プロセスの停止中に問題が発生しました" #: src/ui/window.rs:1171 msgid "There was a problem killing a process" msgid_plural "There were problems killing {} processes" msgstr[0] "プロセスの強制終了中に問題が発生しました" #: src/ui/window.rs:1177 msgid "There was a problem continuing a process" msgid_plural "There were problems continuing {} processes" msgstr[0] "プロセスの再開中に問題が発生しました" #: src/ui/window.rs:1187 msgid "There was a problem ending {}" msgstr "{} の終了に問題が発生しました" #: src/ui/window.rs:1188 msgid "There was a problem halting {}" msgstr "{} の停止に問題が発生しました" #: src/ui/window.rs:1189 msgid "There was a problem killing {}" msgstr "{} の強制終了に問題が発生しました" #: src/ui/window.rs:1190 msgid "There was a problem continuing {}" msgstr "{} の再開に問題が発生しました" #: src/utils/app.rs:223 msgid "System Processes" msgstr "システムプロセス" #: src/utils/battery.rs:77 msgid "Charging" msgstr "充電中" #: src/utils/battery.rs:78 msgid "Discharging" msgstr "放電中" #: src/utils/battery.rs:79 msgid "Empty" msgstr "空" #: src/utils/battery.rs:80 msgid "Full" msgstr "フル充電" #: src/utils/battery.rs:81 msgid "Unknown" msgstr "不明" #: src/utils/battery.rs:127 msgid "Nickel-Metal Hydride" msgstr "ニッケル水素電池" #: src/utils/battery.rs:128 msgid "Nickel-Cadmium" msgstr "ニッケルカドミウム電池" #: src/utils/battery.rs:129 msgid "Nickel-Zinc" msgstr "ニッケル亜鉛電池" #: src/utils/battery.rs:130 msgid "Lead-Acid" msgstr "鉛蓄電池" #: src/utils/battery.rs:131 msgid "Lithium-Ion" msgstr "リチウムイオン電池" #: src/utils/battery.rs:132 msgid "Lithium Iron Phosphate" msgstr "リン酸鉄リチウムイオン電池" #: src/utils/battery.rs:133 msgid "Lithium Polymer" msgstr "リチウムポリマー電池" #: src/utils/battery.rs:135 msgid "Rechargeable Alkaline Managanese" msgstr "充電式アルカリマンガン電池" #: src/utils/battery.rs:229 msgid "{} Battery" msgstr "{} バッテリー" #: src/utils/battery.rs:231 msgid "Battery" msgstr "バッテリー" #: src/utils/drive.rs:81 src/utils/drive.rs:152 msgid "CD/DVD/Blu-ray Drive" msgstr "CD/DVD/Blue-ray ドライブ" #: src/utils/drive.rs:82 msgid "eMMC Storage" msgstr "eMMC ストレージ" #: src/utils/drive.rs:83 msgid "Flash Storage" msgstr "フラッシュストレージ" #: src/utils/drive.rs:84 src/utils/drive.rs:153 msgid "Floppy Drive" msgstr "フロッピードライブ" #: src/utils/drive.rs:85 msgid "Hard Disk Drive" msgstr "ハードディスクドライブ" #: src/utils/drive.rs:86 msgid "Loop Device" msgstr "ループデバイス" #: src/utils/drive.rs:87 msgid "Mapped Device" msgstr "Mapped デバイス" #: src/utils/drive.rs:88 msgid "NVMe Drive" msgstr "NVMe ドライブ" #: src/utils/drive.rs:90 msgid "Software Raid" msgstr "ソフトウェア Raid" #: src/utils/drive.rs:91 msgid "RAM Disk" msgstr "RAM ディスク" #: src/utils/drive.rs:92 msgid "Solid State Drive" msgstr "ソリッドステートドライブ" #: src/utils/drive.rs:93 msgid "ZFS Volume" msgstr "ZFS ボリューム" #: src/utils/drive.rs:94 msgid "Compressed RAM Disk (zram)" msgstr "圧縮 RAM ディスク (zram)" #: src/utils/drive.rs:154 msgid "{} Loop Device" msgstr "{} ループデバイス" #: src/utils/drive.rs:155 msgid "{} Mapped Device" msgstr "{} Mapped デバイス" #: src/utils/drive.rs:156 msgid "{} RAID" msgstr "{} RAID" #: src/utils/drive.rs:157 msgid "{} RAM Disk" msgstr "{} RAM ディスク" #: src/utils/drive.rs:158 msgid "{} zram Device" msgstr "{} zram デバイス" #: src/utils/drive.rs:159 msgid "{} ZFS Volume" msgstr "{} ZFS ボリューム" #: src/utils/drive.rs:160 msgid "{} Drive" msgstr "{} ドライブ" #: src/utils/network.rs:116 msgid "Bluetooth Tether" msgstr "Bluetooth テザリング" #: src/utils/network.rs:117 msgid "Network Bridge" msgstr "ネットワークブリッジ" #: src/utils/network.rs:118 msgid "Ethernet Connection" msgstr "イーサネット接続" #: src/utils/network.rs:119 msgid "Docker Bridge" msgstr "Docker ブリッジ" #: src/utils/network.rs:120 msgid "InfiniBand Connection" msgstr "InfiniBand 接続" #: src/utils/network.rs:121 msgid "Serial Line IP Connection" msgstr "シリアル回線 IP 接続" #: src/utils/network.rs:122 msgid "Virtual Ethernet Device" msgstr "仮想イーサネットデバイス" #: src/utils/network.rs:123 msgid "VM Network Bridge" msgstr "VM ネットワークブリッジ" #: src/utils/network.rs:124 msgid "VPN Tunnel" msgstr "VPN トンネル" #: src/utils/network.rs:125 msgid "VPN Tunnel (WireGuard)" msgstr "VPN トンネル (WireGuard)" #: src/utils/network.rs:126 msgid "Wi-Fi Connection" msgstr "Wi-Fi 接続" #: src/utils/network.rs:127 msgid "WWAN Connection" msgstr "WWAN 接続" #: src/utils/units.rs:59 msgid "{} K" msgstr "{} K" #: src/utils/units.rs:61 msgid "{} °C" msgstr "{} °C" #: src/utils/units.rs:63 msgid "{} °F" msgstr "{} °F" #: src/utils/units.rs:81 src/utils/units.rs:95 src/utils/units.rs:115 #: src/utils/units.rs:129 msgid "{} B" msgstr "{} B" #: src/utils/units.rs:82 src/utils/units.rs:96 msgid "{} kB" msgstr "{} kB" #: src/utils/units.rs:83 src/utils/units.rs:97 msgid "{} MB" msgstr "{} MB" #: src/utils/units.rs:84 src/utils/units.rs:98 msgid "{} GB" msgstr "{} GB" #: src/utils/units.rs:85 src/utils/units.rs:99 msgid "{} TB" msgstr "{} TB" #: src/utils/units.rs:86 src/utils/units.rs:100 msgid "{} PB" msgstr "{} PB" #: src/utils/units.rs:87 src/utils/units.rs:101 msgid "{} EB" msgstr "{} EB" #: src/utils/units.rs:88 src/utils/units.rs:102 msgid "{} ZB" msgstr "{} ZB" #: src/utils/units.rs:89 src/utils/units.rs:103 msgid "{} YB" msgstr "{} YB" #: src/utils/units.rs:90 src/utils/units.rs:104 msgid "{} RB" msgstr "{} RB" #: src/utils/units.rs:91 src/utils/units.rs:105 msgid "{} QB" msgstr "{} QB" #: src/utils/units.rs:116 src/utils/units.rs:130 msgid "{} KiB" msgstr "{} KiB" #: src/utils/units.rs:117 src/utils/units.rs:131 msgid "{} MiB" msgstr "{} MiB" #: src/utils/units.rs:118 src/utils/units.rs:132 msgid "{} GiB" msgstr "{} GiB" #: src/utils/units.rs:119 src/utils/units.rs:133 msgid "{} TiB" msgstr "{} TiB" #: src/utils/units.rs:120 src/utils/units.rs:134 msgid "{} PiB" msgstr "{} PiB" #: src/utils/units.rs:121 src/utils/units.rs:135 msgid "{} EiB" msgstr "{} EiB" #: src/utils/units.rs:122 src/utils/units.rs:136 msgid "{} ZiB" msgstr "{} ZiB" #: src/utils/units.rs:123 src/utils/units.rs:137 msgid "{} YiB" msgstr "{} YiB" #: src/utils/units.rs:124 src/utils/units.rs:138 msgid "{} RiB" msgstr "{} RiB" #: src/utils/units.rs:125 src/utils/units.rs:139 msgid "{} QiB" msgstr "{} QiB" #: src/utils/units.rs:166 src/utils/units.rs:183 msgid "{} B/s" msgstr "{} B/s" #: src/utils/units.rs:167 msgid "{} kB/s" msgstr "{} kB/s" #: src/utils/units.rs:168 msgid "{} MB/s" msgstr "{} MB/s" #: src/utils/units.rs:169 msgid "{} GB/s" msgstr "{} GB/s" #: src/utils/units.rs:170 msgid "{} TB/s" msgstr "{} TB/s" #: src/utils/units.rs:171 msgid "{} PB/s" msgstr "{} PB/s" #: src/utils/units.rs:172 msgid "{} EB/s" msgstr "{} EB/s" #: src/utils/units.rs:173 msgid "{} ZB/s" msgstr "{} ZB/s" #: src/utils/units.rs:174 msgid "{} YB/s" msgstr "{} YB/s" #: src/utils/units.rs:175 msgid "{} RB/s" msgstr "{} RB/s" #: src/utils/units.rs:176 msgid "{} QB/s" msgstr "{} QB/s" #: src/utils/units.rs:184 msgid "{} KiB/s" msgstr "{} KiB/s" #: src/utils/units.rs:185 msgid "{} MiB/s" msgstr "{} MiB/s" #: src/utils/units.rs:186 msgid "{} GiB/s" msgstr "{} GiB/s" #: src/utils/units.rs:187 msgid "{} TiB/s" msgstr "{} TiB/s" #: src/utils/units.rs:188 msgid "{} PiB/s" msgstr "{} PiB/s" #: src/utils/units.rs:189 msgid "{} EiB/s" msgstr "{} EiB/s" #: src/utils/units.rs:190 msgid "{} ZiB/s" msgstr "{} ZiB/s" #: src/utils/units.rs:191 msgid "{} YiB/s" msgstr "{} YiB/s" #: src/utils/units.rs:192 msgid "{} RiB/s" msgstr "{} RiB/s" #: src/utils/units.rs:193 msgid "{} QiB/s" msgstr "{} QiB/s" #: src/utils/units.rs:200 src/utils/units.rs:217 msgid "{} b/s" msgstr "{} b/s" #: src/utils/units.rs:201 msgid "{} kb/s" msgstr "{} kb/s" #: src/utils/units.rs:202 msgid "{} Mb/s" msgstr "{} Mb/s" #: src/utils/units.rs:203 msgid "{} Gb/s" msgstr "{} Gb/s" #: src/utils/units.rs:204 msgid "{} Tb/s" msgstr "{} Tb/s" #: src/utils/units.rs:205 msgid "{} Pb/s" msgstr "{} Pb/s" #: src/utils/units.rs:206 msgid "{} Eb/s" msgstr "{} Eb/s" #: src/utils/units.rs:207 msgid "{} Zb/s" msgstr "{} Zb/s" #: src/utils/units.rs:208 msgid "{} Yb/s" msgstr "{} Yb/s" #: src/utils/units.rs:209 msgid "{} Rb/s" msgstr "{} Rb/s" #: src/utils/units.rs:210 msgid "{} Qb/s" msgstr "{} Qb/s" #: src/utils/units.rs:218 msgid "{} Kib/s" msgstr "{} Kib/s" #: src/utils/units.rs:219 msgid "{} Mib/s" msgstr "{} Mib/s" #: src/utils/units.rs:220 msgid "{} Gib/s" msgstr "{} Gib/s" #: src/utils/units.rs:221 msgid "{} Tib/s" msgstr "{} Tib/s" #: src/utils/units.rs:222 msgid "{} Pib/s" msgstr "{} Pib/s" #: src/utils/units.rs:223 msgid "{} Eib/s" msgstr "{} Eib/s" #: src/utils/units.rs:224 msgid "{} Zib/s" msgstr "{} Zib/s" #: src/utils/units.rs:225 msgid "{} Yib/s" msgstr "{} Yib/s" #: src/utils/units.rs:226 msgid "{} Rib/s" msgstr "{} Rib/s" #: src/utils/units.rs:227 msgid "{} Qib/s" msgstr "{} Qib/s" #: src/utils/units.rs:234 msgid "{} Hz" msgstr "{} Hz" #: src/utils/units.rs:235 msgid "{} kHz" msgstr "{} kHz" #: src/utils/units.rs:236 msgid "{} MHz" msgstr "{} MHz" #: src/utils/units.rs:237 msgid "{} GHz" msgstr "{} GHz" #: src/utils/units.rs:238 msgid "{} THz" msgstr "{} THz" #: src/utils/units.rs:239 msgid "{} PHz" msgstr "{} PHz" #: src/utils/units.rs:240 msgid "{} EHz" msgstr "{} EHz" #: src/utils/units.rs:241 msgid "{} ZHz" msgstr "{} ZHz" #: src/utils/units.rs:242 msgid "{} YHz" msgstr "{} YHz" #: src/utils/units.rs:243 msgid "{} RHz" msgstr "{} RHz" #: src/utils/units.rs:244 msgid "{} QHz" msgstr "{} QHz" #: src/utils/units.rs:251 msgid "{} W" msgstr "{} W" #: src/utils/units.rs:252 msgid "{} kW" msgstr "{} kW" #: src/utils/units.rs:253 msgid "{} MW" msgstr "{} MW" #: src/utils/units.rs:254 msgid "{} GW" msgstr "{} GW" #: src/utils/units.rs:255 msgid "{} TW" msgstr "{} TW" #: src/utils/units.rs:256 msgid "{} PW" msgstr "{} PW" #: src/utils/units.rs:257 msgid "{} EW" msgstr "{} EW" #: src/utils/units.rs:258 msgid "{} ZW" msgstr "{} ZW" #: src/utils/units.rs:259 msgid "{} YW" msgstr "{} YW" #: src/utils/units.rs:260 msgid "{} RW" msgstr "{} RW" #: src/utils/units.rs:261 msgid "{} QW" msgstr "{} QW" #: src/utils/units.rs:270 src/utils/units.rs:284 msgid "{} Wh" msgstr "{} Wh" #: src/utils/units.rs:271 src/utils/units.rs:285 msgid "{} kWh" msgstr "{} kWh" #: src/utils/units.rs:272 src/utils/units.rs:286 msgid "{} MWh" msgstr "{} MWh" #: src/utils/units.rs:273 src/utils/units.rs:287 msgid "{} GWh" msgstr "{} GWh" #: src/utils/units.rs:274 src/utils/units.rs:288 msgid "{} TWh" msgstr "{} TWh" #: src/utils/units.rs:275 src/utils/units.rs:289 msgid "{} PWh" msgstr "{} PWh" #: src/utils/units.rs:276 src/utils/units.rs:290 msgid "{} EWh" msgstr "{} EWh" #: src/utils/units.rs:277 src/utils/units.rs:291 msgid "{} ZWh" msgstr "{} ZWh" #: src/utils/units.rs:278 src/utils/units.rs:292 msgid "{} YWh" msgstr "{} YWh" #: src/utils/units.rs:279 src/utils/units.rs:293 msgid "{} RWh" msgstr "{} RWh" #: src/utils/units.rs:280 src/utils/units.rs:294 msgid "{} QWh" msgstr "{} QWh" #: data/resources/ui/shortcuts.ui:11 msgctxt "shortcut window" msgid "General" msgstr "一般" #: data/resources/ui/shortcuts.ui:14 msgctxt "shortcut window" msgid "Preferences" msgstr "設定" #: data/resources/ui/shortcuts.ui:20 msgctxt "shortcut window" msgid "Show Shortcuts" msgstr "ショートカットを表示" #: data/resources/ui/shortcuts.ui:26 msgctxt "shortcut window" msgid "Quit" msgstr "終了" #: data/resources/ui/shortcuts.ui:32 msgctxt "shortcut window" msgid "Toggle Search Field" msgstr "検索欄の表示を切り替え" #: data/resources/ui/shortcuts.ui:38 msgctxt "shortcut window" msgid "End App/Process" msgstr "アプリ/プロセスを終了" #: data/resources/ui/shortcuts.ui:44 msgctxt "shortcut window" msgid "Kill App/Process" msgstr "アプリ/プロセスを強制終了" #: data/resources/ui/shortcuts.ui:50 msgctxt "shortcut window" msgid "Halt App/Process" msgstr "アプリ/プロセスを停止" #: data/resources/ui/shortcuts.ui:56 msgctxt "shortcut window" msgid "Continue App/Process" msgstr "アプリ/プロセスを再開" #: data/resources/ui/shortcuts.ui:62 msgctxt "shortcut window" msgid "Show Information for App/Process" msgstr "アプリ/プロセスの情報を表示" #: data/resources/ui/shortcuts.ui:68 msgctxt "shortcut window" msgid "Show Process Options" msgstr "プロセスのオプションを表示" #: data/resources/ui/window.ui:6 msgid "Preferences" msgstr "設定" #: data/resources/ui/window.ui:10 msgid "Keyboard Shortcuts" msgstr "キーボード・ショートカット" #: data/resources/ui/window.ui:14 msgid "About Resources" msgstr "Resources について" #: data/resources/ui/dialogs/app_dialog.ui:7 msgid "App Information" msgstr "アプリの情報" #: data/resources/ui/dialogs/app_dialog.ui:70 #: data/resources/ui/dialogs/process_dialog.ui:48 #: data/resources/ui/pages/battery.ui:22 data/resources/ui/pages/cpu.ui:37 #: data/resources/ui/pages/cpu.ui:50 data/resources/ui/pages/drive.ui:22 #: data/resources/ui/pages/gpu.ui:22 data/resources/ui/pages/memory.ui:31 #: data/resources/ui/pages/network.ui:22 data/resources/ui/pages/npu.ui:22 msgid "Usage" msgstr "使用量" #: data/resources/ui/dialogs/app_dialog.ui:174 #: data/resources/ui/dialogs/process_dialog.ui:179 #: data/resources/ui/pages/battery.ui:33 data/resources/ui/pages/cpu.ui:89 #: data/resources/ui/pages/drive.ui:54 data/resources/ui/pages/gpu.ui:80 #: data/resources/ui/pages/memory.ui:42 data/resources/ui/pages/network.ui:51 #: data/resources/ui/pages/npu.ui:74 msgid "Properties" msgstr "プロパティ" #: data/resources/ui/dialogs/app_dialog.ui:180 msgid "ID" msgstr "ID" #: data/resources/ui/dialogs/app_dialog.ui:190 #: data/resources/ui/dialogs/process_dialog.ui:195 msgid "Running Since" msgstr "実行開始時" #: data/resources/ui/dialogs/app_dialog.ui:198 msgid "Running Processes" msgstr "実行中のプロセス" #: data/resources/ui/dialogs/app_dialog.ui:207 #: data/resources/ui/dialogs/process_dialog.ui:231 msgid "Containerized" msgstr "コンテナ化" #: data/resources/ui/dialogs/process_dialog.ui:7 msgid "Process Information" msgstr "プロセスの情報" #: data/resources/ui/dialogs/process_dialog.ui:204 msgid "Commandline" msgstr "コマンドライン" #: data/resources/ui/dialogs/process_dialog.ui:222 msgid "Control Group" msgstr "制御グループ" #: data/resources/ui/dialogs/process_options_dialog.ui:7 #: data/resources/ui/dialogs/process_options_dialog.ui:69 msgid "Process Options" msgstr "プロセスのオプション" #: data/resources/ui/dialogs/process_options_dialog.ui:29 msgid "Apply" msgstr "適用" #: data/resources/ui/dialogs/process_options_dialog.ui:72 msgid "Niceness" msgstr "ナイス値" #: data/resources/ui/dialogs/process_options_dialog.ui:73 msgid "" "The priority of a process is given by its niceness. A lower niceness value " "correspond to a higher priority." msgstr "" "プロセス独自のナイス値によって与えられているプロセスの優先順位。ナイス値が低" "いほど、優先順位が高くなります。" #: data/resources/ui/dialogs/process_options_dialog.ui:91 msgctxt "process priority" msgid "Very High" msgstr "かなり高い" #: data/resources/ui/dialogs/process_options_dialog.ui:92 msgctxt "process priority" msgid "High" msgstr "高い" #: data/resources/ui/dialogs/process_options_dialog.ui:93 msgctxt "process priority" msgid "Normal" msgstr "普通" #: data/resources/ui/dialogs/process_options_dialog.ui:94 msgctxt "process priority" msgid "Low" msgstr "低い" #: data/resources/ui/dialogs/process_options_dialog.ui:95 msgctxt "process priority" msgid "Very Low" msgstr "かなり低い" #: data/resources/ui/dialogs/process_options_dialog.ui:103 msgid "Processor Affinity" msgstr "プロセッサー親和性" #: data/resources/ui/dialogs/process_options_dialog.ui:108 msgid "Toggle All" msgstr "すべて切り替える" #: data/resources/ui/dialogs/process_options_dialog.ui:111 msgid "Select which processor cores the process is allowed to run on" msgstr "プロセスの実行を許可するプロセッサーのコアを選択" #: data/resources/ui/dialogs/settings_dialog.ui:7 msgid "General" msgstr "一般" #: data/resources/ui/dialogs/settings_dialog.ui:10 msgid "Units" msgstr "単位" #: data/resources/ui/dialogs/settings_dialog.ui:13 msgid "Data Unit Prefix" msgstr "データ単位の接頭辞" #: data/resources/ui/dialogs/settings_dialog.ui:17 msgid "Decimal" msgstr "10進数" #: data/resources/ui/dialogs/settings_dialog.ui:18 msgid "Binary" msgstr "バイナリ" #: data/resources/ui/dialogs/settings_dialog.ui:26 msgid "Show Network Speeds in Bits per Second" msgstr "ネットワーク速度をビット/毎秒で表示" #: data/resources/ui/dialogs/settings_dialog.ui:31 msgid "Temperature Unit" msgstr "温度の単位" #: data/resources/ui/dialogs/settings_dialog.ui:35 msgid "Celsius" msgstr "摂氏" #: data/resources/ui/dialogs/settings_dialog.ui:36 msgid "Kelvin" msgstr "ケルビン" #: data/resources/ui/dialogs/settings_dialog.ui:37 msgid "Fahrenheit" msgstr "華氏" #: data/resources/ui/dialogs/settings_dialog.ui:47 msgid "User Interface" msgstr "ユーザーインターフェイス" #: data/resources/ui/dialogs/settings_dialog.ui:50 msgid "Refresh Speed" msgstr "更新速度" #: data/resources/ui/dialogs/settings_dialog.ui:51 msgid "Higher refresh speeds can lead to higher processor usage" msgstr "更新速度が速くなるとプロセッサー使用率が高くなる可能性があります" #: data/resources/ui/dialogs/settings_dialog.ui:55 msgctxt "UI refresh speed" msgid "Very Slow" msgstr "とても遅い" #: data/resources/ui/dialogs/settings_dialog.ui:56 msgctxt "UI refresh speed" msgid "Slow" msgstr "遅い" #: data/resources/ui/dialogs/settings_dialog.ui:57 msgctxt "UI refresh speed" msgid "Normal" msgstr "普通" #: data/resources/ui/dialogs/settings_dialog.ui:58 msgctxt "UI refresh speed" msgid "Fast" msgstr "速い" #: data/resources/ui/dialogs/settings_dialog.ui:59 msgctxt "UI refresh speed" msgid "Very Fast" msgstr "とても速い" #: data/resources/ui/dialogs/settings_dialog.ui:67 msgid "Show Graph Grids" msgstr "グラフに格子を表示" #: data/resources/ui/dialogs/settings_dialog.ui:72 msgid "Graph Data Points" msgstr "グラフのデータ点" #: data/resources/ui/dialogs/settings_dialog.ui:86 msgid "Show Search Fields on Launch" msgstr "起動時に検索欄を表示" #: data/resources/ui/dialogs/settings_dialog.ui:91 msgid "Show Usage Details in Sidebar" msgstr "使用量の詳細をサイドバーに表示" #: data/resources/ui/dialogs/settings_dialog.ui:92 msgid "If enabled, the usage along with other information will be displayed" msgstr "有効な場合、使用率と一緒に他の情報を表示します" #: data/resources/ui/dialogs/settings_dialog.ui:97 msgid "Show Device Descriptions in Sidebar" msgstr "デバイスの詳細をサイドバーに表示" #: data/resources/ui/dialogs/settings_dialog.ui:98 msgid "" "If enabled, a device identifier like its name or device type will be " "displayed" msgstr "有効な場合、デバイスを識別する名前やデバイスの種類が表示されます" #: data/resources/ui/dialogs/settings_dialog.ui:103 msgid "Sidebar Meter Type" msgstr "サイドバーの計測表示の型式" #: data/resources/ui/dialogs/settings_dialog.ui:107 msgid "Bar" msgstr "バー" #: data/resources/ui/dialogs/settings_dialog.ui:108 msgid "Graph" msgstr "グラフ" #: data/resources/ui/dialogs/settings_dialog.ui:116 msgid "Normalize Processor Usage" msgstr "プロセッサーの使用率を正規化" #: data/resources/ui/dialogs/settings_dialog.ui:117 msgid "" "If enabled, the total usage of all cores will be divided by the amount of " "cores" msgstr "有効な場合、全てのコアの合計使用率はコアの数で割り算されます" #: data/resources/ui/dialogs/settings_dialog.ui:130 #: data/resources/ui/dialogs/settings_dialog.ui:207 msgid "Information Columns" msgstr "項目" #: data/resources/ui/dialogs/settings_dialog.ui:196 #: data/resources/ui/pages/cpu.ui:22 data/resources/ui/pages/processes.ui:56 msgid "Options" msgstr "オプション" #: data/resources/ui/dialogs/settings_dialog.ui:199 msgid "Show Niceness Values" msgstr "ナイス値を表示" #: data/resources/ui/dialogs/settings_dialog.ui:200 msgid "" "Display priorities as niceness to allow for more fine-grained adjustments" msgstr "より細かな調整を行えるようにプロセス優先度をナイス値で表示します" #: data/resources/ui/dialogs/settings_dialog.ui:300 msgid "Devices" msgstr "デバイス" #: data/resources/ui/dialogs/settings_dialog.ui:303 msgid "Drives" msgstr "ドライブ" #: data/resources/ui/dialogs/settings_dialog.ui:306 msgid "Show Virtual Drives" msgstr "仮想ドライブ表示する" #: data/resources/ui/dialogs/settings_dialog.ui:307 msgid "Virtual drives are for example ZFS volumes or mapped devices" msgstr "" "仮想デバイスは、たとえばZFSボリュームやマッピングされたデバイスなどです" #: data/resources/ui/dialogs/settings_dialog.ui:317 msgid "Show Virtual Network Interfaces" msgstr "仮想ネットワークインターフェイスを表示する" #: data/resources/ui/dialogs/settings_dialog.ui:318 msgid "Virtual network interfaces are for example bridges or VPN tunnels" msgstr "" "バーチャルネットワークインターフェースは、たとえばブリッジやVPNトンネルなどで" "す" #: data/resources/ui/pages/applications.ui:40 #: data/resources/ui/pages/processes.ui:62 msgid "Information" msgstr "情報" #: data/resources/ui/pages/applications.ui:80 msgid "Search applications" msgstr "アプリケーションを検索" #: data/resources/ui/pages/applications.ui:98 #: data/resources/ui/pages/processes.ui:144 msgid "Search" msgstr "検索" #: data/resources/ui/pages/applications.ui:100 #: data/resources/ui/pages/processes.ui:146 msgid "Toggle search field" msgstr "検索欄の表示を切り替え" #: data/resources/ui/pages/applications.ui:116 #: data/resources/ui/pages/applications.ui:118 msgid "Show App Information" msgstr "アプリの情報" #: data/resources/ui/pages/battery.ui:36 msgid "Battery Health" msgstr "バッテリー性能" #: data/resources/ui/pages/battery.ui:45 msgid "Design Capacity" msgstr "設計上の容量" #: data/resources/ui/pages/battery.ui:54 msgid "Charge Cycles" msgstr "充電サイクル" #: data/resources/ui/pages/battery.ui:63 msgid "Technology" msgstr "テクノロジー名" #: data/resources/ui/pages/battery.ui:72 data/resources/ui/pages/gpu.ui:87 #: data/resources/ui/pages/network.ui:58 data/resources/ui/pages/npu.ui:81 msgid "Manufacturer" msgstr "製造元" #: data/resources/ui/pages/battery.ui:81 msgid "Model Name" msgstr "モデル名" #: data/resources/ui/pages/battery.ui:90 data/resources/ui/pages/drive.ui:66 msgid "Device" msgstr "デバイス" #: data/resources/ui/pages/cpu.ui:26 msgid "Show Usages of Logical CPUs" msgstr "論理 CPU 使用量を表示する" #: data/resources/ui/pages/cpu.ui:75 data/resources/ui/pages/gpu.ui:66 #: data/resources/ui/pages/npu.ui:60 msgid "Sensors" msgstr "センサー" #: data/resources/ui/pages/cpu.ui:82 data/resources/ui/pages/gpu.ui:69 #: data/resources/ui/pages/npu.ui:63 msgid "Temperature" msgstr "温度" #: data/resources/ui/pages/cpu.ui:96 msgid "Max Frequency" msgstr "最大周波数" #: data/resources/ui/pages/cpu.ui:105 msgid "Logical Cores" msgstr "論理コア数" #: data/resources/ui/pages/cpu.ui:114 msgid "Physical Cores" msgstr "物理コア数" #: data/resources/ui/pages/cpu.ui:123 msgid "Sockets" msgstr "ソケット" #: data/resources/ui/pages/cpu.ui:132 msgid "Virtualization" msgstr "仮想化" #: data/resources/ui/pages/cpu.ui:141 msgid "Architecture" msgstr "アーキテクチャ" #: data/resources/ui/pages/drive.ui:38 msgid "Total Read" msgstr "合計読み取り量" #: data/resources/ui/pages/drive.ui:47 msgid "Total Written" msgstr "合計書き込み量" #: data/resources/ui/pages/drive.ui:57 data/resources/ui/pages/memory.ui:72 msgid "Type" msgstr "タイプ" #: data/resources/ui/pages/drive.ui:75 msgid "Capacity" msgstr "容量" #: data/resources/ui/pages/drive.ui:84 msgid "Writable" msgstr "書き込み可能" #: data/resources/ui/pages/drive.ui:93 msgid "Removable" msgstr "取り外し可能" #: data/resources/ui/pages/gpu.ui:37 msgid "GPU Frequency" msgstr "GPU 周波数" #: data/resources/ui/pages/gpu.ui:50 msgid "Video Memory Frequency" msgstr "ビデオメモリー周波数" #: data/resources/ui/pages/gpu.ui:96 data/resources/ui/pages/npu.ui:90 msgid "PCI Slot" msgstr "PCI スロット" #: data/resources/ui/pages/gpu.ui:105 data/resources/ui/pages/network.ui:67 #: data/resources/ui/pages/npu.ui:99 msgid "Driver Used" msgstr "使用されるドライバー" #: data/resources/ui/pages/gpu.ui:114 data/resources/ui/pages/npu.ui:108 msgid "Max Power Cap" msgstr "最大電源出力" #: data/resources/ui/pages/memory.ui:9 msgid "You need to authenticate to see memory properties" msgstr "メモリのプロパティを閲覧するには認証が必要です" #: data/resources/ui/pages/memory.ui:10 msgid "Authenticate" msgstr "認証" #: data/resources/ui/pages/memory.ui:45 msgid "Slots Used" msgstr "使用されたスロット" #: data/resources/ui/pages/memory.ui:54 msgid "Speed" msgstr "速度" #: data/resources/ui/pages/memory.ui:63 msgid "Form Factor" msgstr "フォームファクター" #: data/resources/ui/pages/memory.ui:81 msgid "Type Detail" msgstr "タイプ" #: data/resources/ui/pages/network.ui:35 msgid "Total Received" msgstr "合計受信量" #: data/resources/ui/pages/network.ui:44 msgid "Total Sent" msgstr "合計送信量" #: data/resources/ui/pages/network.ui:76 msgid "Interface" msgstr "インターフェイス" #: data/resources/ui/pages/network.ui:85 msgid "Hardware Address" msgstr "ハードウェアアドレス" #: data/resources/ui/pages/npu.ui:31 msgid "NPU Frequency" msgstr "NPU 周波数" #: data/resources/ui/pages/npu.ui:44 msgid "Memory Frequency" msgstr "メモリー周波数" #: data/resources/ui/pages/processes.ui:22 #: data/resources/ui/pages/processes.ui:74 msgid "Kill Processes" msgstr "プロセスを強制終了" #: data/resources/ui/pages/processes.ui:26 #: data/resources/ui/pages/processes.ui:78 msgid "Halt Processes" msgstr "プロセスを停止" #: data/resources/ui/pages/processes.ui:30 #: data/resources/ui/pages/processes.ui:82 msgid "Continue Processes" msgstr "プロセスを再開" #: data/resources/ui/pages/processes.ui:126 msgid "Search processes" msgstr "プロセスを検索" #: data/resources/ui/pages/processes.ui:162 #: data/resources/ui/pages/processes.ui:164 msgid "Show Process Options" msgstr "プロセスのオプションを表示" #: data/resources/ui/pages/processes.ui:175 #: data/resources/ui/pages/processes.ui:177 msgid "Show Process Information" msgstr "プロセスの情報を表示" #~ msgid "Applications" #~ msgstr "アプリケーション" #~ msgid "Application" #~ msgstr "アプリケーション" #~ msgid "End application" #~ msgstr "アプリケーションを終了" #~ msgid "Kill application" #~ msgstr "アプリケーションを強制終了" #~ msgid "Continue application" #~ msgstr "アプリケーションを再開" #~ msgid "VRAM: {}" #~ msgstr "VRAM: {}" #~ msgid "root" #~ msgstr "ルート" #~ msgid "Continue process" #~ msgstr "プロセスを再開" #~ msgctxt "shortcut window" #~ msgid "End Application/Process" #~ msgstr "アプリケーション/プロセスを終了" #~ msgctxt "shortcut window" #~ msgid "Kill Application/Process" #~ msgstr "アプリケーション/プロセスを強制終了" #~ msgctxt "shortcut window" #~ msgid "Halt Application/Process" #~ msgstr "アプリケーション/プロセスを停止" #~ msgctxt "shortcut window" #~ msgid "Continue Application/Process" #~ msgstr "アプリケーション/プロセスを再開" resources-1.9.1/po/ka.po000066400000000000000000001723161510634446000151220ustar00rootroot00000000000000# # nokyan , 2023. # msgid "" msgstr "" "Project-Id-Version: resources\n" "Report-Msgid-Bugs-To: https://github.com/nokyan/resources/issues/\n" "POT-Creation-Date: 2025-10-04 03:35+0000\n" "PO-Revision-Date: 2025-10-04 07:14+0200\n" "Last-Translator: Ekaterine Papava \n" "Language-Team: Georgian <(nothing)>\n" "Language: ka\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.7\n" #: data/net.nokyan.Resources.desktop.in.in:2 data/net.nokyan.Resources.metainfo.xml.in.in:4 #: data/resources/ui/window.ui:22 src/application.rs:272 msgid "Resources" msgstr "Resources" #. Translators: The summary should be 35 characters or less according to Flathub appstream guidelines #: data/net.nokyan.Resources.desktop.in.in:3 data/net.nokyan.Resources.metainfo.xml.in.in:5 msgid "Keep an eye on system resources" msgstr "თვალყურის დევნება სისტემურ რესურსებზე" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/net.nokyan.Resources.desktop.in.in:9 msgid "System;Resources;Monitor;Processes;Usage;Task;Manager;CPU;RAM;Memory;GPU;" msgstr "System;Resources;Monitor;Processes;Usage;Task;Manager;CPU;RAM;Memory;GPU;მეხსიერება;პროცესორი;სისტემა;დატვირთვა;" #: data/net.nokyan.Resources.metainfo.xml.in.in:17 msgid "" "Resources allows you to check the utilization of your system resources and control your running processes and apps. " "It’s designed to be user-friendly and feel right at home on a modern desktop by using GNOME’s libadwaita." msgstr "" "Resources საშუალებას გაძლევთ, თვალყური ადევნოთ თქვენი სისტემური რესურსების დატვირთვას და აკონტროლოთ გაშვებული " "აპლიკაციები და პროცესები. ის შეიქმნა, რომ ჰქონდეს მეგობრული ინტერფესი და თავი მოხერხებულად იგრძნოთ. ის GNOME-ის " "libadwaita-ს იყენებს." #: data/net.nokyan.Resources.metainfo.xml.in.in:20 msgid "Resources supports monitoring the following components:" msgstr "Resources-ს შეუძლია შემდეგი კომპონენტების მონიტორინგი:" #: data/net.nokyan.Resources.metainfo.xml.in.in:24 msgid "CPU" msgstr "CPU" #: data/net.nokyan.Resources.metainfo.xml.in.in:25 data/resources/ui/dialogs/app_dialog.ui:82 #: data/resources/ui/dialogs/process_dialog.ui:64 data/resources/ui/dialogs/settings_dialog.ui:128 #: data/resources/ui/dialogs/settings_dialog.ui:220 data/resources/ui/window.ui:176 data/resources/ui/window.ui:183 #: src/ui/pages/applications/mod.rs:803 src/ui/pages/memory.rs:106 src/ui/pages/memory.rs:192 #: src/ui/pages/processes/mod.rs:1079 msgid "Memory" msgstr "მეხსიერება" #: data/net.nokyan.Resources.metainfo.xml.in.in:26 data/resources/ui/dialogs/app_dialog.ui:140 #: data/resources/ui/dialogs/process_dialog.ui:118 data/resources/ui/dialogs/settings_dialog.ui:158 #: data/resources/ui/dialogs/settings_dialog.ui:250 src/ui/pages/applications/mod.rs:1181 src/ui/pages/gpu.rs:119 #: src/ui/pages/processes/mod.rs:1469 src/ui/window.rs:468 msgid "GPU" msgstr "GPU" #: data/net.nokyan.Resources.metainfo.xml.in.in:27 data/resources/ui/dialogs/settings_dialog.ui:319 msgid "Network Interfaces" msgstr "ქსელის ინტერფეისები" #: data/net.nokyan.Resources.metainfo.xml.in.in:28 msgid "Storage Devices" msgstr "საცავის მოწყობილობები" #: data/net.nokyan.Resources.metainfo.xml.in.in:29 msgid "Batteries" msgstr "ელემენტები" #: data/net.nokyan.Resources.metainfo.xml.in.in:51 msgid "Apps page in light theme" msgstr "აპების გვერდი ღია თემაში" #: data/net.nokyan.Resources.metainfo.xml.in.in:55 msgid "Processes page in dark theme" msgstr "პროცესების გვერდი მუქ თემაში" #: data/net.nokyan.Resources.metainfo.xml.in.in:59 msgid "Processor page in light theme" msgstr "პროცესორის გვერდი ღია თემაში" #: data/net.nokyan.Resources.metainfo.xml.in.in:63 msgid "Memory page in dark theme" msgstr "მეხსიერების გვერდი მუქ თემაში" #: data/net.nokyan.Resources.metainfo.xml.in.in:67 msgid "GPU page in light theme" msgstr "GPU-ის გვერდი ღია თემაში" #: data/net.nokyan.Resources.metainfo.xml.in.in:71 msgid "Drive page in dark theme" msgstr "დისკების გვერდი მუქ თემაში" #: data/net.nokyan.Resources.metainfo.xml.in.in:75 msgid "Network Interface page in light theme" msgstr "ქსელის ინტერფეისის გვერდი ღია თემაში" #: data/net.nokyan.Resources.metainfo.xml.in.in:79 msgid "Battery page in dark theme" msgstr "ელემენტის გვერდი მუქ თემაში" #: data/net.nokyan.Resources.policy.in.in:9 msgid "Control Process" msgstr "კონტროლის პროცესი" #: data/net.nokyan.Resources.policy.in.in:10 msgid "Authentication is required to control superuser’s or other users’ processes" msgstr "ზემომხმარებლის, ან სხვა მომხმარებლის პროცესების სამართავად ავთენტიკაცია უნდა გაიაროთ" #: data/resources/ui/dialogs/app_dialog.ui:7 msgid "App Information" msgstr "აპლიკაციის ინფორმაცია" #: data/resources/ui/dialogs/app_dialog.ui:70 data/resources/ui/dialogs/process_dialog.ui:48 #: data/resources/ui/pages/battery.ui:22 data/resources/ui/pages/cpu.ui:37 data/resources/ui/pages/cpu.ui:50 #: data/resources/ui/pages/drive.ui:22 data/resources/ui/pages/gpu.ui:22 data/resources/ui/pages/memory.ui:31 #: data/resources/ui/pages/network.ui:22 data/resources/ui/pages/npu.ui:22 msgid "Usage" msgstr "გამოყენება" #: data/resources/ui/dialogs/app_dialog.ui:73 data/resources/ui/dialogs/process_dialog.ui:55 #: data/resources/ui/dialogs/settings_dialog.ui:133 data/resources/ui/dialogs/settings_dialog.ui:225 #: data/resources/ui/window.ui:145 data/resources/ui/window.ui:152 src/ui/pages/applications/mod.rs:862 #: src/ui/pages/cpu.rs:128 src/ui/pages/processes/mod.rs:1138 src/ui/window.rs:290 msgid "Processor" msgstr "პროცესორი" #: data/resources/ui/dialogs/app_dialog.ui:91 data/resources/ui/dialogs/process_dialog.ui:73 #: data/resources/ui/dialogs/settings_dialog.ui:178 data/resources/ui/dialogs/settings_dialog.ui:290 #: src/ui/pages/applications/mod.rs:1420 src/ui/pages/memory.rs:198 src/ui/pages/processes/mod.rs:1954 msgid "Swap" msgstr "სვაპი" #: data/resources/ui/dialogs/app_dialog.ui:100 data/resources/ui/dialogs/process_dialog.ui:78 #: data/resources/ui/dialogs/settings_dialog.ui:138 data/resources/ui/dialogs/settings_dialog.ui:230 #: src/ui/pages/applications/mod.rs:926 src/ui/pages/processes/mod.rs:1202 msgid "Drive Read" msgstr "დისკიდან წაკითხვა" #: data/resources/ui/dialogs/app_dialog.ui:109 data/resources/ui/dialogs/process_dialog.ui:87 #: data/resources/ui/dialogs/settings_dialog.ui:143 data/resources/ui/dialogs/settings_dialog.ui:235 #: src/ui/pages/applications/mod.rs:991 src/ui/pages/processes/mod.rs:1269 msgid "Drive Read Total" msgstr "დისკიდან წაკითხვები სულ" #: data/resources/ui/dialogs/app_dialog.ui:118 data/resources/ui/dialogs/process_dialog.ui:96 #: data/resources/ui/dialogs/settings_dialog.ui:148 data/resources/ui/dialogs/settings_dialog.ui:240 #: src/ui/pages/applications/mod.rs:1052 src/ui/pages/processes/mod.rs:1336 msgid "Drive Write" msgstr "დისკზე ჩაწერა" #: data/resources/ui/dialogs/app_dialog.ui:127 data/resources/ui/dialogs/process_dialog.ui:105 #: data/resources/ui/dialogs/settings_dialog.ui:153 data/resources/ui/dialogs/settings_dialog.ui:245 #: src/ui/pages/applications/mod.rs:1119 src/ui/pages/processes/mod.rs:1403 msgid "Drive Write Total" msgstr "დისკზე ჩაწერები სულ" #: data/resources/ui/dialogs/app_dialog.ui:149 data/resources/ui/dialogs/process_dialog.ui:127 #: data/resources/ui/dialogs/settings_dialog.ui:163 data/resources/ui/dialogs/settings_dialog.ui:255 #: src/ui/pages/applications/mod.rs:1361 src/ui/pages/processes/mod.rs:1650 msgid "Video Memory" msgstr "ვიდეომეხსიერება" #: data/resources/ui/dialogs/app_dialog.ui:158 data/resources/ui/dialogs/process_dialog.ui:136 #: data/resources/ui/dialogs/settings_dialog.ui:168 data/resources/ui/dialogs/settings_dialog.ui:260 #: src/ui/pages/applications/mod.rs:1240 src/ui/pages/processes/mod.rs:1528 msgid "Video Encoder" msgstr "ვიდეო ენკოდერი" #: data/resources/ui/dialogs/app_dialog.ui:167 data/resources/ui/dialogs/process_dialog.ui:145 #: data/resources/ui/dialogs/settings_dialog.ui:173 data/resources/ui/dialogs/settings_dialog.ui:265 #: src/ui/pages/applications/mod.rs:1301 src/ui/pages/processes/mod.rs:1589 msgid "Video Decoder" msgstr "ვიდეოდეკოდერი" #: data/resources/ui/dialogs/app_dialog.ui:174 data/resources/ui/dialogs/process_dialog.ui:179 #: data/resources/ui/pages/battery.ui:33 data/resources/ui/pages/cpu.ui:83 data/resources/ui/pages/drive.ui:54 #: data/resources/ui/pages/gpu.ui:74 data/resources/ui/pages/memory.ui:42 data/resources/ui/pages/network.ui:51 #: data/resources/ui/pages/npu.ui:68 msgid "Properties" msgstr "თვისებები" #: data/resources/ui/dialogs/app_dialog.ui:180 msgid "ID" msgstr "ID" #: data/resources/ui/dialogs/app_dialog.ui:190 data/resources/ui/dialogs/process_dialog.ui:195 msgid "Running Since" msgstr "გაშვების დრო" #: data/resources/ui/dialogs/app_dialog.ui:198 msgid "Running Processes" msgstr "გაშვებული პროცესები" #: data/resources/ui/dialogs/app_dialog.ui:207 data/resources/ui/dialogs/process_dialog.ui:231 msgid "Containerized" msgstr "კონტეინერიზებული" #: data/resources/ui/dialogs/process_dialog.ui:7 msgid "Process Information" msgstr "პროცესის ინფორმაცია" #: data/resources/ui/dialogs/process_dialog.ui:154 data/resources/ui/dialogs/settings_dialog.ui:270 #: src/ui/pages/processes/mod.rs:1710 msgid "Total CPU Time" msgstr "სულ CPI-ის დრო" #: data/resources/ui/dialogs/process_dialog.ui:163 data/resources/ui/dialogs/settings_dialog.ui:275 #: src/ui/pages/processes/mod.rs:1769 msgid "User CPU Time" msgstr "მომხმარებლის CPU დრო" #: data/resources/ui/dialogs/process_dialog.ui:172 data/resources/ui/dialogs/settings_dialog.ui:280 #: src/ui/pages/processes/mod.rs:1828 msgid "System CPU Time" msgstr "სისტემის CPU დრო" #: data/resources/ui/dialogs/process_dialog.ui:186 data/resources/ui/dialogs/settings_dialog.ui:210 #: src/ui/pages/processes/mod.rs:972 msgid "Process ID" msgstr "პროცესის ID" #: data/resources/ui/dialogs/process_dialog.ui:204 msgid "Commandline" msgstr "ბრძანებისსტრიქონი" #: data/resources/ui/dialogs/process_dialog.ui:213 data/resources/ui/dialogs/settings_dialog.ui:215 #: src/ui/pages/processes/mod.rs:1025 msgid "User" msgstr "მომხმარებელი" #: data/resources/ui/dialogs/process_dialog.ui:222 msgid "Control Group" msgstr "კონტროლის ჯგუფი" #: data/resources/ui/dialogs/process_options_dialog.ui:7 data/resources/ui/dialogs/process_options_dialog.ui:69 msgid "Process Options" msgstr "პროცესის პარამეტრები" #: data/resources/ui/dialogs/process_options_dialog.ui:29 msgid "Apply" msgstr "გადატარება" #: data/resources/ui/dialogs/process_options_dialog.ui:72 msgid "Niceness" msgstr "პრიორიტეტი" #: data/resources/ui/dialogs/process_options_dialog.ui:73 msgid "The priority of a process is given by its niceness. A lower niceness value correspond to a higher priority." msgstr "პროცესის პრიორიტეტი, რომელიც მას nice-ის მნიშვნელობით ენიჭება. რაც დაბალია მნიშვნელობა, მით მაღალია პრიორიტეტი." #: data/resources/ui/dialogs/process_options_dialog.ui:87 data/resources/ui/dialogs/settings_dialog.ui:285 #: src/ui/pages/processes/mod.rs:1887 msgid "Priority" msgstr "პრიორიტეტი" #: data/resources/ui/dialogs/process_options_dialog.ui:91 msgctxt "process priority" msgid "Very High" msgstr "ძალიან მაღალი" #: data/resources/ui/dialogs/process_options_dialog.ui:92 msgctxt "process priority" msgid "High" msgstr "მაღალი" #: data/resources/ui/dialogs/process_options_dialog.ui:93 msgctxt "process priority" msgid "Normal" msgstr "ნორმალური" #: data/resources/ui/dialogs/process_options_dialog.ui:94 msgctxt "process priority" msgid "Low" msgstr "დაბალი" #: data/resources/ui/dialogs/process_options_dialog.ui:95 msgctxt "process priority" msgid "Very Low" msgstr "ძალიან დაბალი" #: data/resources/ui/dialogs/process_options_dialog.ui:103 msgid "Processor Affinity" msgstr "პროცესორის შესაბამისობა" #: data/resources/ui/dialogs/process_options_dialog.ui:108 msgid "Toggle All" msgstr "ყველას გადართვა" #: data/resources/ui/dialogs/process_options_dialog.ui:111 msgid "Select which processor cores the process is allowed to run on" msgstr "აირჩიეთ, რომელ პროცესორის ბირთვებზე შეუძლია პროცესს, გაეშვეას" #: data/resources/ui/dialogs/settings_dialog.ui:7 msgid "General" msgstr "ზოგადი" #: data/resources/ui/dialogs/settings_dialog.ui:10 msgid "Units" msgstr "საზომი ერთეულები" #: data/resources/ui/dialogs/settings_dialog.ui:13 msgid "Data Unit Prefix" msgstr "მონაცემების ერთეულის პრეფიქსი" #: data/resources/ui/dialogs/settings_dialog.ui:17 msgid "Decimal" msgstr "ათობითი" #: data/resources/ui/dialogs/settings_dialog.ui:18 msgid "Binary" msgstr "გამშვები" #: data/resources/ui/dialogs/settings_dialog.ui:26 msgid "Show Network Speeds in Bits per Second" msgstr "ქსელის სიჩქარეების ბიტი/წამში ჩვენება" #: data/resources/ui/dialogs/settings_dialog.ui:31 msgid "Temperature Unit" msgstr "ტემპერატური ერთეული" #: data/resources/ui/dialogs/settings_dialog.ui:35 msgid "Celsius" msgstr "ცელსიუსი" #: data/resources/ui/dialogs/settings_dialog.ui:36 msgid "Kelvin" msgstr "კელვინი" #: data/resources/ui/dialogs/settings_dialog.ui:37 msgid "Fahrenheit" msgstr "ფარენჰეიტი" #: data/resources/ui/dialogs/settings_dialog.ui:47 msgid "User Interface" msgstr "სამომხმარებლო ინტერფეისი" #: data/resources/ui/dialogs/settings_dialog.ui:50 msgid "Refresh Speed" msgstr "განახლების სიჩქარე" #: data/resources/ui/dialogs/settings_dialog.ui:51 msgid "Higher refresh speeds can lead to higher processor usage" msgstr "განახლების უფრო მაღალი სიჩქარე პროცესორის უფრო მაღალ დატვირთვას გამოიწვევს" #: data/resources/ui/dialogs/settings_dialog.ui:55 msgctxt "UI refresh speed" msgid "Very Slow" msgstr "ძალიან ნელი" #: data/resources/ui/dialogs/settings_dialog.ui:56 msgctxt "UI refresh speed" msgid "Slow" msgstr "ნელი" #: data/resources/ui/dialogs/settings_dialog.ui:57 msgctxt "UI refresh speed" msgid "Normal" msgstr "ნორმალური" #: data/resources/ui/dialogs/settings_dialog.ui:58 msgctxt "UI refresh speed" msgid "Fast" msgstr "ჩქარი" #: data/resources/ui/dialogs/settings_dialog.ui:59 msgctxt "UI refresh speed" msgid "Very Fast" msgstr "ძალიან სწრაფი" #: data/resources/ui/dialogs/settings_dialog.ui:67 msgid "Show Graph Grids" msgstr "გრაფიკის ბადეების ჩვენება" #: data/resources/ui/dialogs/settings_dialog.ui:72 msgid "Graph Data Points" msgstr "გრაფიკის მონაცემთა წერტილები" #: data/resources/ui/dialogs/settings_dialog.ui:86 msgid "Show Usage Details in Sidebar" msgstr "გამოყენების დეტალების ჩვენება გვერდით პანელზე" #: data/resources/ui/dialogs/settings_dialog.ui:87 msgid "If enabled, the usage along with other information will be displayed" msgstr "თუ ჩართულია, ნაჩვენები იქნება გამოყენებაც, სხვა ინფორმაციასთან ერთად" #: data/resources/ui/dialogs/settings_dialog.ui:92 msgid "Show Device Descriptions in Sidebar" msgstr "მოწყობილობის აღწერების ჩვენება გვერდით პანელზე" #: data/resources/ui/dialogs/settings_dialog.ui:93 msgid "If enabled, a device identifier like its name or device type will be displayed" msgstr "თუ ჩართულია, ნაჩვენები იქნება მოწყობილობის იდენტიფიკატორი - როგორიცაა მისის ახელი" #: data/resources/ui/dialogs/settings_dialog.ui:98 msgid "Sidebar Meter Type" msgstr "გვერდითი პანელის გაზომვის ტიპი" #: data/resources/ui/dialogs/settings_dialog.ui:102 msgid "Bar" msgstr "ბარი" #: data/resources/ui/dialogs/settings_dialog.ui:103 msgid "Graph" msgstr "გრაფიკი" #: data/resources/ui/dialogs/settings_dialog.ui:111 msgid "Normalize Processor Usage" msgstr "პროცესორის გამოყენების ნორმალიზება" #: data/resources/ui/dialogs/settings_dialog.ui:112 msgid "If enabled, the total usage of all cores will be divided by the amount of cores" msgstr "თუ ჩართულია, ყველა ბირთვის საერთო დატვირთვა ბირთვების რაოდენობაზე გაიყოფა" #: data/resources/ui/dialogs/settings_dialog.ui:122 data/resources/ui/window.ui:65 data/resources/ui/window.ui:72 #: src/ui/pages/applications/mod.rs:131 msgid "Apps" msgstr "აპები" #: data/resources/ui/dialogs/settings_dialog.ui:125 data/resources/ui/dialogs/settings_dialog.ui:207 msgid "Information Columns" msgstr "ინფორმაციის სვეტები" #: data/resources/ui/dialogs/settings_dialog.ui:183 data/resources/ui/dialogs/settings_dialog.ui:295 #: src/ui/pages/applications/mod.rs:1479 src/ui/pages/processes/mod.rs:2013 msgid "Combined Memory" msgstr "კომბინირებული მეხსიერება" #: data/resources/ui/dialogs/settings_dialog.ui:193 data/resources/ui/window.ui:105 data/resources/ui/window.ui:112 #: src/ui/pages/processes/mod.rs:175 msgid "Processes" msgstr "პროცესები" #: data/resources/ui/dialogs/settings_dialog.ui:196 data/resources/ui/pages/cpu.ui:22 #: data/resources/ui/pages/processes.ui:56 msgid "Options" msgstr "მორგება" #: data/resources/ui/dialogs/settings_dialog.ui:199 msgid "Show Niceness Values" msgstr "პრიორიტეტის მნიშვნელობების ჩვენება" #: data/resources/ui/dialogs/settings_dialog.ui:200 msgid "Display priorities as niceness to allow for more fine-grained adjustments" msgstr "პრიორიტეტების ჩვენება პარამეტრების უფრო ზუსტად დასაყენებლად" #: data/resources/ui/dialogs/settings_dialog.ui:305 msgid "Devices" msgstr "მოწყობილობები" #: data/resources/ui/dialogs/settings_dialog.ui:308 msgid "Drives" msgstr "დისკები" #: data/resources/ui/dialogs/settings_dialog.ui:311 msgid "Show Virtual Drives" msgstr "ვირტუალური დისკების ჩვენება" #: data/resources/ui/dialogs/settings_dialog.ui:312 msgid "Virtual drives are for example ZFS volumes or mapped devices" msgstr "ვირტუალური დისკებია მაგალითად ZFS ტომები, ან მიმაგრებული მოწყობილობები" #: data/resources/ui/dialogs/settings_dialog.ui:322 msgid "Show Virtual Network Interfaces" msgstr "ვირტუალური ქსელის ინტერფეისების ჩვენება" #: data/resources/ui/dialogs/settings_dialog.ui:323 msgid "Virtual network interfaces are for example bridges or VPN tunnels" msgstr "ვირტუალური ქსელური ინტერფეისებია, მაგალითად, ხიდები, ან VPN გვირაბები" #: data/resources/ui/pages/applications.ui:6 data/resources/ui/pages/applications.ui:26 #: src/ui/pages/applications/mod.rs:1563 msgid "Kill App" msgstr "აპლიკაციის მოკვლა" #: data/resources/ui/pages/applications.ui:10 data/resources/ui/pages/applications.ui:30 #: src/ui/pages/applications/mod.rs:1562 msgid "Halt App" msgstr "აპლიკაციის შეჩერება" #: data/resources/ui/pages/applications.ui:14 data/resources/ui/pages/applications.ui:34 #: src/ui/pages/applications/mod.rs:1564 msgid "Continue App" msgstr "აპლიკაციის გაგრძელება" #: data/resources/ui/pages/applications.ui:22 data/resources/ui/pages/applications.ui:98 #: src/ui/pages/applications/mod.rs:1561 msgid "End App" msgstr "აპლიკაციის დასრულება" #: data/resources/ui/pages/applications.ui:40 data/resources/ui/pages/processes.ui:62 msgid "Information" msgstr "ინფორმაცია" #: data/resources/ui/pages/applications.ui:57 msgid "Search applications" msgstr "აპლიკაციების ძებნა" #: data/resources/ui/pages/applications.ui:87 data/resources/ui/pages/applications.ui:89 msgid "Show App Information" msgstr "აპლიკაციის ინფორმაციის ჩვენება" #: data/resources/ui/pages/battery.ui:36 msgid "Battery Health" msgstr "ელემენტის ჯანმრთელობა" #: data/resources/ui/pages/battery.ui:45 msgid "Design Capacity" msgstr "დიზაინის მოცულობა" #: data/resources/ui/pages/battery.ui:54 msgid "Charge Cycles" msgstr "დატენვის ციკლები" #: data/resources/ui/pages/battery.ui:63 msgid "Technology" msgstr "ტექნოლოგია" #: data/resources/ui/pages/battery.ui:72 data/resources/ui/pages/gpu.ui:81 data/resources/ui/pages/network.ui:58 #: data/resources/ui/pages/npu.ui:75 msgid "Manufacturer" msgstr "მწარმოებელი" #: data/resources/ui/pages/battery.ui:81 msgid "Model Name" msgstr "Მოდელის სახელი" #: data/resources/ui/pages/battery.ui:90 data/resources/ui/pages/drive.ui:66 msgid "Device" msgstr "მოწყობილობა" #: data/resources/ui/pages/cpu.ui:26 msgid "Show Usages of Logical CPUs" msgstr "ლოგიკური პროცესორების გამოყენების ჩვენება" #: data/resources/ui/pages/cpu.ui:75 data/resources/ui/pages/gpu.ui:66 data/resources/ui/pages/npu.ui:60 msgid "Sensors" msgstr "სენსორები" #: data/resources/ui/pages/cpu.ui:90 msgid "Max Frequency" msgstr "მაქსიმალური სიხშირე" #: data/resources/ui/pages/cpu.ui:99 msgid "Logical Cores" msgstr "ლოგიკური ბირთვები" #: data/resources/ui/pages/cpu.ui:108 msgid "Physical Cores" msgstr "ფიზიკური ბირთვები" #: data/resources/ui/pages/cpu.ui:117 msgid "Sockets" msgstr "სოკეტები" #: data/resources/ui/pages/cpu.ui:126 msgid "Uptime" msgstr "ჩართულია" #: data/resources/ui/pages/cpu.ui:135 msgid "Virtualization" msgstr "ვირტუალიზაცია" #: data/resources/ui/pages/cpu.ui:144 msgid "Architecture" msgstr "არქიტექტურა" #: data/resources/ui/pages/drive.ui:38 msgid "Total Read" msgstr "სულ წაკითხული" #: data/resources/ui/pages/drive.ui:47 msgid "Total Written" msgstr "სულ ჩაწერილი" #: data/resources/ui/pages/drive.ui:57 data/resources/ui/pages/memory.ui:72 msgid "Type" msgstr "ტიპი" #: data/resources/ui/pages/drive.ui:75 msgid "Capacity" msgstr "მოცულობა" #: data/resources/ui/pages/drive.ui:84 msgid "Writable" msgstr "ჩაწერადი" #: data/resources/ui/pages/drive.ui:93 msgid "Removable" msgstr "მოხსნადი" #. Translators: "Link" refers to something like "PCIe 4.0 ×16" #: data/resources/ui/pages/drive.ui:102 data/resources/ui/pages/gpu.ui:113 data/resources/ui/pages/network.ui:103 #: data/resources/ui/pages/npu.ui:107 msgid "Link" msgstr "ბმული" #: data/resources/ui/pages/gpu.ui:37 msgid "GPU Frequency" msgstr "GPU სიხშირე" #: data/resources/ui/pages/gpu.ui:50 msgid "Video Memory Frequency" msgstr "ვიდეომეხსიერების სიხშირე" #: data/resources/ui/pages/gpu.ui:55 data/resources/ui/pages/npu.ui:49 src/ui/pages/battery.rs:217 msgid "Power Usage" msgstr "კვების ხარჯვა" #: data/resources/ui/pages/gpu.ui:90 data/resources/ui/pages/npu.ui:84 msgid "PCI Slot" msgstr "PCI სლოტი" #: data/resources/ui/pages/gpu.ui:99 data/resources/ui/pages/network.ui:67 data/resources/ui/pages/npu.ui:93 msgid "Driver Used" msgstr "გამოყენებული დრაივერი" #: data/resources/ui/pages/gpu.ui:108 data/resources/ui/pages/npu.ui:102 msgid "Max Power Cap" msgstr "მაქსიმალური კვების ხარჯვა" #: data/resources/ui/pages/memory.ui:9 msgid "You need to authenticate to see memory properties" msgstr "მეხსიერების თვისებების სანახავად ავთენტიკაციაა საჭირო" #: data/resources/ui/pages/memory.ui:10 msgid "Authenticate" msgstr "ავთენტიკაცია" #: data/resources/ui/pages/memory.ui:45 msgid "Slots Used" msgstr "გამოყენებულ სლოტები" #: data/resources/ui/pages/memory.ui:54 msgid "Speed" msgstr "სიჩქარე" #: data/resources/ui/pages/memory.ui:63 msgid "Form Factor" msgstr "ზომა" #: data/resources/ui/pages/memory.ui:81 msgid "Type Detail" msgstr "ტიპის დეტალი" #: data/resources/ui/pages/network.ui:35 msgid "Total Received" msgstr "სულ მიღებული" #: data/resources/ui/pages/network.ui:44 msgid "Total Sent" msgstr "გაგზავნილი ჯამში" #: data/resources/ui/pages/network.ui:76 msgid "Interface" msgstr "ინტერფეისი" #: data/resources/ui/pages/network.ui:85 msgid "Hardware Address" msgstr "აპარატურული მისამართი" #: data/resources/ui/pages/network.ui:94 msgid "Network Name" msgstr "ქსელის სახელი" #: data/resources/ui/pages/network.ui:112 msgid "Link Speed" msgstr "შეერთების სიჩქარე" #: data/resources/ui/pages/npu.ui:31 msgid "NPU Frequency" msgstr "NPU სიხშირე" #: data/resources/ui/pages/npu.ui:44 msgid "Memory Frequency" msgstr "მეხსიერების სიხშირე" #: data/resources/ui/pages/processes.ui:6 data/resources/ui/pages/processes.ui:42 src/ui/pages/processes/mod.rs:2126 msgid "Kill Process" msgstr "პროცესის მოკვლა" #: data/resources/ui/pages/processes.ui:10 data/resources/ui/pages/processes.ui:46 src/ui/pages/processes/mod.rs:2125 msgid "Halt Process" msgstr "პროცესის შეჩერება" #: data/resources/ui/pages/processes.ui:14 data/resources/ui/pages/processes.ui:50 src/ui/pages/processes/mod.rs:2127 msgid "Continue Process" msgstr "პროცესის გაგრძელება" #: data/resources/ui/pages/processes.ui:22 data/resources/ui/pages/processes.ui:74 msgid "Kill Processes" msgstr "პროცესების მოკვლა" #: data/resources/ui/pages/processes.ui:26 data/resources/ui/pages/processes.ui:78 msgid "Halt Processes" msgstr "პროცესის შეჩერება" #: data/resources/ui/pages/processes.ui:30 data/resources/ui/pages/processes.ui:82 msgid "Continue Processes" msgstr "პროცესების გაგრძელება" #: data/resources/ui/pages/processes.ui:38 data/resources/ui/pages/processes.ui:157 src/ui/pages/processes/mod.rs:523 #: src/ui/pages/processes/mod.rs:2124 msgid "End Process" msgstr "პროცესის დასრულება" #: data/resources/ui/pages/processes.ui:70 src/ui/pages/processes/mod.rs:527 msgid "End Processes" msgstr "პროცესის დასრულება" #: data/resources/ui/pages/processes.ui:103 msgid "Search processes" msgstr "პროცესების ძებნა" #: data/resources/ui/pages/processes.ui:133 data/resources/ui/pages/processes.ui:135 msgid "Show Process Options" msgstr "პროცესის პარამეტრების ჩვენება" #: data/resources/ui/pages/processes.ui:146 data/resources/ui/pages/processes.ui:148 msgid "Show Process Information" msgstr "პროცესის ინფორმაციის ჩვენება" #: data/resources/ui/shortcuts.ui:6 msgctxt "shortcut window" msgid "General" msgstr "ზოგადი" #: data/resources/ui/shortcuts.ui:9 msgctxt "shortcut window" msgid "Preferences" msgstr "მორგება" #: data/resources/ui/shortcuts.ui:15 msgctxt "shortcut window" msgid "Show Shortcuts" msgstr "მალსახმობების ჩვენება" #: data/resources/ui/shortcuts.ui:21 msgctxt "shortcut window" msgid "Quit" msgstr "გასვლა" #: data/resources/ui/shortcuts.ui:29 msgctxt "shortcut window" msgid "Apps/Processes" msgstr "აპები/პროცესები" #: data/resources/ui/shortcuts.ui:32 msgctxt "shortcut window" msgid "Toggle Search Field" msgstr "ძებნის ველის გადართვა" #: data/resources/ui/shortcuts.ui:38 msgctxt "shortcut window" msgid "End App/Process" msgstr "აპის/პროცესის დასრულება" #: data/resources/ui/shortcuts.ui:44 msgctxt "shortcut window" msgid "Kill App/Process" msgstr "აპის/პროცესის მოკვლა" #: data/resources/ui/shortcuts.ui:50 msgctxt "shortcut window" msgid "Halt App/Process" msgstr "აპის/პროცესის შეჩერება" #: data/resources/ui/shortcuts.ui:56 msgctxt "shortcut window" msgid "Continue App/Process" msgstr "აპის/პროცესის გაგრძელება" #: data/resources/ui/shortcuts.ui:62 msgctxt "shortcut window" msgid "Show Information for App/Process" msgstr "აპის/პროცესის შესახებ ინფორმაციის ჩვენება" #: data/resources/ui/shortcuts.ui:68 msgctxt "shortcut window" msgid "Show Process Options" msgstr "პროცესის პარამეტრების ჩვენება" #: data/resources/ui/window.ui:6 msgid "Preferences" msgstr "მორგება" #: data/resources/ui/window.ui:10 msgid "Keyboard Shortcuts" msgstr "კლავიატურის მალსახმობები" #: data/resources/ui/window.ui:14 msgid "About Resources" msgstr "Resources-ის შესახებ" #: data/resources/ui/window.ui:88 data/resources/ui/window.ui:128 msgid "Search" msgstr "ძებნა" #: data/resources/ui/window.ui:90 data/resources/ui/window.ui:130 msgid "Toggle search field" msgstr "ძებნის ველის გადართვა" #: src/application.rs:274 msgid "The Nalux Team" msgstr "გუნდი Nalux" #: src/application.rs:282 msgid "Report Issues" msgstr "პრობლემების შეტყობინება" #. Translator credits. Replace "translator-credits" with your name/username, and optionally an email or URL. #. One name per line, please do not remove previous names. #: src/application.rs:288 msgid "translator-credits" msgstr "თემური დოღონაძე" #: src/application.rs:289 msgid "Icon by" msgstr "ხატულის ავტორი" #: src/ui/dialogs/app_dialog.rs:155 src/ui/dialogs/process_dialog.rs:133 src/ui/dialogs/process_dialog.rs:137 #: src/ui/dialogs/process_dialog.rs:146 src/ui/dialogs/process_dialog.rs:148 src/ui/dialogs/process_dialog.rs:171 #: src/ui/dialogs/process_dialog.rs:178 src/ui/dialogs/process_dialog.rs:185 src/ui/dialogs/process_dialog.rs:192 #: src/ui/pages/applications/mod.rs:948 src/ui/pages/applications/mod.rs:1074 src/ui/pages/battery.rs:205 #: src/ui/pages/battery.rs:225 src/ui/pages/battery.rs:231 src/ui/pages/battery.rs:234 src/ui/pages/battery.rs:265 #: src/ui/pages/battery.rs:289 src/ui/pages/battery.rs:291 src/ui/pages/battery.rs:301 src/ui/pages/cpu.rs:243 #: src/ui/pages/cpu.rs:258 src/ui/pages/cpu.rs:278 src/ui/pages/cpu.rs:284 src/ui/pages/cpu.rs:290 #: src/ui/pages/cpu.rs:296 src/ui/pages/cpu.rs:300 src/ui/pages/cpu.rs:303 src/ui/pages/cpu.rs:341 #: src/ui/pages/cpu.rs:448 src/ui/pages/drive.rs:319 src/ui/pages/drive.rs:350 src/ui/pages/drive.rs:352 #: src/ui/pages/drive.rs:381 src/ui/pages/drive.rs:383 src/ui/pages/drive.rs:399 src/ui/pages/drive.rs:400 #: src/ui/pages/drive.rs:407 src/ui/pages/drive.rs:417 src/ui/pages/drive.rs:427 src/ui/pages/drive.rs:433 #: src/ui/pages/gpu.rs:245 src/ui/pages/gpu.rs:252 src/ui/pages/gpu.rs:297 src/ui/pages/gpu.rs:322 #: src/ui/pages/gpu.rs:325 src/ui/pages/gpu.rs:336 src/ui/pages/gpu.rs:377 src/ui/pages/gpu.rs:384 #: src/ui/pages/gpu.rs:396 src/ui/pages/gpu.rs:403 src/ui/pages/gpu.rs:407 src/ui/pages/gpu.rs:437 #: src/ui/pages/gpu.rs:443 src/ui/pages/memory.rs:227 src/ui/pages/memory.rs:228 src/ui/pages/memory.rs:232 #: src/ui/pages/memory.rs:233 src/ui/pages/memory.rs:237 src/ui/pages/memory.rs:238 src/ui/pages/memory.rs:266 #: src/ui/pages/memory.rs:327 src/ui/pages/network.rs:252 src/ui/pages/network.rs:259 src/ui/pages/network.rs:266 #: src/ui/pages/network.rs:272 src/ui/pages/network.rs:275 src/ui/pages/network.rs:285 src/ui/pages/network.rs:292 #: src/ui/pages/network.rs:302 src/ui/pages/network.rs:370 src/ui/pages/network.rs:373 src/ui/pages/network.rs:375 #: src/ui/pages/network.rs:404 src/ui/pages/network.rs:407 src/ui/pages/network.rs:409 src/ui/pages/network.rs:417 #: src/ui/pages/network.rs:424 src/ui/pages/network.rs:434 src/ui/pages/processes/mod.rs:1224 #: src/ui/pages/processes/mod.rs:1291 src/ui/pages/processes/mod.rs:1358 src/ui/pages/processes/mod.rs:1425 #: src/ui/pages/processes/mod.rs:1911 src/ui/pages/processes/mod.rs:1913 src/utils/battery.rs:152 src/utils/drive.rs:137 #: src/utils/gpu/mod.rs:279 src/utils/gpu/mod.rs:291 src/utils/link/mod.rs:61 src/utils/npu/mod.rs:244 #: src/utils/npu/mod.rs:250 msgid "N/A" msgstr "N/A" #: src/ui/dialogs/process_options_dialog.rs:147 src/ui/pages/cpu.rs:257 src/ui/pages/cpu.rs:417 src/ui/pages/cpu.rs:421 msgid "CPU {}" msgstr "CPU {}" #: src/ui/pages/applications/application_entry.rs:190 src/ui/pages/drive.rs:414 src/ui/pages/drive.rs:424 #: src/ui/pages/processes/process_entry.rs:211 msgid "No" msgstr "არა" #: src/ui/pages/applications/application_entry.rs:191 src/ui/pages/processes/process_entry.rs:212 msgid "Yes (Flatpak)" msgstr "დიახ (Flatpak)" #: src/ui/pages/applications/application_entry.rs:192 src/ui/pages/processes/process_entry.rs:213 msgid "Yes (Snap)" msgstr "დიახ (Snap)" #: src/ui/pages/applications/mod.rs:660 msgid "Running Apps: {}" msgstr "გაშვებული აპები: {}" #: src/ui/pages/applications/mod.rs:700 src/ui/pages/processes/mod.rs:862 msgid "Cancel" msgstr "გაუქმება" #: src/ui/pages/applications/mod.rs:746 msgid "App" msgstr "აპი" #: src/ui/pages/applications/mod.rs:1539 src/ui/pages/processes/mod.rs:2073 msgid "End {}?" msgstr "დავასრულო {}?" #: src/ui/pages/applications/mod.rs:1540 src/ui/pages/processes/mod.rs:2074 msgid "Halt {}?" msgstr "შევაჩერო {}?" #: src/ui/pages/applications/mod.rs:1541 src/ui/pages/processes/mod.rs:2075 msgid "Kill {}?" msgstr "მოვკლა {}?" #: src/ui/pages/applications/mod.rs:1542 src/ui/pages/processes/mod.rs:2076 msgid "Continue {}?" msgstr "გავაგრძელო {}?" #: src/ui/pages/applications/mod.rs:1548 src/ui/pages/processes/mod.rs:2111 msgid "Unsaved work might be lost." msgstr "შეუნახავი მასალები დაგეკარგებათ." #: src/ui/pages/applications/mod.rs:1550 msgid "Halting an app can come with serious risks such as losing data and security implications. Use with caution." msgstr "" "აპლიკაციის შეჩერებამ შეძლება ისეთ სერიოზულ რისკებს შეიცავდეს, როგორიცაა მონაცემების კარგვა და უსაფრთხოების " "გართულებები. ფრთხილად გამოიყენეთ." #: src/ui/pages/applications/mod.rs:1553 msgid "Killing an app can come with serious risks such as losing data and security implications. Use with caution." msgstr "" "აპლიკაციის მოკვლამ შეძლება ისეთ სერიოზულ რისკებს შეიცავდეს, როგორიცაა მონაცემების კარგვა და უსაფრთხოების გართულებები. " "ფრთხილად გამოიყენეთ." #: src/ui/pages/battery.rs:102 src/utils/battery.rs:258 msgid "Battery" msgstr "ელემენტი" #: src/ui/pages/battery.rs:210 msgid "Battery Charge" msgstr "ელემენტის მუხტი" #: src/ui/pages/battery.rs:279 src/ui/pages/cpu.rs:438 src/ui/pages/drive.rs:344 src/ui/pages/drive.rs:375 #: src/ui/pages/gpu.rs:429 src/ui/pages/network.rs:362 src/ui/pages/network.rs:396 msgid "Highest:" msgstr "უმაღლესი:" #: src/ui/pages/cpu.rs:242 src/ui/pages/gpu.rs:212 msgid "Total Usage" msgstr "სულ გამოყენება" #: src/ui/pages/cpu.rs:271 src/ui/pages/gpu.rs:239 msgid "Temperature" msgstr "ტემპერატურა" #: src/ui/pages/drive.rs:126 msgid "Drive" msgstr "დისკი" #: src/ui/pages/drive.rs:236 msgid "Drive Activity" msgstr "დისკის აქტივობა" #: src/ui/pages/drive.rs:243 msgid "Read Speed" msgstr "კითხვის სიჩქარე" #: src/ui/pages/drive.rs:247 msgid "Write Speed" msgstr "ჩაწერის სიჩქარე" #: src/ui/pages/drive.rs:412 src/ui/pages/drive.rs:422 msgid "Yes" msgstr "დიახ" #. Translators: This is an abbreviation for "Read" and "Write". This is displayed in the sidebar so your #. translation should preferably be quite short or an abbreviation #: src/ui/pages/drive.rs:440 msgid "R: {} · W: {}" msgstr "წ: {} · ჩ: {}" #: src/ui/pages/gpu.rs:220 msgid "Video Encoder/Decoder Usage" msgstr "ვიდეო ენჯიდერის/დეკოდერის გამოყენება" #: src/ui/pages/gpu.rs:226 msgid "Video Encoder Usage" msgstr "ვიდეოენკოდერის გამოყენება" #: src/ui/pages/gpu.rs:231 msgid "Video Decoder Usage" msgstr "ვიდეოდეკოდერის გამოყენება" #: src/ui/pages/gpu.rs:236 msgid "Video Memory Usage" msgstr "ვიდეომეხსიერების გამოყენება" #. Translators: This will be displayed in the sidebar, please try to keep your translation as short as (or even #. shorter than) 'Memory' #: src/ui/pages/gpu.rs:415 msgid "Memory: {}" msgstr "მეხსიერება: {}" #: src/ui/pages/memory.rs:262 msgid "{} of {}" msgstr "{} {}-დან" #: src/ui/pages/memory.rs:265 msgid "{} MT/s" msgstr "{} მტ/წმ" #. Translators: This will be displayed in the sidebar, so your translation for "Swap" should #. preferably be quite short or an abbreviation #: src/ui/pages/memory.rs:346 msgid "{} / {} · Swap: {} %" msgstr "{} / {} · სვოპი: {} %" #: src/ui/pages/network.rs:127 src/utils/network.rs:135 msgid "Network Interface" msgstr "ქსელის ინტერფეისი" #: src/ui/pages/network.rs:241 msgid "Receiving" msgstr "მიღება" #: src/ui/pages/network.rs:245 msgid "Sending" msgstr "გაგზავნა" #. Translators: This is an abbreviation for "Receive" and "Send". This is displayed in the sidebar so #. your translation should preferably be quite short or an abbreviation #: src/ui/pages/network.rs:445 msgid "R: {} · S: {}" msgstr "წ: {} · ჩ: {}" #: src/ui/pages/processes/mod.rs:813 msgid "Running Processes: {}" msgstr "გაშვებული პროცესები: {}" #: src/ui/pages/processes/mod.rs:911 msgid "Process" msgstr "პროცესი" #: src/ui/pages/processes/mod.rs:2083 msgid "End process?" msgid_plural "End {} processes?" msgstr[0] "დავასრულო პროცესი?" msgstr[1] "დავასრულო {} პროცესი?" #: src/ui/pages/processes/mod.rs:2089 msgid "Halt process?" msgid_plural "Halt {} processes?" msgstr[0] "შევაჩერო პროცესი?" msgstr[1] "შევაჩერო {} პროცესი?" #: src/ui/pages/processes/mod.rs:2095 src/ui/pages/processes/mod.rs:2101 msgid "Kill process?" msgid_plural "Kill {} processes?" msgstr[0] "მოვკლა პროცესი?" msgstr[1] "მოვკლა {} პროცესი?" #: src/ui/pages/processes/mod.rs:2113 msgid "Halting a process can come with serious risks such as losing data and security implications. Use with caution." msgstr "" "პროცესის შეჩერებამ შეძლება ისეთ სერიოზულ რისკებს შეიცავდეს, როგორიცაა მონაცემების კარგვა და უსაფრთხოების გართულებები. " "ფრთხილად გამოიყენეთ." #: src/ui/pages/processes/mod.rs:2116 msgid "Killing a process can come with serious risks such as losing data and security implications. Use with caution." msgstr "" "პროცესის მოკვლამ შეძლება ისეთ სერიოზულ რისკებს შეიცავდეს, როგორიცაა მონაცემების კარგვა და უსაფრთხოების გართულებები. " "ფრთხილად გამოიყენეთ." #: src/ui/window.rs:466 msgid "GPU {}" msgstr "GPU {}" #: src/ui/window.rs:496 msgid "NPU {}" msgstr "NPU {}" #: src/ui/window.rs:498 msgid "NPU" msgstr "NPU" #: src/ui/window.rs:1174 msgid "Successfully adjusted {}" msgstr "{} წარმატებით გასწორდა" #: src/ui/window.rs:1175 msgid "There was a problem adjusting {}" msgstr "{}-ის გასწორების პრობლემა" #: src/ui/window.rs:1257 msgid "Successfully ended {}" msgstr "{} წარმატებით დასრულდა" #: src/ui/window.rs:1258 msgid "Successfully halted {}" msgstr "{} წარმატებით შეჩერდა" #: src/ui/window.rs:1259 msgid "Successfully killed {}" msgstr "{} წარმატებით მოვკალი" #: src/ui/window.rs:1260 msgid "Successfully continued {}" msgstr "{} წარმატებით გაგრძელდა" #: src/ui/window.rs:1267 msgid "Successfully ended the process" msgid_plural "Successfully ended {} processes" msgstr[0] "პროცესი წარმატებით დასრულდა" msgstr[1] "{} პროცესი წარმატებით დასრულდა" #: src/ui/window.rs:1273 msgid "Successfully halted the process" msgid_plural "Successfully halted {} processes" msgstr[0] "პროცესი წარმატებით შეჩერდა" msgstr[1] "{} პროცესი წარმატებით შეჩერდა" #: src/ui/window.rs:1279 msgid "Successfully killed the process" msgid_plural "Successfully killed {} processes" msgstr[0] "პროცესი წარმატებით მოკვდა" msgstr[1] "{} პროცესი წარმატებით მოკვდა" #: src/ui/window.rs:1285 msgid "Successfully continued the process" msgid_plural "Successfully continued {} processes" msgstr[0] "პროცესი წარმატებით გაგრძელდა" msgstr[1] "{} პროცესი წარმატებით გაგრძელდა" #: src/ui/window.rs:1296 msgid "There was a problem ending a process" msgid_plural "There were problems ending {} processes" msgstr[0] "პროცესის დასრულების პრობლემა" msgstr[1] "{} პროცესის დასრულების პრობლემა" #: src/ui/window.rs:1302 msgid "There was a problem halting a process" msgid_plural "There were problems halting {} processes" msgstr[0] "პროცესის შეჩერების პრობლემა" msgstr[1] "{} პროცესის შეჩერების პრობლემა" #: src/ui/window.rs:1308 msgid "There was a problem killing a process" msgid_plural "There were problems killing {} processes" msgstr[0] "პროცესის მოკვლის პრობლემა" msgstr[1] "{} პროცესის მოკვლის პრობლემა" #: src/ui/window.rs:1314 msgid "There was a problem continuing a process" msgid_plural "There were problems continuing {} processes" msgstr[0] "პროცესის გაგრძელების პრობლემა" msgstr[1] "{} პროცესის გაგრძელების პრობლემა" #: src/ui/window.rs:1324 msgid "There was a problem ending {}" msgstr "{}-ის დასრულების პრობლემა" #: src/ui/window.rs:1325 msgid "There was a problem halting {}" msgstr "{}-ის შეჩერების პრობლემა" #: src/ui/window.rs:1326 msgid "There was a problem killing {}" msgstr "{}-ის მოკვლის პრობლემა" #: src/ui/window.rs:1327 msgid "There was a problem continuing {}" msgstr "{}-ის გაგრძელების პრობლემა" #: src/utils/app.rs:222 msgid "System Processes" msgstr "სისტემური პროცესები" #: src/utils/battery.rs:93 msgid "Charging" msgstr "იტენება" #: src/utils/battery.rs:94 msgid "Discharging" msgstr "იცლება" #: src/utils/battery.rs:95 msgid "Empty" msgstr "ცარიელი" #: src/utils/battery.rs:96 msgid "Full" msgstr "სრული" #: src/utils/battery.rs:97 msgid "Unknown" msgstr "უცნობი" #: src/utils/battery.rs:143 msgid "Nickel-Metal Hydride" msgstr "ნიკელი-ლითონის-ჰიდრიდი" #: src/utils/battery.rs:144 msgid "Nickel-Cadmium" msgstr "ნიკელ კადმიუმი" #: src/utils/battery.rs:145 msgid "Nickel-Zinc" msgstr "ნიკელ-თუთია" #: src/utils/battery.rs:146 msgid "Lead-Acid" msgstr "ტყვია-მჟავა" #: src/utils/battery.rs:147 msgid "Lithium-Ion" msgstr "ლითიუმ-იონი" #: src/utils/battery.rs:148 msgid "Lithium Iron Phosphate" msgstr "ლითიუმ-რკინის ფოსფატი" #: src/utils/battery.rs:149 msgid "Lithium Polymer" msgstr "ლითიუმ-პოლიმერი" #: src/utils/battery.rs:151 msgid "Rechargeable Alkaline Managanese" msgstr "დატენვადი ტუტე მანგანუმის" #: src/utils/battery.rs:256 msgid "{} Battery" msgstr "{} ელემენტი" #: src/utils/units.rs:91 msgid "{} K" msgstr "{} K" #: src/utils/units.rs:93 msgid "{} °C" msgstr "{} °C" #: src/utils/units.rs:95 msgid "{} °F" msgstr "{} °F" #: src/utils/units.rs:113 src/utils/units.rs:127 src/utils/units.rs:147 src/utils/units.rs:161 msgid "{} B" msgstr "{} ბ" #: src/utils/units.rs:114 src/utils/units.rs:128 msgid "{} kB" msgstr "{} კბ" #: src/utils/units.rs:115 src/utils/units.rs:129 msgid "{} MB" msgstr "{} მბ" #: src/utils/units.rs:116 src/utils/units.rs:130 msgid "{} GB" msgstr "{} გბ" #: src/utils/units.rs:117 src/utils/units.rs:131 msgid "{} TB" msgstr "{} ტბ" #: src/utils/units.rs:118 src/utils/units.rs:132 msgid "{} PB" msgstr "{} პბ" #: src/utils/units.rs:119 src/utils/units.rs:133 msgid "{} EB" msgstr "{} ებ" #: src/utils/units.rs:120 src/utils/units.rs:134 msgid "{} ZB" msgstr "{} ზბ" #: src/utils/units.rs:121 src/utils/units.rs:135 msgid "{} YB" msgstr "{} იბ" #: src/utils/units.rs:122 src/utils/units.rs:136 msgid "{} RB" msgstr "{} რბ" #: src/utils/units.rs:123 src/utils/units.rs:137 msgid "{} QB" msgstr "{} ქბ" #: src/utils/units.rs:148 src/utils/units.rs:162 msgid "{} KiB" msgstr "{} კიბ" #: src/utils/units.rs:149 src/utils/units.rs:163 msgid "{} MiB" msgstr "{} მიბ" #: src/utils/units.rs:150 src/utils/units.rs:164 msgid "{} GiB" msgstr "{} გიბ" #: src/utils/units.rs:151 src/utils/units.rs:165 msgid "{} TiB" msgstr "{} ტიბ" #: src/utils/units.rs:152 src/utils/units.rs:166 msgid "{} PiB" msgstr "{} პიბ" #: src/utils/units.rs:153 src/utils/units.rs:167 msgid "{} EiB" msgstr "{} ეიბ" #: src/utils/units.rs:154 src/utils/units.rs:168 msgid "{} ZiB" msgstr "{} ზიბ" #: src/utils/units.rs:155 src/utils/units.rs:169 msgid "{} YiB" msgstr "{} იიბ" #: src/utils/units.rs:156 src/utils/units.rs:170 msgid "{} RiB" msgstr "{} რიბ" #: src/utils/units.rs:157 src/utils/units.rs:171 msgid "{} QiB" msgstr "{} ქიბ" #: src/utils/units.rs:198 src/utils/units.rs:215 msgid "{} B/s" msgstr "{} ბ/წმ" #: src/utils/units.rs:199 msgid "{} kB/s" msgstr "{} კბ/წმ" #: src/utils/units.rs:200 msgid "{} MB/s" msgstr "{} მბ/წმ" #: src/utils/units.rs:201 msgid "{} GB/s" msgstr "{} გბ/წმ" #: src/utils/units.rs:202 msgid "{} TB/s" msgstr "{} ტბ/წმ" #: src/utils/units.rs:203 msgid "{} PB/s" msgstr "{} პბ/წმ" #: src/utils/units.rs:204 msgid "{} EB/s" msgstr "{} ებ/წმ" #: src/utils/units.rs:205 msgid "{} ZB/s" msgstr "{} ზბ/წმ" #: src/utils/units.rs:206 msgid "{} YB/s" msgstr "{} იბ/წმ" #: src/utils/units.rs:207 msgid "{} RB/s" msgstr "{} რბ/წმ" #: src/utils/units.rs:208 msgid "{} QB/s" msgstr "{} ქბ/წმ" #: src/utils/units.rs:216 msgid "{} KiB/s" msgstr "{} კიბ/წმ" #: src/utils/units.rs:217 msgid "{} MiB/s" msgstr "{} მიბ/წმ" #: src/utils/units.rs:218 msgid "{} GiB/s" msgstr "{} გიბ/წმ" #: src/utils/units.rs:219 msgid "{} TiB/s" msgstr "{} ტიბ/წმ" #: src/utils/units.rs:220 msgid "{} PiB/s" msgstr "{} პიბ/წმ" #: src/utils/units.rs:221 msgid "{} EiB/s" msgstr "{} ეიბ/წმ" #: src/utils/units.rs:222 msgid "{} ZiB/s" msgstr "{} ზიბ/წმ" #: src/utils/units.rs:223 msgid "{} YiB/s" msgstr "{} იიბ/წმ" #: src/utils/units.rs:224 msgid "{} RiB/s" msgstr "{} რიბ/წმ" #: src/utils/units.rs:225 msgid "{} QiB/s" msgstr "{} ქიბ/წმ" #: src/utils/units.rs:239 src/utils/units.rs:256 msgid "{} b/s" msgstr "{} ბ/წმ" #: src/utils/units.rs:240 msgid "{} kb/s" msgstr "{} კბ/წმ" #: src/utils/units.rs:241 msgid "{} Mb/s" msgstr "{} მბ/წმ" #: src/utils/units.rs:242 msgid "{} Gb/s" msgstr "{} გბ/წმ" #: src/utils/units.rs:243 msgid "{} Tb/s" msgstr "{} ტბ/წმ" #: src/utils/units.rs:244 msgid "{} Pb/s" msgstr "{} პბ/წმ" #: src/utils/units.rs:245 msgid "{} Eb/s" msgstr "{} ებ/წმ" #: src/utils/units.rs:246 msgid "{} Zb/s" msgstr "{} ზბ/წმ" #: src/utils/units.rs:247 msgid "{} Yb/s" msgstr "{} იბ/წმ" #: src/utils/units.rs:248 msgid "{} Rb/s" msgstr "{} რბ/წმ" #: src/utils/units.rs:249 msgid "{} Qb/s" msgstr "{} ქბ/წმ" #: src/utils/units.rs:257 msgid "{} Kib/s" msgstr "{} კიბ/წმ" #: src/utils/units.rs:258 msgid "{} Mib/s" msgstr "{} მიბ/წმ" #: src/utils/units.rs:259 msgid "{} Gib/s" msgstr "{} გიბ/წმ" #: src/utils/units.rs:260 msgid "{} Tib/s" msgstr "{} ტიბ/წმ" #: src/utils/units.rs:261 msgid "{} Pib/s" msgstr "{} პიბ/წმ" #: src/utils/units.rs:262 msgid "{} Eib/s" msgstr "{} ეიბ/წმ" #: src/utils/units.rs:263 msgid "{} Zib/s" msgstr "{} ზიბ/წმ" #: src/utils/units.rs:264 msgid "{} Yib/s" msgstr "{} იიბ/წმ" #: src/utils/units.rs:265 msgid "{} Rib/s" msgstr "{} რიბ/წმ" #: src/utils/units.rs:266 msgid "{} Qib/s" msgstr "{} ქიბ/წმ" #: src/utils/units.rs:273 msgid "{} Hz" msgstr "{} ჰც" #: src/utils/units.rs:274 msgid "{} kHz" msgstr "{} კჰც" #: src/utils/units.rs:275 msgid "{} MHz" msgstr "{} მჰც" #: src/utils/units.rs:276 msgid "{} GHz" msgstr "{} გჰც" #: src/utils/units.rs:277 msgid "{} THz" msgstr "{} ტჰც" #: src/utils/units.rs:278 msgid "{} PHz" msgstr "{} პჰც" #: src/utils/units.rs:279 msgid "{} EHz" msgstr "{} ეჰც" #: src/utils/units.rs:280 msgid "{} ZHz" msgstr "{} ზჰც" #: src/utils/units.rs:281 msgid "{} YHz" msgstr "{} იჰც" #: src/utils/units.rs:282 msgid "{} RHz" msgstr "{} რჰც" #: src/utils/units.rs:283 msgid "{} QHz" msgstr "{} ქჰც" #: src/utils/units.rs:290 msgid "{} W" msgstr "{} ვტ" #: src/utils/units.rs:291 msgid "{} kW" msgstr "{} კვტ" #: src/utils/units.rs:292 msgid "{} MW" msgstr "{} მვტ" #: src/utils/units.rs:293 msgid "{} GW" msgstr "{} გვტ" #: src/utils/units.rs:294 msgid "{} TW" msgstr "{} ტვტ" #: src/utils/units.rs:295 msgid "{} PW" msgstr "{} პვტ" #: src/utils/units.rs:296 msgid "{} EW" msgstr "{} ევტ" #: src/utils/units.rs:297 msgid "{} ZW" msgstr "{} ზვტ" #: src/utils/units.rs:298 msgid "{} YW" msgstr "{} ივტ" #: src/utils/units.rs:299 msgid "{} RW" msgstr "{} რვტ" #: src/utils/units.rs:300 msgid "{} QW" msgstr "{} ქვტ" #: src/utils/units.rs:309 src/utils/units.rs:323 msgid "{} Wh" msgstr "{} ვტ" #: src/utils/units.rs:310 src/utils/units.rs:324 msgid "{} kWh" msgstr "{} კვტ/სთ" #: src/utils/units.rs:311 src/utils/units.rs:325 msgid "{} MWh" msgstr "{} მვტ/სთ" #: src/utils/units.rs:312 src/utils/units.rs:326 msgid "{} GWh" msgstr "{} გვტ/სთ" #: src/utils/units.rs:313 src/utils/units.rs:327 msgid "{} TWh" msgstr "{} ტვტ/სთ" #: src/utils/units.rs:314 src/utils/units.rs:328 msgid "{} PWh" msgstr "{} პვტ/სთ" #: src/utils/units.rs:315 src/utils/units.rs:329 msgid "{} EWh" msgstr "{} ევტ/წმ" #: src/utils/units.rs:316 src/utils/units.rs:330 msgid "{} ZWh" msgstr "{} ზვტ/სთ" #: src/utils/units.rs:317 src/utils/units.rs:331 msgid "{} YWh" msgstr "{} ივტ/სთ" #: src/utils/units.rs:318 src/utils/units.rs:332 msgid "{} RWh" msgstr "{} რვტ/სთ" #: src/utils/units.rs:319 src/utils/units.rs:333 msgid "{} QWh" msgstr "{} ქვტ/სთ" #: src/utils/drive.rs:129 src/utils/drive.rs:208 msgid "CD/DVD/Blu-ray Drive" msgstr "CD/DVD/Blu-ray ამძრავი" #: src/utils/drive.rs:130 msgid "eMMC Storage" msgstr "eMMC საცავი" #: src/utils/drive.rs:131 msgid "Flash Storage" msgstr "Flash საცავი" #: src/utils/drive.rs:132 src/utils/drive.rs:209 msgid "Floppy Drive" msgstr "დისკეტა" #: src/utils/drive.rs:133 msgid "Hard Disk Drive" msgstr "მყარი დისკები" #: src/utils/drive.rs:134 msgid "Loop Device" msgstr "მარყუჟმოწყობილობა" #: src/utils/drive.rs:135 msgid "Mapped Device" msgstr "მიმაგრებული მოწყობილობები" #: src/utils/drive.rs:136 msgid "NVMe Drive" msgstr "NVMe დისკი" #: src/utils/drive.rs:138 msgid "Software Raid" msgstr "პროგრამული RAID" #: src/utils/drive.rs:139 msgid "RAM Disk" msgstr "RAM დისკი" #: src/utils/drive.rs:140 msgid "Solid State Drive" msgstr "SSD" #: src/utils/drive.rs:141 msgid "ZFS Volume" msgstr "ZFS ტომი" #: src/utils/drive.rs:142 msgid "Compressed RAM Disk (zram)" msgstr "შეკუმშული RAM რისკი (zram)" #: src/utils/drive.rs:210 msgid "{} Loop Device" msgstr "{} მარყუჟმოწყობილობა" #: src/utils/drive.rs:211 msgid "{} Mapped Device" msgstr "{} მიმაგრებული მოწყობილობა" #: src/utils/drive.rs:212 msgid "{} RAID" msgstr "{} RAID" #: src/utils/drive.rs:213 msgid "{} RAM Disk" msgstr "{} RAM დისკი" #: src/utils/drive.rs:214 msgid "{} zram Device" msgstr "{} zram მოწყობილობა" #: src/utils/drive.rs:215 msgid "{} ZFS Volume" msgstr "{} ZFS ტომი" #: src/utils/drive.rs:216 msgid "{} Drive" msgstr "{} დისკი" #: src/utils/network.rs:123 msgid "Bluetooth Tether" msgstr "ბლუთუზის Tether" #: src/utils/network.rs:124 msgid "Network Bridge" msgstr "ქსელური ხიდი" #: src/utils/network.rs:125 msgid "Ethernet Connection" msgstr "Ethernet შეერთება" #: src/utils/network.rs:126 msgid "Docker Bridge" msgstr "Docker-ის ხიდი" #: src/utils/network.rs:127 msgid "InfiniBand Connection" msgstr "InfiniBand შეერთება" #: src/utils/network.rs:128 msgid "Serial Line IP Connection" msgstr "სერიული ხაზის IP მიერთება" #: src/utils/network.rs:129 msgid "Virtual Ethernet Device" msgstr "ვირტუალური Ethernet მოწყობილობა" #: src/utils/network.rs:130 msgid "VM Network Bridge" msgstr "ვმ-ის ქსელური ხიდი" #: src/utils/network.rs:131 msgid "VPN Tunnel" msgstr "VPN გვირაბი" #: src/utils/network.rs:132 msgid "VPN Tunnel (WireGuard)" msgstr "VPN გვირაბი (WireGuard)" #: src/utils/network.rs:133 msgid "Wi-Fi Connection" msgstr "Wi-Fi შეერთება" #: src/utils/network.rs:134 msgid "WWAN Connection" msgstr "WWAN მიერთება" #~ msgid "Monitor your system resources and processes" #~ msgstr "გაშვებული პროცესებისა და სისტემის წარმადობის მონიტორინგი" #~ msgid "Window width" #~ msgstr "ფანჯრის სიგანე" #~ msgid "Window height" #~ msgstr "ფანჯრის სიმაღლე" #~ msgid "Window maximized state" #~ msgstr "ფანჯრის სრულად გაშლილი მდგომარეობა" #~ msgid "Temperature unit" #~ msgstr "ტემპერატურის ერთეული" #~ msgid "Unit Prefix Base" #~ msgstr "ძირითადი საზომი ერთეული" #~ msgid "Applications" #~ msgstr "აპლიკაციები" #~ msgid "Application" #~ msgstr "პროგრამა" #~ msgid "GPU Usage" #~ msgstr "GPU დატვირთვა" #~ msgid "root" #~ msgstr "root" #~ msgid "End application" #~ msgstr "აპლიკაციის დასრულება" #~ msgid "Kill application" #~ msgstr "აპლიკაციის მოკვლა" #~ msgid "Continue application" #~ msgstr "აპლიკაციის გაგრძელება" #~ msgid "Current Power Cap" #~ msgstr "მიმდინარე კვების ხარჯვის მაქსიმუმი" resources-1.9.1/po/meson.build000066400000000000000000000003331510634446000163160ustar00rootroot00000000000000i18n.gettext( 'resources', args: [ '--keyword=i18n', '--keyword=i18n_f', '--keyword=i18n_k', '--keyword=ni18n:1,2', '--keyword=ni18n_f:1,2', '--keyword=ni18n_k:1,2', ], preset: 'glib', ) resources-1.9.1/po/nb.po000066400000000000000000001275601510634446000151270ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-08-26 01:10+0200\n" "PO-Revision-Date: 2024-12-01 22:44+0100\n" "Last-Translator: Sunniva Løvstad \n" "Language-Team: \n" "Language: nb\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.5\n" #: data/net.nokyan.Resources.desktop.in.in:3 #: data/net.nokyan.Resources.metainfo.xml.in.in:4 src/application.rs:262 #: data/resources/ui/window.ui:22 msgid "Resources" msgstr "Resources" #. Translators: The summary should be 35 characters or less according to Flathub appstream guidelines #: data/net.nokyan.Resources.desktop.in.in:4 #: data/net.nokyan.Resources.metainfo.xml.in.in:5 msgid "Keep an eye on system resources" msgstr "Hold øye med systemresurser" #: data/net.nokyan.Resources.desktop.in.in:10 msgid "" "System;Resources;Monitor;Processes;Usage;Task;Manager;CPU;RAM;Memory;GPU;" msgstr "" "System;Resurser;Monitor;Prosess;Bruk;Prosesser;Overvåke;Task;Manager;CPU;RAM;" "Minne;GPU;" #: data/net.nokyan.Resources.metainfo.xml.in.in:17 msgid "" "Resources allows you to check the utilization of your system resources and " "control your running processes and apps. It’s designed to be user-friendly " "and feel right at home on a modern desktop by using GNOME’s libadwaita." msgstr "" "Resources lar deg sjekke forbruket av systemresursene dine og håndtere " "kjørende prosesser og apper. Den er utviklet for å være brukervennlig og å " "høre hjemme på et moderne skrivebord ved å bruke GNOMEs libadwaita." #: data/net.nokyan.Resources.metainfo.xml.in.in:20 msgid "Resources supports monitoring the following components:" msgstr "Resources kan overvåke de følgende komponenter:" #: data/net.nokyan.Resources.metainfo.xml.in.in:24 msgid "CPU" msgstr "CPU" #: data/net.nokyan.Resources.metainfo.xml.in.in:25 #: src/ui/pages/applications/mod.rs:844 src/ui/pages/memory.rs:140 #: src/ui/pages/memory.rs:221 src/ui/pages/processes/mod.rs:1013 #: data/resources/ui/window.ui:158 data/resources/ui/window.ui:165 #: data/resources/ui/dialogs/app_dialog.ui:82 #: data/resources/ui/dialogs/process_dialog.ui:64 #: data/resources/ui/dialogs/settings_dialog.ui:133 #: data/resources/ui/dialogs/settings_dialog.ui:215 msgid "Memory" msgstr "Minne" #: data/net.nokyan.Resources.metainfo.xml.in.in:26 #: src/ui/pages/applications/mod.rs:1217 src/ui/pages/gpu.rs:157 #: src/ui/pages/processes/mod.rs:1397 src/ui/window.rs:303 #: data/resources/ui/dialogs/app_dialog.ui:131 #: data/resources/ui/dialogs/process_dialog.ui:109 #: data/resources/ui/dialogs/settings_dialog.ui:163 #: data/resources/ui/dialogs/settings_dialog.ui:245 msgid "GPU" msgstr "GPU" #: data/net.nokyan.Resources.metainfo.xml.in.in:27 #: data/resources/ui/dialogs/settings_dialog.ui:304 msgid "Network Interfaces" msgstr "Nettverksgrensesnitt" #: data/net.nokyan.Resources.metainfo.xml.in.in:28 msgid "Storage Devices" msgstr "Lagringsenheter" #: data/net.nokyan.Resources.metainfo.xml.in.in:29 msgid "Batteries" msgstr "Batterier" #: data/net.nokyan.Resources.metainfo.xml.in.in:51 msgid "Apps page in light theme" msgstr "Apper-fanen i lys drakt" #: data/net.nokyan.Resources.metainfo.xml.in.in:55 msgid "Processes page in dark theme" msgstr "Prosesser-fanen i mørk drakt" #: data/net.nokyan.Resources.metainfo.xml.in.in:59 msgid "Processor page in light theme" msgstr "Prosessor-fanen i lys drakt" #: data/net.nokyan.Resources.metainfo.xml.in.in:63 msgid "Memory page in dark theme" msgstr "Minne-fanen i mørk drakt" #: data/net.nokyan.Resources.metainfo.xml.in.in:67 msgid "GPU page in light theme" msgstr "GPU-fanen i lys drakt" #: data/net.nokyan.Resources.metainfo.xml.in.in:71 msgid "Drive page in dark theme" msgstr "Disk-fanen i mørk drakt" #: data/net.nokyan.Resources.metainfo.xml.in.in:75 msgid "Network Interface page in light theme" msgstr "Nettverksgrensesnitt-fanen i lys drakt" #: data/net.nokyan.Resources.metainfo.xml.in.in:79 msgid "Battery page in dark theme" msgstr "Batteri-fanen i mørk drakt" #: src/application.rs:264 msgid "The Nalux Team" msgstr "Nalux-laget" #: src/application.rs:272 msgid "Report Issues" msgstr "Rapporter feil" #. Translator credits. Replace "translator-credits" with your name/username, and optionally an email or URL. #. One name per line, please do not remove previous names. #: src/application.rs:278 msgid "translator-credits" msgstr "Sunniva Løvstad " #: src/application.rs:279 msgid "Icon by" msgstr "Ikon av" #: src/ui/dialogs/app_dialog.rs:146 src/ui/dialogs/process_dialog.rs:125 #: src/ui/dialogs/process_dialog.rs:133 src/ui/dialogs/process_dialog.rs:135 #: src/ui/dialogs/process_dialog.rs:153 src/ui/dialogs/process_dialog.rs:160 #: src/ui/dialogs/process_dialog.rs:167 src/ui/dialogs/process_dialog.rs:174 #: src/ui/pages/applications/mod.rs:987 src/ui/pages/applications/mod.rs:1111 #: src/ui/pages/battery.rs:239 src/ui/pages/battery.rs:259 #: src/ui/pages/battery.rs:265 src/ui/pages/battery.rs:268 #: src/ui/pages/battery.rs:294 src/ui/pages/battery.rs:318 #: src/ui/pages/battery.rs:320 src/ui/pages/battery.rs:330 #: src/ui/pages/cpu.rs:253 src/ui/pages/cpu.rs:268 src/ui/pages/cpu.rs:283 #: src/ui/pages/cpu.rs:289 src/ui/pages/cpu.rs:295 src/ui/pages/cpu.rs:301 #: src/ui/pages/cpu.rs:305 src/ui/pages/cpu.rs:308 src/ui/pages/cpu.rs:405 #: src/ui/pages/drive.rs:341 src/ui/pages/drive.rs:371 #: src/ui/pages/drive.rs:373 src/ui/pages/drive.rs:401 #: src/ui/pages/drive.rs:403 src/ui/pages/drive.rs:419 #: src/ui/pages/drive.rs:420 src/ui/pages/drive.rs:427 #: src/ui/pages/drive.rs:437 src/ui/pages/drive.rs:447 src/ui/pages/gpu.rs:270 #: src/ui/pages/gpu.rs:312 src/ui/pages/gpu.rs:337 src/ui/pages/gpu.rs:340 #: src/ui/pages/gpu.rs:351 src/ui/pages/gpu.rs:371 src/ui/pages/gpu.rs:383 #: src/ui/pages/gpu.rs:397 src/ui/pages/gpu.rs:399 src/ui/pages/gpu.rs:411 #: src/ui/pages/gpu.rs:418 src/ui/pages/gpu.rs:422 src/ui/pages/memory.rs:256 #: src/ui/pages/memory.rs:257 src/ui/pages/memory.rs:261 #: src/ui/pages/memory.rs:262 src/ui/pages/memory.rs:266 #: src/ui/pages/memory.rs:267 src/ui/pages/memory.rs:295 #: src/ui/pages/memory.rs:352 src/ui/pages/network.rs:273 #: src/ui/pages/network.rs:280 src/ui/pages/network.rs:287 #: src/ui/pages/network.rs:293 src/ui/pages/network.rs:296 #: src/ui/pages/network.rs:357 src/ui/pages/network.rs:360 #: src/ui/pages/network.rs:362 src/ui/pages/network.rs:391 #: src/ui/pages/network.rs:394 src/ui/pages/network.rs:396 #: src/ui/pages/processes/mod.rs:1155 src/ui/pages/processes/mod.rs:1221 #: src/ui/pages/processes/mod.rs:1287 src/ui/pages/processes/mod.rs:1353 #: src/ui/pages/processes/mod.rs:1835 src/ui/pages/processes/mod.rs:1837 #: src/utils/battery.rs:139 src/utils/drive.rs:90 src/utils/gpu/mod.rs:258 #: src/utils/gpu/mod.rs:264 msgid "N/A" msgstr "Ukjent" #: src/ui/dialogs/process_options_dialog.rs:142 src/ui/pages/cpu.rs:267 #: src/ui/pages/cpu.rs:389 src/ui/pages/cpu.rs:393 msgid "CPU {}" msgstr "CPU {}" #: src/ui/pages/applications/application_entry.rs:179 src/ui/pages/drive.rs:434 #: src/ui/pages/drive.rs:444 src/ui/pages/processes/process_entry.rs:206 msgid "No" msgstr "Nei" #: src/ui/pages/applications/application_entry.rs:180 #: src/ui/pages/processes/process_entry.rs:207 msgid "Yes (Flatpak)" msgstr "Ja (Flatpak)" #: src/ui/pages/applications/application_entry.rs:181 #: src/ui/pages/processes/process_entry.rs:208 msgid "Yes (Snap)" msgstr "Ja (Snap)" #: src/ui/pages/applications/mod.rs:165 data/resources/ui/window.ui:65 #: data/resources/ui/window.ui:72 #: data/resources/ui/dialogs/settings_dialog.ui:127 msgid "Apps" msgstr "Apper" #: src/ui/pages/applications/mod.rs:700 msgid "Running Apps: {}" msgstr "Kjørende apper: {}" #: src/ui/pages/applications/mod.rs:741 src/ui/pages/processes/mod.rs:798 msgid "Cancel" msgstr "Avbryt" #: src/ui/pages/applications/mod.rs:787 msgid "App" msgstr "App" #: src/ui/pages/applications/mod.rs:903 src/ui/pages/cpu.rs:157 #: src/ui/pages/processes/mod.rs:1071 src/ui/window.rs:355 #: data/resources/ui/window.ui:127 data/resources/ui/window.ui:134 #: data/resources/ui/dialogs/app_dialog.ui:73 #: data/resources/ui/dialogs/process_dialog.ui:55 #: data/resources/ui/dialogs/settings_dialog.ui:138 #: data/resources/ui/dialogs/settings_dialog.ui:220 msgid "Processor" msgstr "Prosessor" #: src/ui/pages/applications/mod.rs:966 src/ui/pages/processes/mod.rs:1134 #: data/resources/ui/dialogs/app_dialog.ui:91 #: data/resources/ui/dialogs/process_dialog.ui:69 #: data/resources/ui/dialogs/settings_dialog.ui:143 #: data/resources/ui/dialogs/settings_dialog.ui:225 msgid "Drive Read" msgstr "Disklesing" #: src/ui/pages/applications/mod.rs:1030 src/ui/pages/processes/mod.rs:1200 #: data/resources/ui/dialogs/app_dialog.ui:100 #: data/resources/ui/dialogs/process_dialog.ui:78 #: data/resources/ui/dialogs/settings_dialog.ui:148 #: data/resources/ui/dialogs/settings_dialog.ui:230 msgid "Drive Read Total" msgstr "Disklesingstotal" #: src/ui/pages/applications/mod.rs:1090 src/ui/pages/processes/mod.rs:1266 #: data/resources/ui/dialogs/app_dialog.ui:109 #: data/resources/ui/dialogs/process_dialog.ui:87 #: data/resources/ui/dialogs/settings_dialog.ui:153 #: data/resources/ui/dialogs/settings_dialog.ui:235 msgid "Drive Write" msgstr "Diskskriving" #: src/ui/pages/applications/mod.rs:1156 src/ui/pages/processes/mod.rs:1332 #: data/resources/ui/dialogs/app_dialog.ui:118 #: data/resources/ui/dialogs/process_dialog.ui:96 #: data/resources/ui/dialogs/settings_dialog.ui:158 #: data/resources/ui/dialogs/settings_dialog.ui:240 msgid "Drive Write Total" msgstr "Diskskrivingstotal" #: src/ui/pages/applications/mod.rs:1275 src/ui/pages/processes/mod.rs:1455 #: data/resources/ui/dialogs/app_dialog.ui:149 #: data/resources/ui/dialogs/process_dialog.ui:127 #: data/resources/ui/dialogs/settings_dialog.ui:173 #: data/resources/ui/dialogs/settings_dialog.ui:255 msgid "Video Encoder" msgstr "Videokoder" #: src/ui/pages/applications/mod.rs:1335 src/ui/pages/processes/mod.rs:1515 #: data/resources/ui/dialogs/app_dialog.ui:158 #: data/resources/ui/dialogs/process_dialog.ui:136 #: data/resources/ui/dialogs/settings_dialog.ui:178 #: data/resources/ui/dialogs/settings_dialog.ui:260 msgid "Video Decoder" msgstr "Videoavkoder" #: src/ui/pages/applications/mod.rs:1394 src/ui/pages/processes/mod.rs:1575 #: data/resources/ui/dialogs/app_dialog.ui:140 #: data/resources/ui/dialogs/process_dialog.ui:118 #: data/resources/ui/dialogs/settings_dialog.ui:168 #: data/resources/ui/dialogs/settings_dialog.ui:250 msgid "Video Memory" msgstr "Videominne" #: src/ui/pages/applications/mod.rs:1451 src/ui/pages/processes/mod.rs:1877 msgid "End {}?" msgstr "Avslutt {}?" #: src/ui/pages/applications/mod.rs:1452 src/ui/pages/processes/mod.rs:1878 msgid "Halt {}?" msgstr "Stopp {}?" #: src/ui/pages/applications/mod.rs:1453 src/ui/pages/processes/mod.rs:1879 msgid "Kill {}?" msgstr "Død {}?" #: src/ui/pages/applications/mod.rs:1454 src/ui/pages/processes/mod.rs:1880 msgid "Continue {}?" msgstr "Fortsett {}?" #: src/ui/pages/applications/mod.rs:1460 src/ui/pages/processes/mod.rs:1886 msgid "Unsaved work might be lost." msgstr "Ulagret arbeid kan bli mistet." #: src/ui/pages/applications/mod.rs:1461 msgid "" "Halting an app can come with serious risks such as losing data and security " "implications. Use with caution." msgstr "" "Å stoppe en app kan medføre alvorlige risikoer som tap av data og " "sikkerhetskonsekvenser. Bruk med omhu." #: src/ui/pages/applications/mod.rs:1462 msgid "" "Killing an app can come with serious risks such as losing data and security " "implications. Use with caution." msgstr "" "Å døde en app kan medføre alvorlige risikoer som tap av data og " "sikkerhetskonsekvenser. Bruk med omhu." #: src/ui/pages/applications/mod.rs:1469 #: data/resources/ui/pages/applications.ui:22 #: data/resources/ui/pages/applications.ui:127 msgid "End App" msgstr "Avslutt app" #: src/ui/pages/applications/mod.rs:1470 #: data/resources/ui/pages/applications.ui:10 #: data/resources/ui/pages/applications.ui:30 msgid "Halt App" msgstr "Stopp app" #: src/ui/pages/applications/mod.rs:1471 #: data/resources/ui/pages/applications.ui:6 #: data/resources/ui/pages/applications.ui:26 msgid "Kill App" msgstr "Død app" #: src/ui/pages/applications/mod.rs:1472 #: data/resources/ui/pages/applications.ui:14 #: data/resources/ui/pages/applications.ui:34 msgid "Continue App" msgstr "Fortsett app" #: src/ui/pages/battery.rs:144 src/ui/pages/drive.rs:165 msgid "Drive" msgstr "Disk" #: src/ui/pages/battery.rs:244 msgid "Battery Charge" msgstr "Ladning" #: src/ui/pages/battery.rs:251 data/resources/ui/pages/gpu.ui:55 msgid "Power Usage" msgstr "Strømforbruk" #: src/ui/pages/battery.rs:308 src/ui/pages/drive.rs:365 #: src/ui/pages/drive.rs:395 src/ui/pages/network.rs:349 #: src/ui/pages/network.rs:383 msgid "Highest:" msgstr "Høyest:" #: src/ui/pages/cpu.rs:252 src/ui/pages/gpu.rs:241 msgid "Total Usage" msgstr "Totalforbruk" #: src/ui/pages/drive.rs:267 msgid "Drive Activity" msgstr "Diskaktivitet" #: src/ui/pages/drive.rs:274 msgid "Read Speed" msgstr "Lesehastighet" #: src/ui/pages/drive.rs:278 msgid "Write Speed" msgstr "Skrivehastighet" #: src/ui/pages/drive.rs:432 src/ui/pages/drive.rs:442 msgid "Yes" msgstr "Ja" #. Translators: This is an abbreviation for "Read" and "Write". This is displayed in the sidebar so your #. translation should preferably be quite short or an abbreviation #: src/ui/pages/drive.rs:454 msgid "R: {} · W: {}" msgstr "L: {} · S: {}" #: src/ui/pages/gpu.rs:249 msgid "Video Encoder/Decoder Usage" msgstr "Bruk av videokoderen og -avkoderen" #: src/ui/pages/gpu.rs:255 msgid "Video Encoder Usage" msgstr "Bruk av videokoderen" #: src/ui/pages/gpu.rs:260 msgid "Video Decoder Usage" msgstr "Bruk av videoavkoderen" #: src/ui/pages/gpu.rs:265 msgid "Video Memory Usage" msgstr "Bruk av videominne" #: src/ui/pages/gpu.rs:428 msgid "VRAM: {}" msgstr "VRAM: {}" #: src/ui/pages/memory.rs:227 msgid "Swap" msgstr "Swap" #: src/ui/pages/memory.rs:291 msgid "{} of {}" msgstr "{} av {}" #: src/ui/pages/memory.rs:294 msgid "{} MT/s" msgstr "{} MT/s" #. Translators: This will be displayed in the sidebar, so your translation for "Swap" should #. preferably be quite short or an abbreviation #: src/ui/pages/memory.rs:371 msgid "{} / {} · Swap: {} %" msgstr "{} / {} · Swap: {} %" #: src/ui/pages/network.rs:157 src/utils/network.rs:128 msgid "Network Interface" msgstr "Nettverksgrensesnitt" #: src/ui/pages/network.rs:261 msgid "Receiving" msgstr "Mottagning" #: src/ui/pages/network.rs:265 msgid "Sending" msgstr "Sending" #. Translators: This is an abbreviation for "Receive" and "Send". This is displayed in the sidebar so #. your translation should preferably be quite short or an abbreviation #: src/ui/pages/network.rs:406 msgid "R: {} · S: {}" msgstr "M: {} · S: {}" #: src/ui/pages/processes/mod.rs:177 data/resources/ui/window.ui:96 #: data/resources/ui/window.ui:103 #: data/resources/ui/dialogs/settings_dialog.ui:188 msgid "Processes" msgstr "Prosesser" #: src/ui/pages/processes/mod.rs:757 msgid "Running Processes: {}" msgstr "Kjørende prosesser: {}" #: src/ui/pages/processes/mod.rs:845 msgid "Process" msgstr "Prosess" #: src/ui/pages/processes/mod.rs:906 #: data/resources/ui/dialogs/process_dialog.ui:177 #: data/resources/ui/dialogs/settings_dialog.ui:205 msgid "Process ID" msgstr "Prosess-ID" #: src/ui/pages/processes/mod.rs:959 #: data/resources/ui/dialogs/process_dialog.ui:204 #: data/resources/ui/dialogs/settings_dialog.ui:210 msgid "User" msgstr "Bruker" #: src/ui/pages/processes/mod.rs:1634 #: data/resources/ui/dialogs/process_dialog.ui:145 #: data/resources/ui/dialogs/settings_dialog.ui:265 msgid "Total CPU Time" msgstr "Total CPU-tid" #: src/ui/pages/processes/mod.rs:1693 #: data/resources/ui/dialogs/process_dialog.ui:154 #: data/resources/ui/dialogs/settings_dialog.ui:270 msgid "User CPU Time" msgstr "Bruker CPU-tid" #: src/ui/pages/processes/mod.rs:1752 #: data/resources/ui/dialogs/process_dialog.ui:163 #: data/resources/ui/dialogs/settings_dialog.ui:275 msgid "System CPU Time" msgstr "System CPU-tid" #: src/ui/pages/processes/mod.rs:1811 #: data/resources/ui/dialogs/process_options_dialog.ui:87 #: data/resources/ui/dialogs/settings_dialog.ui:280 msgid "Priority" msgstr "Prioritet" #: src/ui/pages/processes/mod.rs:1887 msgid "" "Halting a process can come with serious risks such as losing data and " "security implications. Use with caution." msgstr "" "Å stoppe en prosess kan medføre alvorlige risikoer som tap av data og " "sikkerhetskonsekvenser. Bruk med omhu." #: src/ui/pages/processes/mod.rs:1888 msgid "" "Killing a process can come with serious risks such as losing data and " "security implications. Use with caution." msgstr "" "Å døde en prosess kan medføre alvorlige risikoer som tap av data og " "sikkerhetskonsekvenser. Bruk med omhu." #: src/ui/pages/processes/mod.rs:1895 data/resources/ui/pages/processes.ui:22 #: data/resources/ui/pages/processes.ui:146 msgid "End Process" msgstr "Avslutt prosess" #: src/ui/pages/processes/mod.rs:1896 data/resources/ui/pages/processes.ui:10 #: data/resources/ui/pages/processes.ui:30 msgid "Halt Process" msgstr "Stopp prosess" #: src/ui/pages/processes/mod.rs:1897 data/resources/ui/pages/processes.ui:6 #: data/resources/ui/pages/processes.ui:26 msgid "Kill Process" msgstr "Død prosess" #: src/ui/pages/processes/mod.rs:1898 data/resources/ui/pages/processes.ui:14 #: data/resources/ui/pages/processes.ui:34 msgid "Continue Process" msgstr "Fortsett prosess" #: src/ui/window.rs:301 msgid "GPU {}" msgstr "GPU {}" #: src/ui/window.rs:916 msgid "Successfully adjusted {}" msgstr "Endret {}" #: src/ui/window.rs:917 msgid "There was a problem adjusting {}" msgstr "Det oppsto et problem med å endre {}" #: src/ui/window.rs:997 msgid "Successfully ended {}" msgstr "Avsluttet {}" #: src/ui/window.rs:998 msgid "Successfully halted {}" msgstr "Stoppet {}" #: src/ui/window.rs:999 msgid "Successfully killed {}" msgstr "Dødet {}" #: src/ui/window.rs:1000 msgid "Successfully continued {}" msgstr "Fortsatte {}" #: src/ui/window.rs:1007 msgid "There was a problem ending a process" msgid_plural "There were problems ending {} processes" msgstr[0] "Det oppsto et problem med å avslutte en prosess" msgstr[1] "Det oppsto et problem med å avslutte {} prosesser" #: src/ui/window.rs:1013 msgid "There was a problem halting a process" msgid_plural "There were problems halting {} processes" msgstr[0] "Det oppsto et problem med å stoppe en prosess" msgstr[1] "Det oppsto et problem med å stoppe {} prosesser" #: src/ui/window.rs:1019 msgid "There was a problem killing a process" msgid_plural "There were problems killing {} processes" msgstr[0] "Det oppsto et problem med å døde en prosess" msgstr[1] "Det oppsto et problem med å døde {} prosesser" #: src/ui/window.rs:1025 msgid "There was a problem continuing a process" msgid_plural "There were problems continuing {} processes" msgstr[0] "Det oppsto et problem med å fortsette en prosess" msgstr[1] "Det oppsto et problem med å fortsette {} prosesser" #: src/ui/window.rs:1035 msgid "There was a problem ending {}" msgstr "Det oppsto et problem med å avslutte {}" #: src/ui/window.rs:1036 msgid "There was a problem halting {}" msgstr "Det oppsto et problem med å stoppe {}" #: src/ui/window.rs:1037 msgid "There was a problem killing {}" msgstr "Det oppsto et problem med å døde {}" #: src/ui/window.rs:1038 msgid "There was a problem continuing {}" msgstr "Det oppsto et problem med å fortsette {}" #: src/utils/app.rs:220 msgid "System Processes" msgstr "Systemprosesser" #: src/utils/battery.rs:80 msgid "Charging" msgstr "Lader" #: src/utils/battery.rs:81 msgid "Discharging" msgstr "Avlader" #: src/utils/battery.rs:82 msgid "Empty" msgstr "Tom" #: src/utils/battery.rs:83 msgid "Full" msgstr "Full" #: src/utils/battery.rs:84 msgid "Unknown" msgstr "Ukjent" #: src/utils/battery.rs:130 msgid "Nickel-Metal Hydride" msgstr "Nikkel-metallhydrid" #: src/utils/battery.rs:131 msgid "Nickel-Cadmium" msgstr "Nikkel-kadmium" #: src/utils/battery.rs:132 msgid "Nickel-Zinc" msgstr "Nikkel-sink" #: src/utils/battery.rs:133 msgid "Lead-Acid" msgstr "Blysyre" #: src/utils/battery.rs:134 msgid "Lithium-Ion" msgstr "Litium-ion" #: src/utils/battery.rs:135 msgid "Lithium Iron Phosphate" msgstr "Litium-ion-fosfat" #: src/utils/battery.rs:136 msgid "Lithium Polymer" msgstr "Litiumpolymer" #: src/utils/battery.rs:138 msgid "Rechargeable Alkaline Managanese" msgstr "Oppladbar alkalisk manganese" #: src/utils/battery.rs:232 msgid "{} Battery" msgstr "{}-batteri" #: src/utils/battery.rs:234 msgid "Battery" msgstr "Batteri" #: src/utils/drive.rs:82 src/utils/drive.rs:153 msgid "CD/DVD/Blu-ray Drive" msgstr "CD/DVD/Blu-Ray-stasjon" #: src/utils/drive.rs:83 msgid "eMMC Storage" msgstr "eMMC-lagring" #: src/utils/drive.rs:84 msgid "Flash Storage" msgstr "Flashlagring" #: src/utils/drive.rs:85 src/utils/drive.rs:154 msgid "Floppy Drive" msgstr "Diskett" #: src/utils/drive.rs:86 msgid "Hard Disk Drive" msgstr "Harddisk" #: src/utils/drive.rs:87 msgid "Loop Device" msgstr "Sløyfeenhet" #: src/utils/drive.rs:88 msgid "Mapped Device" msgstr "Kartlagt enget" #: src/utils/drive.rs:89 msgid "NVMe Drive" msgstr "NVMe-disk" #: src/utils/drive.rs:91 msgid "Software Raid" msgstr "Programvare-RAID" #: src/utils/drive.rs:92 msgid "RAM Disk" msgstr "RAM-disk" #: src/utils/drive.rs:93 msgid "Solid State Drive" msgstr "Halvlederdisk" #: src/utils/drive.rs:94 msgid "ZFS Volume" msgstr "ZFS-volum" #: src/utils/drive.rs:95 msgid "Compressed RAM Disk (zram)" msgstr "Komprimert RAM-disk (zram)" #: src/utils/drive.rs:155 msgid "{} Loop Device" msgstr "{}-sløyfeenhet" #: src/utils/drive.rs:156 msgid "{} Mapped Device" msgstr "{}-kartlagt-enhet" #: src/utils/drive.rs:157 msgid "{} RAID" msgstr "{}-RAID" #: src/utils/drive.rs:158 msgid "{} RAM Disk" msgstr "{}-RAM-disk" #: src/utils/drive.rs:159 msgid "{} zram Device" msgstr "{}-zram-enhet" #: src/utils/drive.rs:160 msgid "{} ZFS Volume" msgstr "{}-ZFS-volum" #: src/utils/drive.rs:161 msgid "{} Drive" msgstr "{}-disk" #: src/utils/network.rs:116 msgid "Bluetooth Tether" msgstr "Blåtanntilknytting" #: src/utils/network.rs:117 msgid "Network Bridge" msgstr "Nettverksbro" #: src/utils/network.rs:118 msgid "Ethernet Connection" msgstr "Ethernet-tilkobling" #: src/utils/network.rs:119 msgid "Docker Bridge" msgstr "Docker-bro" #: src/utils/network.rs:120 msgid "InfiniBand Connection" msgstr "InfiniBand-tilkobling" #: src/utils/network.rs:121 msgid "Serial Line IP Connection" msgstr "IP-tilkobling med seriell linje" #: src/utils/network.rs:122 msgid "Virtual Ethernet Device" msgstr "Virtuell Ethernet-enhet" #: src/utils/network.rs:123 msgid "VM Network Bridge" msgstr "VM-nettverksbro" #: src/utils/network.rs:124 msgid "VPN Tunnel" msgstr "VPN-tunnel" #: src/utils/network.rs:125 msgid "VPN Tunnel (WireGuard)" msgstr "VPN-tunnel (WireGuard)" #: src/utils/network.rs:126 msgid "Wi-Fi Connection" msgstr "Wi-Fi-tilkobling" #: src/utils/network.rs:127 msgid "WWAN Connection" msgstr "WWAN-tilkobling" #: src/utils/units.rs:59 msgid "{} K" msgstr "{} K" #: src/utils/units.rs:61 msgid "{} °C" msgstr "{} °C" #: src/utils/units.rs:63 msgid "{} °F" msgstr "{} °F" #: src/utils/units.rs:81 src/utils/units.rs:95 src/utils/units.rs:115 #: src/utils/units.rs:129 msgid "{} B" msgstr "{} B" #: src/utils/units.rs:82 src/utils/units.rs:96 msgid "{} kB" msgstr "{} B" #: src/utils/units.rs:83 src/utils/units.rs:97 msgid "{} MB" msgstr "{} MB" #: src/utils/units.rs:84 src/utils/units.rs:98 msgid "{} GB" msgstr "{} GB" #: src/utils/units.rs:85 src/utils/units.rs:99 msgid "{} TB" msgstr "{} TB" #: src/utils/units.rs:86 src/utils/units.rs:100 msgid "{} PB" msgstr "{} PB" #: src/utils/units.rs:87 src/utils/units.rs:101 msgid "{} EB" msgstr "{} EB" #: src/utils/units.rs:88 src/utils/units.rs:102 msgid "{} ZB" msgstr "{} ZB" #: src/utils/units.rs:89 src/utils/units.rs:103 msgid "{} YB" msgstr "{} YB" #: src/utils/units.rs:90 src/utils/units.rs:104 msgid "{} RB" msgstr "{} RB" #: src/utils/units.rs:91 src/utils/units.rs:105 msgid "{} QB" msgstr "{} QB" #: src/utils/units.rs:116 src/utils/units.rs:130 msgid "{} KiB" msgstr "{} KiB" #: src/utils/units.rs:117 src/utils/units.rs:131 msgid "{} MiB" msgstr "{} MiB" #: src/utils/units.rs:118 src/utils/units.rs:132 msgid "{} GiB" msgstr "{} GiB" #: src/utils/units.rs:119 src/utils/units.rs:133 msgid "{} TiB" msgstr "{} TiB" #: src/utils/units.rs:120 src/utils/units.rs:134 msgid "{} PiB" msgstr "{} PiB" #: src/utils/units.rs:121 src/utils/units.rs:135 msgid "{} EiB" msgstr "{} EiB" #: src/utils/units.rs:122 src/utils/units.rs:136 msgid "{} ZiB" msgstr "{} ZiB" #: src/utils/units.rs:123 src/utils/units.rs:137 msgid "{} YiB" msgstr "{} YiB" #: src/utils/units.rs:124 src/utils/units.rs:138 msgid "{} RiB" msgstr "{} RiB" #: src/utils/units.rs:125 src/utils/units.rs:139 msgid "{} QiB" msgstr "{} QiB" #: src/utils/units.rs:166 src/utils/units.rs:183 msgid "{} B/s" msgstr "{} B/s" #: src/utils/units.rs:167 msgid "{} kB/s" msgstr "{} kB/s" #: src/utils/units.rs:168 msgid "{} MB/s" msgstr "{} MB/s" #: src/utils/units.rs:169 msgid "{} GB/s" msgstr "{} GB/s" #: src/utils/units.rs:170 msgid "{} TB/s" msgstr "{} TB/s" #: src/utils/units.rs:171 msgid "{} PB/s" msgstr "{} PB/s" #: src/utils/units.rs:172 msgid "{} EB/s" msgstr "{} EB/s" #: src/utils/units.rs:173 msgid "{} ZB/s" msgstr "{} ZB/s" #: src/utils/units.rs:174 msgid "{} YB/s" msgstr "{} YB/s" #: src/utils/units.rs:175 msgid "{} RB/s" msgstr "{} RB/s" #: src/utils/units.rs:176 msgid "{} QB/s" msgstr "{} QB/s" #: src/utils/units.rs:184 msgid "{} KiB/s" msgstr "{} KiB/s" #: src/utils/units.rs:185 msgid "{} MiB/s" msgstr "{} MiB/s" #: src/utils/units.rs:186 msgid "{} GiB/s" msgstr "{} GiB/s" #: src/utils/units.rs:187 msgid "{} TiB/s" msgstr "{} TiB/s" #: src/utils/units.rs:188 msgid "{} PiB/s" msgstr "{} PiB/s" #: src/utils/units.rs:189 msgid "{} EiB/s" msgstr "{} EiB/s" #: src/utils/units.rs:190 msgid "{} ZiB/s" msgstr "{} ZiB/s" #: src/utils/units.rs:191 msgid "{} YiB/s" msgstr "{} YiB/s" #: src/utils/units.rs:192 msgid "{} RiB/s" msgstr "{} RiB/s" #: src/utils/units.rs:193 msgid "{} QiB/s" msgstr "{} QiB/s" #: src/utils/units.rs:200 src/utils/units.rs:217 msgid "{} b/s" msgstr "{} b/s" #: src/utils/units.rs:201 msgid "{} kb/s" msgstr "{} kb/s" #: src/utils/units.rs:202 msgid "{} Mb/s" msgstr "{} Mb/s" #: src/utils/units.rs:203 msgid "{} Gb/s" msgstr "{} Gb/s" #: src/utils/units.rs:204 msgid "{} Tb/s" msgstr "{} Tb/s" #: src/utils/units.rs:205 msgid "{} Pb/s" msgstr "{} Pb/s" #: src/utils/units.rs:206 msgid "{} Eb/s" msgstr "{} Eb/s" #: src/utils/units.rs:207 msgid "{} Zb/s" msgstr "{} Zb/s" #: src/utils/units.rs:208 msgid "{} Yb/s" msgstr "{} Yb/s" #: src/utils/units.rs:209 msgid "{} Rb/s" msgstr "{} Rb/s" #: src/utils/units.rs:210 msgid "{} Qb/s" msgstr "{} Qb/s" #: src/utils/units.rs:218 msgid "{} Kib/s" msgstr "{} Kib/s" #: src/utils/units.rs:219 msgid "{} Mib/s" msgstr "{} Mib/s" #: src/utils/units.rs:220 msgid "{} Gib/s" msgstr "{} Gib/s" #: src/utils/units.rs:221 msgid "{} Tib/s" msgstr "{} Tib/s" #: src/utils/units.rs:222 msgid "{} Pib/s" msgstr "{} Pib/s" #: src/utils/units.rs:223 msgid "{} Eib/s" msgstr "{} Eib/s" #: src/utils/units.rs:224 msgid "{} Zib/s" msgstr "{} Zib/s" #: src/utils/units.rs:225 msgid "{} Yib/s" msgstr "{} Yib/s" #: src/utils/units.rs:226 msgid "{} Rib/s" msgstr "{} Rib/s" #: src/utils/units.rs:227 msgid "{} Qib/s" msgstr "{} Qib/s" #: src/utils/units.rs:234 msgid "{} Hz" msgstr "{} Hz" #: src/utils/units.rs:235 msgid "{} kHz" msgstr "{} kHz" #: src/utils/units.rs:236 msgid "{} MHz" msgstr "{} MHz" #: src/utils/units.rs:237 msgid "{} GHz" msgstr "{} GHz" #: src/utils/units.rs:238 msgid "{} THz" msgstr "{} THz" #: src/utils/units.rs:239 msgid "{} PHz" msgstr "{} PHz" #: src/utils/units.rs:240 msgid "{} EHz" msgstr "{} EHz" #: src/utils/units.rs:241 msgid "{} ZHz" msgstr "{} ZHz" #: src/utils/units.rs:242 msgid "{} YHz" msgstr "{} YHz" #: src/utils/units.rs:243 msgid "{} RHz" msgstr "{} RHz" #: src/utils/units.rs:244 msgid "{} QHz" msgstr "{} QHz" #: src/utils/units.rs:251 msgid "{} W" msgstr "{} W" #: src/utils/units.rs:252 msgid "{} kW" msgstr "{} kW" #: src/utils/units.rs:253 msgid "{} MW" msgstr "{} MW" #: src/utils/units.rs:254 msgid "{} GW" msgstr "{} GW" #: src/utils/units.rs:255 msgid "{} TW" msgstr "{} TW" #: src/utils/units.rs:256 msgid "{} PW" msgstr "{} PW" #: src/utils/units.rs:257 msgid "{} EW" msgstr "{} EW" #: src/utils/units.rs:258 msgid "{} ZW" msgstr "{} ZW" #: src/utils/units.rs:259 msgid "{} YW" msgstr "{} YW" #: src/utils/units.rs:260 msgid "{} RW" msgstr "{} RW" #: src/utils/units.rs:261 msgid "{} QW" msgstr "{} QW" #: src/utils/units.rs:270 src/utils/units.rs:284 msgid "{} Wh" msgstr "{} Wh" #: src/utils/units.rs:271 src/utils/units.rs:285 msgid "{} kWh" msgstr "{} kWh" #: src/utils/units.rs:272 src/utils/units.rs:286 msgid "{} MWh" msgstr "{} MWh" #: src/utils/units.rs:273 src/utils/units.rs:287 msgid "{} GWh" msgstr "{} GWh" #: src/utils/units.rs:274 src/utils/units.rs:288 msgid "{} TWh" msgstr "{} TWh" #: src/utils/units.rs:275 src/utils/units.rs:289 msgid "{} PWh" msgstr "{} PWh" #: src/utils/units.rs:276 src/utils/units.rs:290 msgid "{} EWh" msgstr "{} EWh" #: src/utils/units.rs:277 src/utils/units.rs:291 msgid "{} ZWh" msgstr "{} ZWh" #: src/utils/units.rs:278 src/utils/units.rs:292 msgid "{} YWh" msgstr "{} YWh" #: src/utils/units.rs:279 src/utils/units.rs:293 msgid "{} RWh" msgstr "{} RWh" #: src/utils/units.rs:280 src/utils/units.rs:294 msgid "{} QWh" msgstr "{} QWh" #: data/resources/ui/shortcuts.ui:11 msgctxt "shortcut window" msgid "General" msgstr "Generelt" #: data/resources/ui/shortcuts.ui:14 msgctxt "shortcut window" msgid "Preferences" msgstr "Åpne brukervalg" #: data/resources/ui/shortcuts.ui:20 msgctxt "shortcut window" msgid "Show Shortcuts" msgstr "Vis snarveier" #: data/resources/ui/shortcuts.ui:26 msgctxt "shortcut window" msgid "Quit" msgstr "Avslutt" #: data/resources/ui/shortcuts.ui:32 msgctxt "shortcut window" msgid "Toggle Search Field" msgstr "Vis eller skjul søkefeltet" #: data/resources/ui/shortcuts.ui:38 msgctxt "shortcut window" msgid "End App/Process" msgstr "Avslutt app/prosess" #: data/resources/ui/shortcuts.ui:44 msgctxt "shortcut window" msgid "Kill App/Process" msgstr "Død app/prosess" #: data/resources/ui/shortcuts.ui:50 msgctxt "shortcut window" msgid "Halt App/Process" msgstr "Stopp app/prosess" #: data/resources/ui/shortcuts.ui:56 msgctxt "shortcut window" msgid "Continue App/Process" msgstr "Fortsett app/prosess" #: data/resources/ui/shortcuts.ui:62 msgctxt "shortcut window" msgid "Show Information for App/Process" msgstr "Vis app- eller prosessopplysninger" #: data/resources/ui/shortcuts.ui:68 msgctxt "shortcut window" msgid "Show Process Options" msgstr "Vis prosessinnstillinger" #: data/resources/ui/window.ui:6 msgid "Preferences" msgstr "Innstillnger" #: data/resources/ui/window.ui:10 msgid "Keyboard Shortcuts" msgstr "Tastatursnarveier" #: data/resources/ui/window.ui:14 msgid "About Resources" msgstr "Om Resources" #: data/resources/ui/dialogs/app_dialog.ui:7 msgid "App Information" msgstr "Appopplysninger" #: data/resources/ui/dialogs/app_dialog.ui:70 #: data/resources/ui/dialogs/process_dialog.ui:48 #: data/resources/ui/pages/battery.ui:22 data/resources/ui/pages/cpu.ui:37 #: data/resources/ui/pages/cpu.ui:50 data/resources/ui/pages/drive.ui:22 #: data/resources/ui/pages/gpu.ui:22 data/resources/ui/pages/memory.ui:31 #: data/resources/ui/pages/network.ui:22 msgid "Usage" msgstr "Bruk" #: data/resources/ui/dialogs/app_dialog.ui:165 #: data/resources/ui/dialogs/process_dialog.ui:170 #: data/resources/ui/pages/battery.ui:33 data/resources/ui/pages/cpu.ui:89 #: data/resources/ui/pages/drive.ui:54 data/resources/ui/pages/gpu.ui:80 #: data/resources/ui/pages/memory.ui:42 data/resources/ui/pages/network.ui:51 msgid "Properties" msgstr "Egenskaper" #: data/resources/ui/dialogs/app_dialog.ui:171 msgid "ID" msgstr "ID" #: data/resources/ui/dialogs/app_dialog.ui:181 #: data/resources/ui/dialogs/process_dialog.ui:186 msgid "Running Since" msgstr "Kjører siden" #: data/resources/ui/dialogs/app_dialog.ui:189 msgid "Running Processes" msgstr "Kjørende prosesser" #: data/resources/ui/dialogs/app_dialog.ui:198 #: data/resources/ui/dialogs/process_dialog.ui:222 msgid "Containerized" msgstr "Containerisert" #: data/resources/ui/dialogs/process_dialog.ui:7 msgid "Process Information" msgstr "Prosessopplysninger" #: data/resources/ui/dialogs/process_dialog.ui:195 msgid "Commandline" msgstr "Kommandolinje" #: data/resources/ui/dialogs/process_dialog.ui:213 msgid "Control Group" msgstr "Kontrollgruppe" #: data/resources/ui/dialogs/process_options_dialog.ui:7 #: data/resources/ui/dialogs/process_options_dialog.ui:69 msgid "Process Options" msgstr "Prosessinnstillinger" #: data/resources/ui/dialogs/process_options_dialog.ui:29 msgid "Apply" msgstr "Bruk" #: data/resources/ui/dialogs/process_options_dialog.ui:72 msgid "Niceness" msgstr "Hyggelighet" #: data/resources/ui/dialogs/process_options_dialog.ui:73 msgid "" "The priority of a process is given by its niceness. A lower niceness value " "correspond to a higher priority." msgstr "" "Prioriteten av en prosess er gitt av hyggeligheten sin. En lavere " "hyggelighetsverdi tilsvarer en høyere prioritet." #: data/resources/ui/dialogs/process_options_dialog.ui:91 msgctxt "process priority" msgid "Very High" msgstr "Veldig høy" #: data/resources/ui/dialogs/process_options_dialog.ui:92 msgctxt "process priority" msgid "High" msgstr "Høy" #: data/resources/ui/dialogs/process_options_dialog.ui:93 msgctxt "process priority" msgid "Normal" msgstr "Normal" #: data/resources/ui/dialogs/process_options_dialog.ui:94 msgctxt "process priority" msgid "Low" msgstr "Lav" #: data/resources/ui/dialogs/process_options_dialog.ui:95 msgctxt "process priority" msgid "Very Low" msgstr "Veldig lav" #: data/resources/ui/dialogs/process_options_dialog.ui:103 msgid "Processor Affinity" msgstr "Prosessoraffinitet" #: data/resources/ui/dialogs/process_options_dialog.ui:108 msgid "Toggle All" msgstr "Slå på/av alle" #: data/resources/ui/dialogs/process_options_dialog.ui:111 msgid "Select which processor cores the process is allowed to run on" msgstr "Velg hvilke kjerner prosessen kan kjøre på" #: data/resources/ui/dialogs/settings_dialog.ui:7 msgid "General" msgstr "Generelt" #: data/resources/ui/dialogs/settings_dialog.ui:10 msgid "Units" msgstr "Enheter" #: data/resources/ui/dialogs/settings_dialog.ui:13 msgid "Data Unit Prefix" msgstr "Dataenhetsprefiks" #: data/resources/ui/dialogs/settings_dialog.ui:17 msgid "Decimal" msgstr "Desimal" #: data/resources/ui/dialogs/settings_dialog.ui:18 msgid "Binary" msgstr "Binært" #: data/resources/ui/dialogs/settings_dialog.ui:26 msgid "Show Network Speeds in Bits per Second" msgstr "Vis nettverkshastigheter i biter per sekund" #: data/resources/ui/dialogs/settings_dialog.ui:31 msgid "Temperature Unit" msgstr "Temperaturenhet" #: data/resources/ui/dialogs/settings_dialog.ui:35 msgid "Celsius" msgstr "Celsius" #: data/resources/ui/dialogs/settings_dialog.ui:36 msgid "Kelvin" msgstr "Kelvin" #: data/resources/ui/dialogs/settings_dialog.ui:37 msgid "Fahrenheit" msgstr "Fahrenheit" #: data/resources/ui/dialogs/settings_dialog.ui:47 msgid "User Interface" msgstr "Brukergrensesnitt" #: data/resources/ui/dialogs/settings_dialog.ui:50 msgid "Refresh Speed" msgstr "Oppdateringshastighet" #: data/resources/ui/dialogs/settings_dialog.ui:51 msgid "Higher refresh speeds can lead to higher processor usage" msgstr "Høyere oppdateringshastigheter kan føre til høyere bruk av prosessoren" #: data/resources/ui/dialogs/settings_dialog.ui:55 msgctxt "UI refresh speed" msgid "Very Slow" msgstr "Veldig treg" #: data/resources/ui/dialogs/settings_dialog.ui:56 msgctxt "UI refresh speed" msgid "Slow" msgstr "Treg" #: data/resources/ui/dialogs/settings_dialog.ui:57 msgctxt "UI refresh speed" msgid "Normal" msgstr "Normal" #: data/resources/ui/dialogs/settings_dialog.ui:58 msgctxt "UI refresh speed" msgid "Fast" msgstr "Raskt" #: data/resources/ui/dialogs/settings_dialog.ui:59 msgctxt "UI refresh speed" msgid "Very Fast" msgstr "Veldig raskt" #: data/resources/ui/dialogs/settings_dialog.ui:67 msgid "Show Graph Grids" msgstr "Vis grafrutenett" #: data/resources/ui/dialogs/settings_dialog.ui:72 msgid "Graph Data Points" msgstr "Datapunkt på grafer" #: data/resources/ui/dialogs/settings_dialog.ui:86 msgid "Show Search Fields on Launch" msgstr "Vis søkefelt ved åpning" #: data/resources/ui/dialogs/settings_dialog.ui:91 msgid "Show Usage Details in Sidebar" msgstr "Vis brukopplysninger i sidefeltet" #: data/resources/ui/dialogs/settings_dialog.ui:92 msgid "If enabled, the usage along with other information will be displayed" msgstr "Viser bruk og flere opplysninger dersom dette er aktivert" #: data/resources/ui/dialogs/settings_dialog.ui:97 msgid "Show Device Descriptions in Sidebar" msgstr "Vis enhetsbeskrivninger i sidefeltet" #: data/resources/ui/dialogs/settings_dialog.ui:98 msgid "" "If enabled, a device identifier like its name or device type will be " "displayed" msgstr "" "Viser en enhetsidentifikator som f.eks. et navn eller en enhetstype dersom " "dette er aktivert" #: data/resources/ui/dialogs/settings_dialog.ui:103 msgid "Sidebar Meter Type" msgstr "Sidefeltsmetertype" #: data/resources/ui/dialogs/settings_dialog.ui:107 msgid "Bar" msgstr "Søyle" #: data/resources/ui/dialogs/settings_dialog.ui:108 msgid "Graph" msgstr "Graf" #: data/resources/ui/dialogs/settings_dialog.ui:116 msgid "Normalize Processor Usage" msgstr "Normaliser prosessorbruk" #: data/resources/ui/dialogs/settings_dialog.ui:117 msgid "" "If enabled, the total usage of all cores will be divided by the amount of " "cores" msgstr "" "Det totale bruket av alle kjerner skal divideres av antallet av kjerner " "dersom dette er aktivert" #: data/resources/ui/dialogs/settings_dialog.ui:130 #: data/resources/ui/dialogs/settings_dialog.ui:202 msgid "Information Columns" msgstr "Opplysningssøyler" #: data/resources/ui/dialogs/settings_dialog.ui:191 #: data/resources/ui/pages/cpu.ui:22 data/resources/ui/pages/processes.ui:40 msgid "Options" msgstr "Innstillinger" #: data/resources/ui/dialogs/settings_dialog.ui:194 msgid "Show Niceness Values" msgstr "Vis hyggelighetsverdier" #: data/resources/ui/dialogs/settings_dialog.ui:195 msgid "" "Display priorities as niceness to allow for more fine-grained adjustments" msgstr "" "Vis prioriteter som hyggelighet for å kunne foreta mer finkornede justeringer" #: data/resources/ui/dialogs/settings_dialog.ui:290 msgid "Devices" msgstr "Enheter" #: data/resources/ui/dialogs/settings_dialog.ui:293 msgid "Drives" msgstr "Disker" #: data/resources/ui/dialogs/settings_dialog.ui:296 msgid "Show Virtual Drives" msgstr "Vis virtuelle disker" #: data/resources/ui/dialogs/settings_dialog.ui:297 msgid "Virtual drives are for example ZFS volumes or mapped devices" msgstr "Virtuelle disker er f.eks. ZFS-volumer eller kartlagde enheter" #: data/resources/ui/dialogs/settings_dialog.ui:307 msgid "Show Virtual Network Interfaces" msgstr "Vis virtuelle nettverksgrensesnitt" #: data/resources/ui/dialogs/settings_dialog.ui:308 msgid "Virtual network interfaces are for example bridges or VPN tunnels" msgstr "Virtuelle nettverksgrensesnitt er f.eks. broer eller VPN-tuneller" #: data/resources/ui/pages/applications.ui:40 #: data/resources/ui/pages/applications.ui:116 #: data/resources/ui/pages/applications.ui:118 msgid "Show App Information" msgstr "Vis appopplysninger" #: data/resources/ui/pages/applications.ui:80 msgid "Search applications" msgstr "Søk etter applikasjoner" #: data/resources/ui/pages/applications.ui:98 #: data/resources/ui/pages/processes.ui:104 msgid "Search" msgstr "Søk" #: data/resources/ui/pages/applications.ui:100 #: data/resources/ui/pages/processes.ui:106 msgid "Toggle search field" msgstr "Vis eller skjul søkefeltet" #: data/resources/ui/pages/battery.ui:36 msgid "Battery Health" msgstr "Batterihelse" #: data/resources/ui/pages/battery.ui:45 msgid "Design Capacity" msgstr "Designkapasitet" #: data/resources/ui/pages/battery.ui:54 msgid "Charge Cycles" msgstr "Ladesykluser" #: data/resources/ui/pages/battery.ui:63 msgid "Technology" msgstr "Teknologi" #: data/resources/ui/pages/battery.ui:72 data/resources/ui/pages/gpu.ui:87 #: data/resources/ui/pages/network.ui:58 msgid "Manufacturer" msgstr "Produsent" #: data/resources/ui/pages/battery.ui:81 msgid "Model Name" msgstr "Modellnavn" #: data/resources/ui/pages/battery.ui:90 data/resources/ui/pages/drive.ui:66 msgid "Device" msgstr "Enhet" #: data/resources/ui/pages/cpu.ui:26 msgid "Show Usages of Logical CPUs" msgstr "Vis bruk av logiske CPU-er" #: data/resources/ui/pages/cpu.ui:75 data/resources/ui/pages/gpu.ui:66 msgid "Sensors" msgstr "Sensorer" #: data/resources/ui/pages/cpu.ui:82 data/resources/ui/pages/gpu.ui:69 msgid "Temperature" msgstr "Temperatur" #: data/resources/ui/pages/cpu.ui:96 msgid "Max Frequency" msgstr "Maksimum frekvens" #: data/resources/ui/pages/cpu.ui:105 msgid "Logical Cores" msgstr "Logiske kjerner" #: data/resources/ui/pages/cpu.ui:114 msgid "Physical Cores" msgstr "Fysiske kjerner" #: data/resources/ui/pages/cpu.ui:123 msgid "Sockets" msgstr "Sokkeler" #: data/resources/ui/pages/cpu.ui:132 msgid "Virtualization" msgstr "Virtualisering" #: data/resources/ui/pages/cpu.ui:141 msgid "Architecture" msgstr "Arkitektur" #: data/resources/ui/pages/drive.ui:38 msgid "Total Read" msgstr "Total lest" #: data/resources/ui/pages/drive.ui:47 msgid "Total Written" msgstr "Total skrevet" #: data/resources/ui/pages/drive.ui:57 data/resources/ui/pages/memory.ui:72 msgid "Type" msgstr "Typ" #: data/resources/ui/pages/drive.ui:75 msgid "Capacity" msgstr "Kapasitet" #: data/resources/ui/pages/drive.ui:84 msgid "Writable" msgstr "Skrivelig" #: data/resources/ui/pages/drive.ui:93 msgid "Removable" msgstr "Fjernelig" #: data/resources/ui/pages/gpu.ui:37 msgid "GPU Frequency" msgstr "GPU-frekvens" #: data/resources/ui/pages/gpu.ui:50 msgid "Video Memory Frequency" msgstr "Videominnefrekvens" #: data/resources/ui/pages/gpu.ui:96 msgid "PCI Slot" msgstr "PCI-spor" #: data/resources/ui/pages/gpu.ui:105 data/resources/ui/pages/network.ui:67 msgid "Driver Used" msgstr "Driver brukt" #: data/resources/ui/pages/gpu.ui:114 msgid "Max Power Cap" msgstr "Maksimal strømgrense" #: data/resources/ui/pages/memory.ui:9 msgid "You need to authenticate to see memory properties" msgstr "Du må autentisere for å se minneegenskaper" #: data/resources/ui/pages/memory.ui:10 msgid "Authenticate" msgstr "Autentiser" #: data/resources/ui/pages/memory.ui:45 msgid "Slots Used" msgstr "Spor brukt" #: data/resources/ui/pages/memory.ui:54 msgid "Speed" msgstr "Hastighet" #: data/resources/ui/pages/memory.ui:63 msgid "Form Factor" msgstr "Formfaktor" #: data/resources/ui/pages/memory.ui:81 msgid "Type Detail" msgstr "Typedetaljer" #: data/resources/ui/pages/network.ui:35 msgid "Total Received" msgstr "Total mottatt" #: data/resources/ui/pages/network.ui:44 msgid "Total Sent" msgstr "Total sendt" #: data/resources/ui/pages/network.ui:76 msgid "Interface" msgstr "Grensesnitt" #: data/resources/ui/pages/network.ui:85 msgid "Hardware Address" msgstr "Maskinvareadresse" #: data/resources/ui/pages/processes.ui:46 #: data/resources/ui/pages/processes.ui:135 #: data/resources/ui/pages/processes.ui:137 msgid "Show Process Information" msgstr "Vis prosessopplysninger" #: data/resources/ui/pages/processes.ui:86 msgid "Search processes" msgstr "Søk etter prosesser" #: data/resources/ui/pages/processes.ui:122 #: data/resources/ui/pages/processes.ui:124 msgid "Show Process Options" msgstr "Vis prosessinnstillinger" resources-1.9.1/po/nl.po000066400000000000000000001463751510634446000151460ustar00rootroot00000000000000# # nokyan , 2023. # Heimen Stoffels , 2024. # Dick Groskamp , 2025. # Nathan Follens , 2025. # msgid "" msgstr "" "Project-Id-Version: resources\n" "Report-Msgid-Bugs-To: https://github.com/nokyan/resources/issues/\n" "POT-Creation-Date: 2025-10-11 15:36+0000\n" "PO-Revision-Date: 2025-10-11 23:13+0200\n" "Last-Translator: Nathan Follens \n" "Language-Team: GNOME-NL https://matrix.to/#/#nl:gnome.org\n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.6\n" #: data/net.nokyan.Resources.desktop.in.in:2 #: data/net.nokyan.Resources.metainfo.xml.in.in:4 data/resources/ui/window.ui:22 #: src/application.rs:272 msgid "Resources" msgstr "Systeembronnen" #. Translators: The summary should be 35 characters or less according to Flathub appstream guidelines #: data/net.nokyan.Resources.desktop.in.in:3 #: data/net.nokyan.Resources.metainfo.xml.in.in:5 msgid "Keep an eye on system resources" msgstr "Monitor uw systeembronnen en -processen" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/net.nokyan.Resources.desktop.in.in:9 msgid "System;Resources;Monitor;Processes;Usage;Task;Manager;CPU;RAM;Memory;GPU;" msgstr "System;Resources;Monitor;Processes;Usage;Task;Manager;CPU;RAM;Memory;GPU;systeem;bronnen;systeembronnen;processen;gebruik;verbruik;taak;beheer;geheugen;" #: data/net.nokyan.Resources.metainfo.xml.in.in:17 msgid "" "Resources allows you to check the utilization of your system resources and " "control your running processes and apps. It’s designed to be user-friendly and " "feel right at home on a modern desktop by using GNOME’s libadwaita." msgstr "" "Met behulp van Systeembronnen kunt u het gebruik van uw systeembronnen nauwkeurig " "monitoren. Daarnaast kunt u alle processen en toepassingen beheren. " "Gebruiksvriendelijkheid staat hoog in het vaandel en qua vormgeving past de " "toepassing - dankzij GNOME’s libadwaita - uitstekend in een moderne werkomgeving." #: data/net.nokyan.Resources.metainfo.xml.in.in:20 msgid "Resources supports monitoring the following components:" msgstr "Systeembronnen heeft ondersteuning voor de volgende items:" #: data/net.nokyan.Resources.metainfo.xml.in.in:24 msgid "CPU" msgstr "CPU" #: data/net.nokyan.Resources.metainfo.xml.in.in:25 #: data/resources/ui/dialogs/app_dialog.ui:82 #: data/resources/ui/dialogs/process_dialog.ui:64 #: data/resources/ui/dialogs/settings_dialog.ui:128 #: data/resources/ui/dialogs/settings_dialog.ui:220 data/resources/ui/window.ui:176 #: data/resources/ui/window.ui:183 src/ui/pages/applications/mod.rs:803 #: src/ui/pages/memory.rs:106 src/ui/pages/memory.rs:192 #: src/ui/pages/processes/mod.rs:1080 msgid "Memory" msgstr "Geheugen" #: data/net.nokyan.Resources.metainfo.xml.in.in:26 #: data/resources/ui/dialogs/app_dialog.ui:140 #: data/resources/ui/dialogs/process_dialog.ui:118 #: data/resources/ui/dialogs/settings_dialog.ui:158 #: data/resources/ui/dialogs/settings_dialog.ui:250 #: src/ui/pages/applications/mod.rs:1181 src/ui/pages/gpu.rs:119 #: src/ui/pages/processes/mod.rs:1470 src/ui/window.rs:468 msgid "GPU" msgstr "GPU" #: data/net.nokyan.Resources.metainfo.xml.in.in:27 #: data/resources/ui/dialogs/settings_dialog.ui:324 msgid "Network Interfaces" msgstr "Netwerkinterfaces" #: data/net.nokyan.Resources.metainfo.xml.in.in:28 msgid "Storage Devices" msgstr "Opslagapparaten" #: data/net.nokyan.Resources.metainfo.xml.in.in:29 msgid "Batteries" msgstr "Accu’s" #: data/net.nokyan.Resources.metainfo.xml.in.in:51 msgid "Apps page in light theme" msgstr "Toepassingspagina (licht thema)" #: data/net.nokyan.Resources.metainfo.xml.in.in:55 msgid "Processes page in dark theme" msgstr "Procespagina (donker thema)" #: data/net.nokyan.Resources.metainfo.xml.in.in:59 msgid "Processor page in light theme" msgstr "Processorpagina (licht thema)" #: data/net.nokyan.Resources.metainfo.xml.in.in:63 msgid "Memory page in dark theme" msgstr "Geheugenpagina (donker thema)" #: data/net.nokyan.Resources.metainfo.xml.in.in:67 msgid "GPU page in light theme" msgstr "Videokaartpagina (licht thema)" #: data/net.nokyan.Resources.metainfo.xml.in.in:71 msgid "Drive page in dark theme" msgstr "Schijfpagina (donker thema)" #: data/net.nokyan.Resources.metainfo.xml.in.in:75 msgid "Network Interface page in light theme" msgstr "Netwerkinterfacepagina (licht thema)" #: data/net.nokyan.Resources.metainfo.xml.in.in:79 msgid "Battery page in dark theme" msgstr "Accupagina (donker thema)" #: data/net.nokyan.Resources.policy.in.in:9 msgid "Control Process" msgstr "Proces beheren" #: data/net.nokyan.Resources.policy.in.in:10 msgid "Authentication is required to control superuser’s or other users’ processes" msgstr "" "Authenticatie is vereist om de processen van een beheerder of van andere " "gebruikers te beheren" #: data/resources/ui/dialogs/app_dialog.ui:7 msgid "App Information" msgstr "Toepassingsinformatie" #: data/resources/ui/dialogs/app_dialog.ui:70 #: data/resources/ui/dialogs/process_dialog.ui:48 #: data/resources/ui/pages/battery.ui:22 data/resources/ui/pages/cpu.ui:37 #: data/resources/ui/pages/cpu.ui:50 data/resources/ui/pages/drive.ui:22 #: data/resources/ui/pages/gpu.ui:22 data/resources/ui/pages/memory.ui:31 #: data/resources/ui/pages/network.ui:22 data/resources/ui/pages/npu.ui:22 msgid "Usage" msgstr "Gebruik" #: data/resources/ui/dialogs/app_dialog.ui:73 #: data/resources/ui/dialogs/process_dialog.ui:55 #: data/resources/ui/dialogs/settings_dialog.ui:133 #: data/resources/ui/dialogs/settings_dialog.ui:225 data/resources/ui/window.ui:145 #: data/resources/ui/window.ui:152 src/ui/pages/applications/mod.rs:862 #: src/ui/pages/cpu.rs:128 src/ui/pages/processes/mod.rs:1139 src/ui/window.rs:290 msgid "Processor" msgstr "Processor" #: data/resources/ui/dialogs/app_dialog.ui:91 #: data/resources/ui/dialogs/process_dialog.ui:73 #: data/resources/ui/dialogs/settings_dialog.ui:178 #: data/resources/ui/dialogs/settings_dialog.ui:290 #: src/ui/pages/applications/mod.rs:1420 src/ui/pages/memory.rs:198 #: src/ui/pages/processes/mod.rs:1955 msgid "Swap" msgstr "Wisselgeheugen" #: data/resources/ui/dialogs/app_dialog.ui:100 #: data/resources/ui/dialogs/process_dialog.ui:78 #: data/resources/ui/dialogs/settings_dialog.ui:138 #: data/resources/ui/dialogs/settings_dialog.ui:230 #: src/ui/pages/applications/mod.rs:926 src/ui/pages/processes/mod.rs:1203 msgid "Drive Read" msgstr "Schijf (uitgelezen)" #: data/resources/ui/dialogs/app_dialog.ui:109 #: data/resources/ui/dialogs/process_dialog.ui:87 #: data/resources/ui/dialogs/settings_dialog.ui:143 #: data/resources/ui/dialogs/settings_dialog.ui:235 #: src/ui/pages/applications/mod.rs:991 src/ui/pages/processes/mod.rs:1270 msgid "Drive Read Total" msgstr "Schijf (uitgelezen - totaal)" #: data/resources/ui/dialogs/app_dialog.ui:118 #: data/resources/ui/dialogs/process_dialog.ui:96 #: data/resources/ui/dialogs/settings_dialog.ui:148 #: data/resources/ui/dialogs/settings_dialog.ui:240 #: src/ui/pages/applications/mod.rs:1052 src/ui/pages/processes/mod.rs:1337 msgid "Drive Write" msgstr "Schijf (weggeschreven)" #: data/resources/ui/dialogs/app_dialog.ui:127 #: data/resources/ui/dialogs/process_dialog.ui:105 #: data/resources/ui/dialogs/settings_dialog.ui:153 #: data/resources/ui/dialogs/settings_dialog.ui:245 #: src/ui/pages/applications/mod.rs:1119 src/ui/pages/processes/mod.rs:1404 msgid "Drive Write Total" msgstr "Schijf (weggeschreven - totaal)" #: data/resources/ui/dialogs/app_dialog.ui:149 #: data/resources/ui/dialogs/process_dialog.ui:127 #: data/resources/ui/dialogs/settings_dialog.ui:163 #: data/resources/ui/dialogs/settings_dialog.ui:255 #: src/ui/pages/applications/mod.rs:1361 src/ui/pages/processes/mod.rs:1651 msgid "Video Memory" msgstr "Videogeheugen" #: data/resources/ui/dialogs/app_dialog.ui:158 #: data/resources/ui/dialogs/process_dialog.ui:136 #: data/resources/ui/dialogs/settings_dialog.ui:168 #: data/resources/ui/dialogs/settings_dialog.ui:260 #: src/ui/pages/applications/mod.rs:1240 src/ui/pages/processes/mod.rs:1529 msgid "Video Encoder" msgstr "Video-encodering" #: data/resources/ui/dialogs/app_dialog.ui:167 #: data/resources/ui/dialogs/process_dialog.ui:145 #: data/resources/ui/dialogs/settings_dialog.ui:173 #: data/resources/ui/dialogs/settings_dialog.ui:265 #: src/ui/pages/applications/mod.rs:1301 src/ui/pages/processes/mod.rs:1590 msgid "Video Decoder" msgstr "Videodecodering" #: data/resources/ui/dialogs/app_dialog.ui:174 #: data/resources/ui/dialogs/process_dialog.ui:179 #: data/resources/ui/pages/battery.ui:33 data/resources/ui/pages/cpu.ui:83 #: data/resources/ui/pages/drive.ui:54 data/resources/ui/pages/gpu.ui:74 #: data/resources/ui/pages/memory.ui:42 data/resources/ui/pages/network.ui:51 #: data/resources/ui/pages/npu.ui:68 msgid "Properties" msgstr "Eigenschappen" #: data/resources/ui/dialogs/app_dialog.ui:180 msgid "ID" msgstr "ID" #: data/resources/ui/dialogs/app_dialog.ui:190 #: data/resources/ui/dialogs/process_dialog.ui:195 msgid "Running Since" msgstr "Actief sinds" #: data/resources/ui/dialogs/app_dialog.ui:198 msgid "Running Processes" msgstr "Actieve processen" #: data/resources/ui/dialogs/app_dialog.ui:207 #: data/resources/ui/dialogs/process_dialog.ui:231 msgid "Containerized" msgstr "In container" #: data/resources/ui/dialogs/process_dialog.ui:7 msgid "Process Information" msgstr "Procesinformatie" #: data/resources/ui/dialogs/process_dialog.ui:154 #: data/resources/ui/dialogs/settings_dialog.ui:270 #: src/ui/pages/processes/mod.rs:1711 msgid "Total CPU Time" msgstr "CPU-gebruik totaal" #: data/resources/ui/dialogs/process_dialog.ui:163 #: data/resources/ui/dialogs/settings_dialog.ui:275 #: src/ui/pages/processes/mod.rs:1770 msgid "User CPU Time" msgstr "CPU-gebruik gebruiker" #: data/resources/ui/dialogs/process_dialog.ui:172 #: data/resources/ui/dialogs/settings_dialog.ui:280 #: src/ui/pages/processes/mod.rs:1829 msgid "System CPU Time" msgstr "CPU-gebruik systeem" #: data/resources/ui/dialogs/process_dialog.ui:186 #: data/resources/ui/dialogs/settings_dialog.ui:210 #: src/ui/pages/processes/mod.rs:973 msgid "Process ID" msgstr "Proces-ID" #: data/resources/ui/dialogs/process_dialog.ui:204 #: data/resources/ui/dialogs/settings_dialog.ui:300 #: src/ui/pages/processes/mod.rs:2075 msgid "Commandline" msgstr "Opdrachtregel" #: data/resources/ui/dialogs/process_dialog.ui:213 #: data/resources/ui/dialogs/settings_dialog.ui:215 #: src/ui/pages/processes/mod.rs:1026 msgid "User" msgstr "Gebruiker" #: data/resources/ui/dialogs/process_dialog.ui:222 msgid "Control Group" msgstr "Beheergroep" #: data/resources/ui/dialogs/process_options_dialog.ui:7 #: data/resources/ui/dialogs/process_options_dialog.ui:69 msgid "Process Options" msgstr "Procesopties" #: data/resources/ui/dialogs/process_options_dialog.ui:29 msgid "Apply" msgstr "Toepassen" #: data/resources/ui/dialogs/process_options_dialog.ui:72 msgid "Niceness" msgstr "Niceness" #: data/resources/ui/dialogs/process_options_dialog.ui:73 msgid "" "The priority of a process is given by its niceness. A lower niceness value " "correspond to a higher priority." msgstr "" "De prioriteit van een proces wordt aangeduid met ‘niceness’. Een lagere waarde " "betekent een hogere prioriteit." #: data/resources/ui/dialogs/process_options_dialog.ui:87 #: data/resources/ui/dialogs/settings_dialog.ui:285 #: src/ui/pages/processes/mod.rs:1888 msgid "Priority" msgstr "Prioriteit" #: data/resources/ui/dialogs/process_options_dialog.ui:91 msgctxt "process priority" msgid "Very High" msgstr "Erg hoog" #: data/resources/ui/dialogs/process_options_dialog.ui:92 msgctxt "process priority" msgid "High" msgstr "Hoog" #: data/resources/ui/dialogs/process_options_dialog.ui:93 msgctxt "process priority" msgid "Normal" msgstr "Normaal" #: data/resources/ui/dialogs/process_options_dialog.ui:94 msgctxt "process priority" msgid "Low" msgstr "Laag" #: data/resources/ui/dialogs/process_options_dialog.ui:95 msgctxt "process priority" msgid "Very Low" msgstr "Erg laag" #: data/resources/ui/dialogs/process_options_dialog.ui:103 msgid "Processor Affinity" msgstr "Processoraffiniteit" #: data/resources/ui/dialogs/process_options_dialog.ui:108 msgid "Toggle All" msgstr "Alles aan/uit" #: data/resources/ui/dialogs/process_options_dialog.ui:111 msgid "Select which processor cores the process is allowed to run on" msgstr "Geef aan op welke processorkernen het proces mag worden uitgevoerd" #: data/resources/ui/dialogs/settings_dialog.ui:7 msgid "General" msgstr "Algemeen" #: data/resources/ui/dialogs/settings_dialog.ui:10 msgid "Units" msgstr "Eenheden" #: data/resources/ui/dialogs/settings_dialog.ui:13 msgid "Data Unit Prefix" msgstr "Voorvoegsel van gegevenseenheden" #: data/resources/ui/dialogs/settings_dialog.ui:17 msgid "Decimal" msgstr "Decimaal" #: data/resources/ui/dialogs/settings_dialog.ui:18 msgid "Binary" msgstr "Binair" #: data/resources/ui/dialogs/settings_dialog.ui:26 msgid "Show Network Speeds in Bits per Second" msgstr "Netwerksnelheiden in bits per seconde tonen" #: data/resources/ui/dialogs/settings_dialog.ui:31 msgid "Temperature Unit" msgstr "Temperatuureenheid" #: data/resources/ui/dialogs/settings_dialog.ui:35 msgid "Celsius" msgstr "Celsius" #: data/resources/ui/dialogs/settings_dialog.ui:36 msgid "Kelvin" msgstr "Kelvin" #: data/resources/ui/dialogs/settings_dialog.ui:37 msgid "Fahrenheit" msgstr "Fahrenheit" #: data/resources/ui/dialogs/settings_dialog.ui:47 msgid "User Interface" msgstr "Vormgeving" #: data/resources/ui/dialogs/settings_dialog.ui:50 msgid "Refresh Speed" msgstr "Ververssnelheid" #: data/resources/ui/dialogs/settings_dialog.ui:51 msgid "Higher refresh speeds can lead to higher processor usage" msgstr "Let op: hogere ververssnelheden kunnen leiden tot een hoger geheugengebruik" #: data/resources/ui/dialogs/settings_dialog.ui:55 msgctxt "UI refresh speed" msgid "Very Slow" msgstr "Erg langzaam" #: data/resources/ui/dialogs/settings_dialog.ui:56 msgctxt "UI refresh speed" msgid "Slow" msgstr "Langzaam" #: data/resources/ui/dialogs/settings_dialog.ui:57 msgctxt "UI refresh speed" msgid "Normal" msgstr "Normaal" #: data/resources/ui/dialogs/settings_dialog.ui:58 msgctxt "UI refresh speed" msgid "Fast" msgstr "Snel" #: data/resources/ui/dialogs/settings_dialog.ui:59 msgctxt "UI refresh speed" msgid "Very Fast" msgstr "Erg snel" #: data/resources/ui/dialogs/settings_dialog.ui:67 msgid "Show Graph Grids" msgstr "Roosterlijnen op grafiek tonen" #: data/resources/ui/dialogs/settings_dialog.ui:72 msgid "Graph Data Points" msgstr "Gegevenspunten" #: data/resources/ui/dialogs/settings_dialog.ui:86 msgid "Show Usage Details in Sidebar" msgstr "Uitgebreide informatie tonen in zijbalk" #: data/resources/ui/dialogs/settings_dialog.ui:87 msgid "If enabled, the usage along with other information will be displayed" msgstr "Schakel in om het gebruik naast de andere informatie te tonen" #: data/resources/ui/dialogs/settings_dialog.ui:92 msgid "Show Device Descriptions in Sidebar" msgstr "Apparaatbeschrijvingen tonen in zijbalk" #: data/resources/ui/dialogs/settings_dialog.ui:93 msgid "" "If enabled, a device identifier like its name or device type will be displayed" msgstr "Schakel in om een apparaatidentificatie te tonen, zoals de naam of het type" #: data/resources/ui/dialogs/settings_dialog.ui:98 msgid "Sidebar Meter Type" msgstr "Soort zijbalkmeter" #: data/resources/ui/dialogs/settings_dialog.ui:102 msgid "Bar" msgstr "Staafdiagram" #: data/resources/ui/dialogs/settings_dialog.ui:103 msgid "Graph" msgstr "Grafiek" #: data/resources/ui/dialogs/settings_dialog.ui:111 msgid "Normalize Processor Usage" msgstr "Processorgebruik normaliseren" #: data/resources/ui/dialogs/settings_dialog.ui:112 msgid "" "If enabled, the total usage of all cores will be divided by the amount of cores" msgstr "Schakel in om het totaalgebruik van alle kernen eerlijk te verdelen" #: data/resources/ui/dialogs/settings_dialog.ui:122 data/resources/ui/window.ui:65 #: data/resources/ui/window.ui:72 src/ui/pages/applications/mod.rs:131 msgid "Apps" msgstr "Toepassingen" #: data/resources/ui/dialogs/settings_dialog.ui:125 #: data/resources/ui/dialogs/settings_dialog.ui:207 msgid "Information Columns" msgstr "Informatiekolommen" #: data/resources/ui/dialogs/settings_dialog.ui:183 #: data/resources/ui/dialogs/settings_dialog.ui:295 #: src/ui/pages/applications/mod.rs:1479 src/ui/pages/processes/mod.rs:2014 msgid "Combined Memory" msgstr "Gedeeld geheugen" #: data/resources/ui/dialogs/settings_dialog.ui:193 data/resources/ui/window.ui:105 #: data/resources/ui/window.ui:112 src/ui/pages/processes/mod.rs:175 msgid "Processes" msgstr "Processen" #: data/resources/ui/dialogs/settings_dialog.ui:196 #: data/resources/ui/pages/cpu.ui:22 data/resources/ui/pages/processes.ui:56 msgid "Options" msgstr "Opties" #: data/resources/ui/dialogs/settings_dialog.ui:199 msgid "Show Niceness Values" msgstr "Niceness-waarden tonen" #: data/resources/ui/dialogs/settings_dialog.ui:200 msgid "Display priorities as niceness to allow for more fine-grained adjustments" msgstr "Toon prioriteiten als niceness om specifiekere aanpassingen te kunnen doen" #: data/resources/ui/dialogs/settings_dialog.ui:310 msgid "Devices" msgstr "Apparaten" #: data/resources/ui/dialogs/settings_dialog.ui:313 msgid "Drives" msgstr "Schijven" #: data/resources/ui/dialogs/settings_dialog.ui:316 msgid "Show Virtual Drives" msgstr "Virtuele schijven tonen" #: data/resources/ui/dialogs/settings_dialog.ui:317 msgid "Virtual drives are for example ZFS volumes or mapped devices" msgstr "Virtuele schijven zijn bijvoorbeeld ZFS-volumes of aangekoppelde apparaten" #: data/resources/ui/dialogs/settings_dialog.ui:327 msgid "Show Virtual Network Interfaces" msgstr "Virtuele netwerkinterfaces tonen" #: data/resources/ui/dialogs/settings_dialog.ui:328 msgid "Virtual network interfaces are for example bridges or VPN tunnels" msgstr "Virtuele netwerkinterfaces zijn bijvoorbeeld bridges of vpn-tunnels" #: data/resources/ui/pages/applications.ui:6 #: data/resources/ui/pages/applications.ui:26 src/ui/pages/applications/mod.rs:1563 msgid "Kill App" msgstr "Toepassing gedwongen afsluiten" #: data/resources/ui/pages/applications.ui:10 #: data/resources/ui/pages/applications.ui:30 src/ui/pages/applications/mod.rs:1562 msgid "Halt App" msgstr "Toepassing onderbreken" #: data/resources/ui/pages/applications.ui:14 #: data/resources/ui/pages/applications.ui:34 src/ui/pages/applications/mod.rs:1564 msgid "Continue App" msgstr "Toepassing hervatten" #: data/resources/ui/pages/applications.ui:22 #: data/resources/ui/pages/applications.ui:98 src/ui/pages/applications/mod.rs:1561 msgid "End App" msgstr "Toepassing beëindigen" #: data/resources/ui/pages/applications.ui:40 #: data/resources/ui/pages/processes.ui:62 msgid "Information" msgstr "Informatie" #: data/resources/ui/pages/applications.ui:57 msgid "Search applications" msgstr "Toepassingen doorzoeken" #: data/resources/ui/pages/applications.ui:87 #: data/resources/ui/pages/applications.ui:89 msgid "Show App Information" msgstr "Toepassingsinformatie tonen" #: data/resources/ui/pages/battery.ui:36 msgid "Battery Health" msgstr "Accugezondheid" #: data/resources/ui/pages/battery.ui:45 msgid "Design Capacity" msgstr "Ontwerpcapaciteit" #: data/resources/ui/pages/battery.ui:54 msgid "Charge Cycles" msgstr "Aantal oplaadcycli" #: data/resources/ui/pages/battery.ui:63 msgid "Technology" msgstr "Technologie" #: data/resources/ui/pages/battery.ui:72 data/resources/ui/pages/gpu.ui:81 #: data/resources/ui/pages/network.ui:58 data/resources/ui/pages/npu.ui:75 msgid "Manufacturer" msgstr "Fabrikant" #: data/resources/ui/pages/battery.ui:81 msgid "Model Name" msgstr "Modelnaam" #: data/resources/ui/pages/battery.ui:90 data/resources/ui/pages/drive.ui:66 msgid "Device" msgstr "Apparaat" #: data/resources/ui/pages/cpu.ui:26 msgid "Show Usages of Logical CPUs" msgstr "Gebruik van logische CPU’s tonen" #: data/resources/ui/pages/cpu.ui:75 data/resources/ui/pages/gpu.ui:66 #: data/resources/ui/pages/npu.ui:60 msgid "Sensors" msgstr "Sensoren" #: data/resources/ui/pages/cpu.ui:90 msgid "Max Frequency" msgstr "Max. frequentie" #: data/resources/ui/pages/cpu.ui:99 msgid "Logical Cores" msgstr "Logische kernen" #: data/resources/ui/pages/cpu.ui:108 msgid "Physical Cores" msgstr "Fysieke kernen" #: data/resources/ui/pages/cpu.ui:117 msgid "Sockets" msgstr "Sockets" #: data/resources/ui/pages/cpu.ui:126 msgid "Uptime" msgstr "Tijd actief" #: data/resources/ui/pages/cpu.ui:135 msgid "Virtualization" msgstr "Virtualisatie" #: data/resources/ui/pages/cpu.ui:144 msgid "Architecture" msgstr "Architectuur" #: data/resources/ui/pages/drive.ui:38 msgid "Total Read" msgstr "Totaal uitgelezen" #: data/resources/ui/pages/drive.ui:47 msgid "Total Written" msgstr "Totaal weggeschreven" #: data/resources/ui/pages/drive.ui:57 data/resources/ui/pages/memory.ui:72 msgid "Type" msgstr "Type" #: data/resources/ui/pages/drive.ui:75 msgid "Capacity" msgstr "Capaciteit" #: data/resources/ui/pages/drive.ui:84 msgid "Writable" msgstr "Beschrijfbaar" #: data/resources/ui/pages/drive.ui:93 msgid "Removable" msgstr "Verwijderbaar" #. Translators: "Link" refers to something like "PCIe 4.0 ×16" #: data/resources/ui/pages/drive.ui:102 data/resources/ui/pages/gpu.ui:113 #: data/resources/ui/pages/network.ui:103 data/resources/ui/pages/npu.ui:107 msgid "Link" msgstr "Link" #: data/resources/ui/pages/gpu.ui:37 msgid "GPU Frequency" msgstr "GPU-frequentie" #: data/resources/ui/pages/gpu.ui:50 msgid "Video Memory Frequency" msgstr "Videogeheugenfrequentie" #: data/resources/ui/pages/gpu.ui:55 data/resources/ui/pages/npu.ui:49 #: src/ui/pages/battery.rs:217 msgid "Power Usage" msgstr "Energieverbruik" #: data/resources/ui/pages/gpu.ui:90 data/resources/ui/pages/npu.ui:84 msgid "PCI Slot" msgstr "PCI-slot" #: data/resources/ui/pages/gpu.ui:99 data/resources/ui/pages/network.ui:67 #: data/resources/ui/pages/npu.ui:93 msgid "Driver Used" msgstr "Stuurprogramma" #: data/resources/ui/pages/gpu.ui:108 data/resources/ui/pages/npu.ui:102 msgid "Max Power Cap" msgstr "Max. energielimiet" #: data/resources/ui/pages/memory.ui:9 msgid "You need to authenticate to see memory properties" msgstr "Voer uw wachtwoord in om de geheugeninformatie te bekijken" #: data/resources/ui/pages/memory.ui:10 msgid "Authenticate" msgstr "Goedkeuren" #: data/resources/ui/pages/memory.ui:45 msgid "Slots Used" msgstr "Aantal gebruikte sloten" #: data/resources/ui/pages/memory.ui:54 msgid "Speed" msgstr "Snelheid" #: data/resources/ui/pages/memory.ui:63 msgid "Form Factor" msgstr "Vormfactor" #: data/resources/ui/pages/memory.ui:81 msgid "Type Detail" msgstr "Type-informatie" #: data/resources/ui/pages/network.ui:35 msgid "Total Received" msgstr "Totaal ontvangen" #: data/resources/ui/pages/network.ui:44 msgid "Total Sent" msgstr "Totaal verstuurd" #: data/resources/ui/pages/network.ui:76 msgid "Interface" msgstr "Interface" #: data/resources/ui/pages/network.ui:85 msgid "Hardware Address" msgstr "Hardwareadres" #: data/resources/ui/pages/network.ui:94 msgid "Network Name" msgstr "Netwerknaam" #: data/resources/ui/pages/network.ui:112 msgid "Link Speed" msgstr "Linksnelheid" #: data/resources/ui/pages/npu.ui:31 msgid "NPU Frequency" msgstr "NPU-frequentie" #: data/resources/ui/pages/npu.ui:44 msgid "Memory Frequency" msgstr "Geheugenfrequentie" #: data/resources/ui/pages/processes.ui:6 data/resources/ui/pages/processes.ui:42 #: src/ui/pages/processes/mod.rs:2184 msgid "Kill Process" msgstr "Proces gedwongen afsluiten" #: data/resources/ui/pages/processes.ui:10 data/resources/ui/pages/processes.ui:46 #: src/ui/pages/processes/mod.rs:2183 msgid "Halt Process" msgstr "Proces onderbreken" #: data/resources/ui/pages/processes.ui:14 data/resources/ui/pages/processes.ui:50 #: src/ui/pages/processes/mod.rs:2185 msgid "Continue Process" msgstr "Proces hervatten" #: data/resources/ui/pages/processes.ui:22 data/resources/ui/pages/processes.ui:74 msgid "Kill Processes" msgstr "Processen gedwongen afsluiten" #: data/resources/ui/pages/processes.ui:26 data/resources/ui/pages/processes.ui:78 msgid "Halt Processes" msgstr "Processen onderbreken" #: data/resources/ui/pages/processes.ui:30 data/resources/ui/pages/processes.ui:82 msgid "Continue Processes" msgstr "Processen hervatten" #: data/resources/ui/pages/processes.ui:38 data/resources/ui/pages/processes.ui:157 #: src/ui/pages/processes/mod.rs:524 src/ui/pages/processes/mod.rs:2182 msgid "End Process" msgstr "Proces beëindigen" #: data/resources/ui/pages/processes.ui:70 src/ui/pages/processes/mod.rs:528 msgid "End Processes" msgstr "Processen beëindigen" #: data/resources/ui/pages/processes.ui:103 msgid "Search processes" msgstr "Processen doorzoeken" #: data/resources/ui/pages/processes.ui:133 data/resources/ui/pages/processes.ui:135 msgid "Show Process Options" msgstr "Procesopties tonen" #: data/resources/ui/pages/processes.ui:146 data/resources/ui/pages/processes.ui:148 msgid "Show Process Information" msgstr "Procesinformatie tonen" #: data/resources/ui/shortcuts.ui:6 msgctxt "shortcut window" msgid "General" msgstr "Algemeen" #: data/resources/ui/shortcuts.ui:9 msgctxt "shortcut window" msgid "Preferences" msgstr "Voorkeuren" #: data/resources/ui/shortcuts.ui:15 msgctxt "shortcut window" msgid "Show Shortcuts" msgstr "Sneltoetsen tonen" #: data/resources/ui/shortcuts.ui:21 msgctxt "shortcut window" msgid "Quit" msgstr "Afsluiten" #: data/resources/ui/shortcuts.ui:29 msgctxt "shortcut window" msgid "Apps/Processes" msgstr "Toepassingen/processen" #: data/resources/ui/shortcuts.ui:32 msgctxt "shortcut window" msgid "Toggle Search Field" msgstr "Zoekbalk tonen/verbergen" #: data/resources/ui/shortcuts.ui:38 msgctxt "shortcut window" msgid "End App/Process" msgstr "Toepassing/proces beëindigen" #: data/resources/ui/shortcuts.ui:44 msgctxt "shortcut window" msgid "Kill App/Process" msgstr "Toepassing/proces gedwongen afsluiten" #: data/resources/ui/shortcuts.ui:50 msgctxt "shortcut window" msgid "Halt App/Process" msgstr "Toepassing/proces onderbreken" #: data/resources/ui/shortcuts.ui:56 msgctxt "shortcut window" msgid "Continue App/Process" msgstr "Toepassing/proces hervatten" #: data/resources/ui/shortcuts.ui:62 msgctxt "shortcut window" msgid "Show Information for App/Process" msgstr "Informatie tonen over toepassing/proces" #: data/resources/ui/shortcuts.ui:68 msgctxt "shortcut window" msgid "Show Process Options" msgstr "Procesopties tonen" #: data/resources/ui/window.ui:6 msgid "Preferences" msgstr "Voorkeuren" #: data/resources/ui/window.ui:10 msgid "Keyboard Shortcuts" msgstr "Sneltoetsen" #: data/resources/ui/window.ui:14 msgid "About Resources" msgstr "Over Systeembronnen" #: data/resources/ui/window.ui:88 data/resources/ui/window.ui:128 msgid "Search" msgstr "Zoeken" #: data/resources/ui/window.ui:90 data/resources/ui/window.ui:130 msgid "Toggle search field" msgstr "Zoekbalk tonen/verbergen" #: src/application.rs:274 msgid "The Nalux Team" msgstr "Het Nalux-team" #: src/application.rs:282 msgid "Report Issues" msgstr "Problemen melden" #. Translator credits. Replace "translator-credits" with your name/username, and optionally an email or URL. #. One name per line, please do not remove previous names. #: src/application.rs:288 msgid "translator-credits" msgstr "" "Heimen Stoffels \n" "Dick Groskamp \n" "Nathan Follens \n" "Meer info over GNOME-NL https://nl.gnome.org" #: src/application.rs:289 msgid "Icon by" msgstr "Pictogram van" #: src/ui/dialogs/app_dialog.rs:155 src/ui/dialogs/process_dialog.rs:133 #: src/ui/dialogs/process_dialog.rs:137 src/ui/dialogs/process_dialog.rs:146 #: src/ui/dialogs/process_dialog.rs:148 src/ui/dialogs/process_dialog.rs:171 #: src/ui/dialogs/process_dialog.rs:178 src/ui/dialogs/process_dialog.rs:185 #: src/ui/dialogs/process_dialog.rs:192 src/ui/pages/applications/mod.rs:948 #: src/ui/pages/applications/mod.rs:1074 src/ui/pages/battery.rs:205 #: src/ui/pages/battery.rs:225 src/ui/pages/battery.rs:231 #: src/ui/pages/battery.rs:234 src/ui/pages/battery.rs:265 #: src/ui/pages/battery.rs:289 src/ui/pages/battery.rs:291 #: src/ui/pages/battery.rs:301 src/ui/pages/cpu.rs:243 src/ui/pages/cpu.rs:258 #: src/ui/pages/cpu.rs:278 src/ui/pages/cpu.rs:284 src/ui/pages/cpu.rs:290 #: src/ui/pages/cpu.rs:296 src/ui/pages/cpu.rs:300 src/ui/pages/cpu.rs:303 #: src/ui/pages/cpu.rs:341 src/ui/pages/cpu.rs:448 src/ui/pages/drive.rs:319 #: src/ui/pages/drive.rs:350 src/ui/pages/drive.rs:352 src/ui/pages/drive.rs:381 #: src/ui/pages/drive.rs:383 src/ui/pages/drive.rs:399 src/ui/pages/drive.rs:400 #: src/ui/pages/drive.rs:407 src/ui/pages/drive.rs:417 src/ui/pages/drive.rs:427 #: src/ui/pages/drive.rs:433 src/ui/pages/gpu.rs:245 src/ui/pages/gpu.rs:252 #: src/ui/pages/gpu.rs:297 src/ui/pages/gpu.rs:322 src/ui/pages/gpu.rs:325 #: src/ui/pages/gpu.rs:336 src/ui/pages/gpu.rs:377 src/ui/pages/gpu.rs:384 #: src/ui/pages/gpu.rs:396 src/ui/pages/gpu.rs:403 src/ui/pages/gpu.rs:407 #: src/ui/pages/gpu.rs:437 src/ui/pages/gpu.rs:443 src/ui/pages/memory.rs:227 #: src/ui/pages/memory.rs:228 src/ui/pages/memory.rs:232 src/ui/pages/memory.rs:233 #: src/ui/pages/memory.rs:237 src/ui/pages/memory.rs:238 src/ui/pages/memory.rs:266 #: src/ui/pages/memory.rs:327 src/ui/pages/network.rs:252 #: src/ui/pages/network.rs:259 src/ui/pages/network.rs:266 #: src/ui/pages/network.rs:272 src/ui/pages/network.rs:275 #: src/ui/pages/network.rs:285 src/ui/pages/network.rs:292 #: src/ui/pages/network.rs:302 src/ui/pages/network.rs:370 #: src/ui/pages/network.rs:373 src/ui/pages/network.rs:375 #: src/ui/pages/network.rs:404 src/ui/pages/network.rs:407 #: src/ui/pages/network.rs:409 src/ui/pages/network.rs:417 #: src/ui/pages/network.rs:424 src/ui/pages/network.rs:434 #: src/ui/pages/processes/mod.rs:1225 src/ui/pages/processes/mod.rs:1292 #: src/ui/pages/processes/mod.rs:1359 src/ui/pages/processes/mod.rs:1426 #: src/ui/pages/processes/mod.rs:1912 src/ui/pages/processes/mod.rs:1914 #: src/utils/battery.rs:152 src/utils/drive.rs:137 src/utils/gpu/mod.rs:279 #: src/utils/gpu/mod.rs:291 src/utils/link/mod.rs:61 src/utils/npu/mod.rs:244 #: src/utils/npu/mod.rs:250 msgid "N/A" msgstr "n/b" #: src/ui/dialogs/process_options_dialog.rs:147 src/ui/pages/cpu.rs:257 #: src/ui/pages/cpu.rs:417 src/ui/pages/cpu.rs:421 msgid "CPU {}" msgstr "CPU {}" #: src/ui/pages/applications/application_entry.rs:190 src/ui/pages/drive.rs:414 #: src/ui/pages/drive.rs:424 src/ui/pages/processes/process_entry.rs:211 msgid "No" msgstr "Nee" #: src/ui/pages/applications/application_entry.rs:191 #: src/ui/pages/processes/process_entry.rs:212 msgid "Yes (Flatpak)" msgstr "Ja (Flatpak)" #: src/ui/pages/applications/application_entry.rs:192 #: src/ui/pages/processes/process_entry.rs:213 msgid "Yes (Snap)" msgstr "Ja (Snap)" #: src/ui/pages/applications/mod.rs:660 msgid "Running Apps: {}" msgstr "Actieve toepassingen: {}" #: src/ui/pages/applications/mod.rs:700 src/ui/pages/processes/mod.rs:863 msgid "Cancel" msgstr "Annuleren" #: src/ui/pages/applications/mod.rs:746 msgid "App" msgstr "Toepassing" #: src/ui/pages/applications/mod.rs:1539 src/ui/pages/processes/mod.rs:2131 msgid "End {}?" msgstr "Wilt u {} beëindigen?" #: src/ui/pages/applications/mod.rs:1540 src/ui/pages/processes/mod.rs:2132 msgid "Halt {}?" msgstr "Wilt u {} onderbreken?" #: src/ui/pages/applications/mod.rs:1541 src/ui/pages/processes/mod.rs:2133 msgid "Kill {}?" msgstr "Wilt u {} gedwongen afsluiten?" #: src/ui/pages/applications/mod.rs:1542 src/ui/pages/processes/mod.rs:2134 msgid "Continue {}?" msgstr "Wilt u {} hervatten?" #: src/ui/pages/applications/mod.rs:1548 src/ui/pages/processes/mod.rs:2169 msgid "Unsaved work might be lost." msgstr "Niet-opgeslagen gegevens kunnen verloren gaan." #: src/ui/pages/applications/mod.rs:1550 msgid "" "Halting an app can come with serious risks such as losing data and security " "implications. Use with caution." msgstr "" "Let op: het onderbreken kan leiden tot gegevensverlies en/of " "beveiligingsproblemen. Gebruik deze functie op eigen risico." #: src/ui/pages/applications/mod.rs:1553 msgid "" "Killing an app can come with serious risks such as losing data and security " "implications. Use with caution." msgstr "" "Let op: het gedwongen afsluiten kan leiden tot gegevensverlies en/of " "beveiligingsproblemen. Gebruik deze functie op eigen risico." #: src/ui/pages/battery.rs:102 src/utils/battery.rs:258 msgid "Battery" msgstr "Accu" #: src/ui/pages/battery.rs:210 msgid "Battery Charge" msgstr "Accuoplaadniveau" #: src/ui/pages/battery.rs:279 src/ui/pages/cpu.rs:438 src/ui/pages/drive.rs:344 #: src/ui/pages/drive.rs:375 src/ui/pages/gpu.rs:429 src/ui/pages/network.rs:362 #: src/ui/pages/network.rs:396 msgid "Highest:" msgstr "Hoogste:" #: src/ui/pages/cpu.rs:242 src/ui/pages/gpu.rs:212 msgid "Total Usage" msgstr "Totaalgebruik" #: src/ui/pages/cpu.rs:271 src/ui/pages/gpu.rs:239 msgid "Temperature" msgstr "Temperatuur" #: src/ui/pages/drive.rs:126 msgid "Drive" msgstr "Schijf" #: src/ui/pages/drive.rs:236 msgid "Drive Activity" msgstr "Schijfactiviteit" #: src/ui/pages/drive.rs:243 msgid "Read Speed" msgstr "Leessnelheid" #: src/ui/pages/drive.rs:247 msgid "Write Speed" msgstr "Schrijfsnelheid" #: src/ui/pages/drive.rs:412 src/ui/pages/drive.rs:422 msgid "Yes" msgstr "Ja" #. Translators: This is an abbreviation for "Read" and "Write". This is displayed in the sidebar so your #. translation should preferably be quite short or an abbreviation #: src/ui/pages/drive.rs:440 msgid "R: {} · W: {}" msgstr "R: {} · W: {}" #: src/ui/pages/gpu.rs:220 msgid "Video Encoder/Decoder Usage" msgstr "Video-encoder/-decodergebruik" #: src/ui/pages/gpu.rs:226 msgid "Video Encoder Usage" msgstr "Video-encodergebruik" #: src/ui/pages/gpu.rs:231 msgid "Video Decoder Usage" msgstr "Videodecodergebruik" #: src/ui/pages/gpu.rs:236 msgid "Video Memory Usage" msgstr "Videogeheugengebruik" #. Translators: This will be displayed in the sidebar, please try to keep your translation as short as (or even #. shorter than) 'Memory' #: src/ui/pages/gpu.rs:415 msgid "Memory: {}" msgstr "Geheugen: {}" #: src/ui/pages/memory.rs:262 msgid "{} of {}" msgstr "{} van {}" #: src/ui/pages/memory.rs:265 msgid "{} MT/s" msgstr "{} MT/s" #. Translators: This will be displayed in the sidebar, so your translation for "Swap" should #. preferably be quite short or an abbreviation #: src/ui/pages/memory.rs:346 msgid "{} / {} · Swap: {} %" msgstr "{} / {} · Wisselgeheugen: {} %" #: src/ui/pages/network.rs:127 src/utils/network.rs:135 msgid "Network Interface" msgstr "Netwerkinterface" #: src/ui/pages/network.rs:241 msgid "Receiving" msgstr "Ontvangen" #: src/ui/pages/network.rs:245 msgid "Sending" msgstr "Verstuurd" #. Translators: This is an abbreviation for "Receive" and "Send". This is displayed in the sidebar so #. your translation should preferably be quite short or an abbreviation #: src/ui/pages/network.rs:445 msgid "R: {} · S: {}" msgstr "O: {} · V: {}" #: src/ui/pages/processes/mod.rs:814 msgid "Running Processes: {}" msgstr "Actieve processen: {}" #: src/ui/pages/processes/mod.rs:912 msgid "Process" msgstr "Proces" #: src/ui/pages/processes/mod.rs:2141 msgid "End process?" msgid_plural "End {} processes?" msgstr[0] "Proces beëindigen?" msgstr[1] "{} processen beëindigen?" #: src/ui/pages/processes/mod.rs:2147 msgid "Halt process?" msgid_plural "Halt {} processes?" msgstr[0] "Proces onderbreken?" msgstr[1] "{} processen onderbreken?" #: src/ui/pages/processes/mod.rs:2153 src/ui/pages/processes/mod.rs:2159 msgid "Kill process?" msgid_plural "Kill {} processes?" msgstr[0] "Proces gedwongen afsluiten?" msgstr[1] "{} processen gedwongen afsluiten?" #: src/ui/pages/processes/mod.rs:2171 msgid "" "Halting a process can come with serious risks such as losing data and security " "implications. Use with caution." msgstr "" "Let op: het onderbreken kan leiden tot gegevensverlies en/of " "beveiligingsproblemen. Gebruik deze functie op eigen risico." #: src/ui/pages/processes/mod.rs:2174 msgid "" "Killing a process can come with serious risks such as losing data and security " "implications. Use with caution." msgstr "" "Let op: het gedwongen afsluiten kan leiden tot gegevensverlies en/of " "beveiligingsproblemen. Gebruik deze functie op eigen risico." #: src/ui/window.rs:466 msgid "GPU {}" msgstr "GPU {}" #: src/ui/window.rs:496 msgid "NPU {}" msgstr "NPU {}" #: src/ui/window.rs:498 msgid "NPU" msgstr "NPU" #: src/ui/window.rs:1174 msgid "Successfully adjusted {}" msgstr "{} is onderbroken" #: src/ui/window.rs:1175 msgid "There was a problem adjusting {}" msgstr "{} kan niet worden onderbroken" #: src/ui/window.rs:1257 msgid "Successfully ended {}" msgstr "{} is afgesloten" #: src/ui/window.rs:1258 msgid "Successfully halted {}" msgstr "{} is onderbroken" #: src/ui/window.rs:1259 msgid "Successfully killed {}" msgstr "{} is gedwongen afgesloten" #: src/ui/window.rs:1260 msgid "Successfully continued {}" msgstr "{} is hervat" #: src/ui/window.rs:1267 msgid "Successfully ended the process" msgid_plural "Successfully ended {} processes" msgstr[0] "Het proces is afgesloten" msgstr[1] "{} processen zijn afgesloten" #: src/ui/window.rs:1273 msgid "Successfully halted the process" msgid_plural "Successfully halted {} processes" msgstr[0] "Het proces is onderbroken" msgstr[1] "{} processen zijn onderbroken" #: src/ui/window.rs:1279 msgid "Successfully killed the process" msgid_plural "Successfully killed {} processes" msgstr[0] "Het proces is gedwongen afgesloten" msgstr[1] "{} processen zijn gedwongen afgesloten" #: src/ui/window.rs:1285 msgid "Successfully continued the process" msgid_plural "Successfully continued {} processes" msgstr[0] "Het proces is hervat" msgstr[1] "{} processen zijn hervat" #: src/ui/window.rs:1296 msgid "There was a problem ending a process" msgid_plural "There were problems ending {} processes" msgstr[0] "Het proces kan niet worden beëindigd" msgstr[1] "De {} processen kunnen niet worden beëindigd" #: src/ui/window.rs:1302 msgid "There was a problem halting a process" msgid_plural "There were problems halting {} processes" msgstr[0] "Het proces kan niet worden beëindigd" msgstr[1] "De {} processen kunnen niet worden onderbroken" #: src/ui/window.rs:1308 msgid "There was a problem killing a process" msgid_plural "There were problems killing {} processes" msgstr[0] "Het proces kan niet gedwongen worden afgesloten" msgstr[1] "De {} processen kunnen niet gedwongen worden afgesloten" #: src/ui/window.rs:1314 msgid "There was a problem continuing a process" msgid_plural "There were problems continuing {} processes" msgstr[0] "Het proces kan niet worden hervat" msgstr[1] "De {} processen kunnen niet worden hervat" #: src/ui/window.rs:1324 msgid "There was a problem ending {}" msgstr "{} kan niet worden beëindigd" #: src/ui/window.rs:1325 msgid "There was a problem halting {}" msgstr "{} kan niet worden onderbroken" #: src/ui/window.rs:1326 msgid "There was a problem killing {}" msgstr "{} kan niet gedwongen worden afgesloten" #: src/ui/window.rs:1327 msgid "There was a problem continuing {}" msgstr "{} kan niet worden hervat" #: src/utils/app.rs:222 msgid "System Processes" msgstr "Systeemprocessen" #: src/utils/battery.rs:93 msgid "Charging" msgstr "Aan het opladen" #: src/utils/battery.rs:94 msgid "Discharging" msgstr "Aan het ontladen" #: src/utils/battery.rs:95 msgid "Empty" msgstr "Leeg" #: src/utils/battery.rs:96 msgid "Full" msgstr "Vol" #: src/utils/battery.rs:97 msgid "Unknown" msgstr "Onbekend" #: src/utils/battery.rs:143 msgid "Nickel-Metal Hydride" msgstr "Nikkel-metaalhydride" #: src/utils/battery.rs:144 msgid "Nickel-Cadmium" msgstr "Nikkel-cadmium" #: src/utils/battery.rs:145 msgid "Nickel-Zinc" msgstr "Nikkel-zink" #: src/utils/battery.rs:146 msgid "Lead-Acid" msgstr "Loodzuur" #: src/utils/battery.rs:147 msgid "Lithium-Ion" msgstr "Lithium-ion" #: src/utils/battery.rs:148 msgid "Lithium Iron Phosphate" msgstr "Lithium-ijzerfosfaat" #: src/utils/battery.rs:149 msgid "Lithium Polymer" msgstr "Lithium-polymeer" #: src/utils/battery.rs:151 msgid "Rechargeable Alkaline Managanese" msgstr "Oplaadbare alkaline" #: src/utils/battery.rs:256 msgid "{} Battery" msgstr "{} accu" #: src/utils/units.rs:91 msgid "{} K" msgstr "{} K" #: src/utils/units.rs:93 msgid "{} °C" msgstr "{} °C" #: src/utils/units.rs:95 msgid "{} °F" msgstr "{} °F" #: src/utils/units.rs:113 src/utils/units.rs:127 src/utils/units.rs:147 #: src/utils/units.rs:161 msgid "{} B" msgstr "{} B" #: src/utils/units.rs:114 src/utils/units.rs:128 msgid "{} kB" msgstr "{} kB" #: src/utils/units.rs:115 src/utils/units.rs:129 msgid "{} MB" msgstr "{} MB" #: src/utils/units.rs:116 src/utils/units.rs:130 msgid "{} GB" msgstr "{} GB" #: src/utils/units.rs:117 src/utils/units.rs:131 msgid "{} TB" msgstr "{} TB" #: src/utils/units.rs:118 src/utils/units.rs:132 msgid "{} PB" msgstr "{} PB" #: src/utils/units.rs:119 src/utils/units.rs:133 msgid "{} EB" msgstr "{} EB" #: src/utils/units.rs:120 src/utils/units.rs:134 msgid "{} ZB" msgstr "{} ZB" #: src/utils/units.rs:121 src/utils/units.rs:135 msgid "{} YB" msgstr "{} YB" #: src/utils/units.rs:122 src/utils/units.rs:136 msgid "{} RB" msgstr "{} RB" #: src/utils/units.rs:123 src/utils/units.rs:137 msgid "{} QB" msgstr "{} QB" #: src/utils/units.rs:148 src/utils/units.rs:162 msgid "{} KiB" msgstr "{} KiB" #: src/utils/units.rs:149 src/utils/units.rs:163 msgid "{} MiB" msgstr "{} MiB" #: src/utils/units.rs:150 src/utils/units.rs:164 msgid "{} GiB" msgstr "{} GiB" #: src/utils/units.rs:151 src/utils/units.rs:165 msgid "{} TiB" msgstr "{} TiB" #: src/utils/units.rs:152 src/utils/units.rs:166 msgid "{} PiB" msgstr "{} PiB" #: src/utils/units.rs:153 src/utils/units.rs:167 msgid "{} EiB" msgstr "{} EiB" #: src/utils/units.rs:154 src/utils/units.rs:168 msgid "{} ZiB" msgstr "{} ZiB" #: src/utils/units.rs:155 src/utils/units.rs:169 msgid "{} YiB" msgstr "{} YiB" #: src/utils/units.rs:156 src/utils/units.rs:170 msgid "{} RiB" msgstr "{} RiB" #: src/utils/units.rs:157 src/utils/units.rs:171 msgid "{} QiB" msgstr "{} QiB" #: src/utils/units.rs:198 src/utils/units.rs:215 msgid "{} B/s" msgstr "{} B/s" #: src/utils/units.rs:199 msgid "{} kB/s" msgstr "{} kB/s" #: src/utils/units.rs:200 msgid "{} MB/s" msgstr "{} MB/s" #: src/utils/units.rs:201 msgid "{} GB/s" msgstr "{} GB/s" #: src/utils/units.rs:202 msgid "{} TB/s" msgstr "{} TB/s" #: src/utils/units.rs:203 msgid "{} PB/s" msgstr "{} PB/s" #: src/utils/units.rs:204 msgid "{} EB/s" msgstr "{} EB/s" #: src/utils/units.rs:205 msgid "{} ZB/s" msgstr "{} ZB/s" #: src/utils/units.rs:206 msgid "{} YB/s" msgstr "{} YB/s" #: src/utils/units.rs:207 msgid "{} RB/s" msgstr "{} RB/s" #: src/utils/units.rs:208 msgid "{} QB/s" msgstr "{} QB/s" #: src/utils/units.rs:216 msgid "{} KiB/s" msgstr "{} KiB/s" #: src/utils/units.rs:217 msgid "{} MiB/s" msgstr "{} MiB/s" #: src/utils/units.rs:218 msgid "{} GiB/s" msgstr "{} GiB/s" #: src/utils/units.rs:219 msgid "{} TiB/s" msgstr "{} TiB/s" #: src/utils/units.rs:220 msgid "{} PiB/s" msgstr "{} PiB/s" #: src/utils/units.rs:221 msgid "{} EiB/s" msgstr "{} EiB/s" #: src/utils/units.rs:222 msgid "{} ZiB/s" msgstr "{} ZiB/s" #: src/utils/units.rs:223 msgid "{} YiB/s" msgstr "{} YiB/s" #: src/utils/units.rs:224 msgid "{} RiB/s" msgstr "{} RiB/s" #: src/utils/units.rs:225 msgid "{} QiB/s" msgstr "{} QiB/s" #: src/utils/units.rs:239 src/utils/units.rs:256 msgid "{} b/s" msgstr "{} b/s" #: src/utils/units.rs:240 msgid "{} kb/s" msgstr "{} kb/s" #: src/utils/units.rs:241 msgid "{} Mb/s" msgstr "{} Mb/s" #: src/utils/units.rs:242 msgid "{} Gb/s" msgstr "{} Gb/s" #: src/utils/units.rs:243 msgid "{} Tb/s" msgstr "{} Tb/s" #: src/utils/units.rs:244 msgid "{} Pb/s" msgstr "{} Pb/s" #: src/utils/units.rs:245 msgid "{} Eb/s" msgstr "{} Eb/s" #: src/utils/units.rs:246 msgid "{} Zb/s" msgstr "{} Zb/s" #: src/utils/units.rs:247 msgid "{} Yb/s" msgstr "{} Yb/s" #: src/utils/units.rs:248 msgid "{} Rb/s" msgstr "{} Rb/s" #: src/utils/units.rs:249 msgid "{} Qb/s" msgstr "{} Qb/s" #: src/utils/units.rs:257 msgid "{} Kib/s" msgstr "{} Kib/s" #: src/utils/units.rs:258 msgid "{} Mib/s" msgstr "{} Mib/s" #: src/utils/units.rs:259 msgid "{} Gib/s" msgstr "{} Gib/s" #: src/utils/units.rs:260 msgid "{} Tib/s" msgstr "{} Tib/s" #: src/utils/units.rs:261 msgid "{} Pib/s" msgstr "{} Pib/s" #: src/utils/units.rs:262 msgid "{} Eib/s" msgstr "{} Eib/s" #: src/utils/units.rs:263 msgid "{} Zib/s" msgstr "{} Zib/s" #: src/utils/units.rs:264 msgid "{} Yib/s" msgstr "{} Yib/s" #: src/utils/units.rs:265 msgid "{} Rib/s" msgstr "{} Rib/s" #: src/utils/units.rs:266 msgid "{} Qib/s" msgstr "{} Qib/s" #: src/utils/units.rs:273 msgid "{} Hz" msgstr "{} Hz" #: src/utils/units.rs:274 msgid "{} kHz" msgstr "{} kHz" #: src/utils/units.rs:275 msgid "{} MHz" msgstr "{} MHz" #: src/utils/units.rs:276 msgid "{} GHz" msgstr "{} GHz" #: src/utils/units.rs:277 msgid "{} THz" msgstr "{} THz" #: src/utils/units.rs:278 msgid "{} PHz" msgstr "{} PHz" #: src/utils/units.rs:279 msgid "{} EHz" msgstr "{} EHz" #: src/utils/units.rs:280 msgid "{} ZHz" msgstr "{} ZHz" #: src/utils/units.rs:281 msgid "{} YHz" msgstr "{} YHz" #: src/utils/units.rs:282 msgid "{} RHz" msgstr "{} RHz" #: src/utils/units.rs:283 msgid "{} QHz" msgstr "{} QHz" #: src/utils/units.rs:290 msgid "{} W" msgstr "{} W" #: src/utils/units.rs:291 msgid "{} kW" msgstr "{} kW" #: src/utils/units.rs:292 msgid "{} MW" msgstr "{} MW" #: src/utils/units.rs:293 msgid "{} GW" msgstr "{} GW" #: src/utils/units.rs:294 msgid "{} TW" msgstr "{} TW" #: src/utils/units.rs:295 msgid "{} PW" msgstr "{} PW" #: src/utils/units.rs:296 msgid "{} EW" msgstr "{} EW" #: src/utils/units.rs:297 msgid "{} ZW" msgstr "{} ZW" #: src/utils/units.rs:298 msgid "{} YW" msgstr "{} YW" #: src/utils/units.rs:299 msgid "{} RW" msgstr "{} RW" #: src/utils/units.rs:300 msgid "{} QW" msgstr "{} QW" #: src/utils/units.rs:309 src/utils/units.rs:323 msgid "{} Wh" msgstr "{} Wh" #: src/utils/units.rs:310 src/utils/units.rs:324 msgid "{} kWh" msgstr "{} kWh" #: src/utils/units.rs:311 src/utils/units.rs:325 msgid "{} MWh" msgstr "{} MWh" #: src/utils/units.rs:312 src/utils/units.rs:326 msgid "{} GWh" msgstr "{} GWh" #: src/utils/units.rs:313 src/utils/units.rs:327 msgid "{} TWh" msgstr "{} TWh" #: src/utils/units.rs:314 src/utils/units.rs:328 msgid "{} PWh" msgstr "{} PWh" #: src/utils/units.rs:315 src/utils/units.rs:329 msgid "{} EWh" msgstr "{} EWh" #: src/utils/units.rs:316 src/utils/units.rs:330 msgid "{} ZWh" msgstr "{} ZWh" #: src/utils/units.rs:317 src/utils/units.rs:331 msgid "{} YWh" msgstr "{} YWh" #: src/utils/units.rs:318 src/utils/units.rs:332 msgid "{} RWh" msgstr "{} RWh" #: src/utils/units.rs:319 src/utils/units.rs:333 msgid "{} QWh" msgstr "{} QWh" #: src/utils/drive.rs:129 src/utils/drive.rs:208 msgid "CD/DVD/Blu-ray Drive" msgstr "Cd-/dvd-/blu-raystation" #: src/utils/drive.rs:130 msgid "eMMC Storage" msgstr "eMMC-opslag" #: src/utils/drive.rs:131 msgid "Flash Storage" msgstr "Flashopslag" #: src/utils/drive.rs:132 src/utils/drive.rs:209 msgid "Floppy Drive" msgstr "Diskettestation" #: src/utils/drive.rs:133 msgid "Hard Disk Drive" msgstr "Harde schijf" #: src/utils/drive.rs:134 msgid "Loop Device" msgstr "Loopapparaat" #: src/utils/drive.rs:135 msgid "Mapped Device" msgstr "Toegewezen apparaat" #: src/utils/drive.rs:136 msgid "NVMe Drive" msgstr "NVMe-schijf" #: src/utils/drive.rs:138 msgid "Software Raid" msgstr "Software-raid" #: src/utils/drive.rs:139 msgid "RAM Disk" msgstr "Ramschijf" #: src/utils/drive.rs:140 msgid "Solid State Drive" msgstr "Solid State Drive" #: src/utils/drive.rs:141 msgid "ZFS Volume" msgstr "ZFS-volume" #: src/utils/drive.rs:142 msgid "Compressed RAM Disk (zram)" msgstr "Gecomprimeerde ramschijf (zram)" #: src/utils/drive.rs:210 msgid "{} Loop Device" msgstr "{} loopapparaat" #: src/utils/drive.rs:211 msgid "{} Mapped Device" msgstr "{} toegewezen apparaat" #: src/utils/drive.rs:212 msgid "{} RAID" msgstr "{} raid" #: src/utils/drive.rs:213 msgid "{} RAM Disk" msgstr "{} ramschijf" #: src/utils/drive.rs:214 msgid "{} zram Device" msgstr "{} zram-apparaat" #: src/utils/drive.rs:215 msgid "{} ZFS Volume" msgstr "{} zfs-volume" #: src/utils/drive.rs:216 msgid "{} Drive" msgstr "{} schijf" #: src/utils/network.rs:123 msgid "Bluetooth Tether" msgstr "Bluetoothtethering" #: src/utils/network.rs:124 msgid "Network Bridge" msgstr "Netwerkbridge" #: src/utils/network.rs:125 msgid "Ethernet Connection" msgstr "Ethernetverbinding" #: src/utils/network.rs:126 msgid "Docker Bridge" msgstr "Dockerbridge" #: src/utils/network.rs:127 msgid "InfiniBand Connection" msgstr "InfiniBand-verbinding" #: src/utils/network.rs:128 msgid "Serial Line IP Connection" msgstr "Seriële ip-verbinding" #: src/utils/network.rs:129 msgid "Virtual Ethernet Device" msgstr "Virtueel ethernetapparaat" #: src/utils/network.rs:130 msgid "VM Network Bridge" msgstr "VM-netwerkbridge" #: src/utils/network.rs:131 msgid "VPN Tunnel" msgstr "VPN-tunnel" #: src/utils/network.rs:132 msgid "VPN Tunnel (WireGuard)" msgstr "VPN-tunnel (WireGuard)" #: src/utils/network.rs:133 msgid "Wi-Fi Connection" msgstr "Wifiverbinding" #: src/utils/network.rs:134 msgid "WWAN Connection" msgstr "WWAN-verbinding" #~ msgid "Memory Usage" #~ msgstr "Geheugengebruik" #~ msgid "Applications" #~ msgstr "Toepassingen" #~ msgid "Application" #~ msgstr "Toepassing" #~ msgid "End application" #~ msgstr "Toepassing beëindigen" #~ msgid "Kill application" #~ msgstr "Toepassing gedwongen afsluiten" #~ msgid "Continue application" #~ msgstr "Toepassing hervatten" #~ msgid "VRAM: {}" #~ msgstr "Vram: {}" #~ msgid "root" #~ msgstr "root" #~ msgid "Continue process" #~ msgstr "Proces hervatten" #~ msgctxt "shortcut window" #~ msgid "End Application/Process" #~ msgstr "Toepassing/Proces beëindigen" #~ msgctxt "shortcut window" #~ msgid "Kill Application/Process" #~ msgstr "Toepassing/Proces gedwongen afsluiten" #~ msgctxt "shortcut window" #~ msgid "Halt Application/Process" #~ msgstr "Toepassing/Proces onderbreken" #~ msgctxt "shortcut window" #~ msgid "Continue Application/Process" #~ msgstr "Toepassing/Proces hervatten" #~ msgid "Show Search Fields on Launch" #~ msgstr "Zoekvelden tonen na opstarten" #~ msgid "Monitor your system resources and processes" #~ msgstr "Monitor uw systeembronnen en -processen" #~ msgid "Window width" #~ msgstr "Vensterbreedte" #~ msgid "Window height" #~ msgstr "Vensterhoogte" #~ msgid "Window maximized state" #~ msgstr "Venstermaximalisatie" #~ msgid "Temperature unit" #~ msgstr "Temperatuureenheid" #~ msgid "Unit Prefix Base" #~ msgstr "Voorvoegsel van eenheden" #~ msgid "Show search field for Processes and Applications on launch" #~ msgstr "Zoekveld voor processen en toepassingen tonen na opstarten" #~ msgid "Show virtual block devices such as LVM containers" #~ msgstr "Virtuele blokapparaten tonen, zoals lvm-containers" #~ msgid "Show virtual network interfaces such as Docker interfaces" #~ msgstr "Virtuele netwerkinterfaces tonen, zoals Docker-interfaces" #~ msgid "Show usage details in the sidebar" #~ msgstr "Uitgebreide informatie tonen in zijbalk" #~ msgid "Display network speeds in bits per second" #~ msgstr "Netwerksnelheiden in bits pers seconde tonen" #~ msgid "GPU Usage" #~ msgstr "Gpu-gebruik" #~ msgid "Current Power Cap" #~ msgstr "Huidig energielimiet" resources-1.9.1/po/pl.po000066400000000000000000001542531510634446000151420ustar00rootroot00000000000000# # awumii , 2023. # msgid "" msgstr "" "Project-Id-Version: resources\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-03-05 18:24+0100\n" "PO-Revision-Date: 2025-03-17 19:02+0100\n" "Last-Translator: awumii \n" "Language-Team: Polish - Poland \n" "Language: pl_PL\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || " "n%100>14) ? 1 : 2);\n" "X-Generator: Poedit 3.5\n" #: data/net.nokyan.Resources.desktop.in.in:3 #: data/net.nokyan.Resources.metainfo.xml.in.in:4 src/application.rs:265 #: data/resources/ui/window.ui:22 msgid "Resources" msgstr "Zasoby" #. Translators: The summary should be 35 characters or less according to Flathub appstream guidelines #: data/net.nokyan.Resources.desktop.in.in:4 #: data/net.nokyan.Resources.metainfo.xml.in.in:5 msgid "Keep an eye on system resources" msgstr "Monitoruj zasoby systemu" #: data/net.nokyan.Resources.desktop.in.in:10 msgid "System;Resources;Monitor;Processes;Usage;Task;Manager;CPU;RAM;Memory;GPU;" msgstr "System;Zasoby;Monitor;Procesy;Wykorzystanie;Zadań;Menedżer;CPU;RAM;Pamięć;GPU;" #: data/net.nokyan.Resources.metainfo.xml.in.in:17 msgid "" "Resources allows you to check the utilization of your system resources and control " "your running processes and apps. It’s designed to be user-friendly and feel right at " "home on a modern desktop by using GNOME’s libadwaita." msgstr "" "Zasoby umożliwiają monitorowanie wykorzystania zasobów systemowych oraz zarządzanie " "uruchomionymi procesami i aplikacjami. Program został zaprojektowany z myślą o " "wygodzie użytkownika i płynnie integruje się ze współczesnym środowiskiem graficznym " "dzięki wykorzystaniu biblioteki libadwaita od GNOME." #: data/net.nokyan.Resources.metainfo.xml.in.in:20 msgid "Resources supports monitoring the following components:" msgstr "Zasoby umożliwiają monitorowanie następujących komponentów:" #: data/net.nokyan.Resources.metainfo.xml.in.in:24 msgid "CPU" msgstr "CPU" #: data/net.nokyan.Resources.metainfo.xml.in.in:25 src/ui/pages/applications/mod.rs:802 #: src/ui/pages/memory.rs:106 src/ui/pages/memory.rs:191 #: src/ui/pages/processes/mod.rs:1078 data/resources/ui/window.ui:176 #: data/resources/ui/window.ui:183 data/resources/ui/dialogs/app_dialog.ui:82 #: data/resources/ui/dialogs/process_dialog.ui:64 #: data/resources/ui/dialogs/settings_dialog.ui:128 #: data/resources/ui/dialogs/settings_dialog.ui:220 msgid "Memory" msgstr "Pamięć" #: data/net.nokyan.Resources.metainfo.xml.in.in:26 #: src/ui/pages/applications/mod.rs:1175 src/ui/pages/gpu.rs:118 #: src/ui/pages/processes/mod.rs:1462 src/ui/window.rs:454 #: data/resources/ui/dialogs/app_dialog.ui:140 #: data/resources/ui/dialogs/process_dialog.ui:118 #: data/resources/ui/dialogs/settings_dialog.ui:158 #: data/resources/ui/dialogs/settings_dialog.ui:250 msgid "GPU" msgstr "GPU" #: data/net.nokyan.Resources.metainfo.xml.in.in:27 #: data/resources/ui/dialogs/settings_dialog.ui:319 msgid "Network Interfaces" msgstr "Interfejsy sieciowe" #: data/net.nokyan.Resources.metainfo.xml.in.in:28 msgid "Storage Devices" msgstr "Urządzenia do przechowywania danych" #: data/net.nokyan.Resources.metainfo.xml.in.in:29 msgid "Batteries" msgstr "Baterie" #: data/net.nokyan.Resources.metainfo.xml.in.in:51 msgid "Apps page in light theme" msgstr "Menu aplikacji w jasnym motywie" #: data/net.nokyan.Resources.metainfo.xml.in.in:55 msgid "Processes page in dark theme" msgstr "Menu procesów w ciemnym motywie" #: data/net.nokyan.Resources.metainfo.xml.in.in:59 msgid "Processor page in light theme" msgstr "Menu procesora w jasnym motywie" #: data/net.nokyan.Resources.metainfo.xml.in.in:63 msgid "Memory page in dark theme" msgstr "Menu pamięci w ciemnym motywie" #: data/net.nokyan.Resources.metainfo.xml.in.in:67 msgid "GPU page in light theme" msgstr "Menu GPU w jasnym motywie" #: data/net.nokyan.Resources.metainfo.xml.in.in:71 msgid "Drive page in dark theme" msgstr "Menu dysku w ciemnym motywie" #: data/net.nokyan.Resources.metainfo.xml.in.in:75 msgid "Network Interface page in light theme" msgstr "Menu interfejsu sieciowego w jasnym motywie" #: data/net.nokyan.Resources.metainfo.xml.in.in:79 msgid "Battery page in dark theme" msgstr "Menu baterii w ciemnym motywie" #: src/application.rs:267 msgid "The Nalux Team" msgstr "Zespół Nalux" #: src/application.rs:275 msgid "Report Issues" msgstr "Zgłoś problemy" #. Translator credits. Replace "translator-credits" with your name/username, and optionally an email or URL. #. One name per line, please do not remove previous names. #: src/application.rs:281 msgid "translator-credits" msgstr "awumii https://github.com/awumii" #: src/application.rs:282 msgid "Icon by" msgstr "Ikona stworzona przez" #: src/ui/dialogs/app_dialog.rs:153 src/ui/dialogs/process_dialog.rs:131 #: src/ui/dialogs/process_dialog.rs:135 src/ui/dialogs/process_dialog.rs:144 #: src/ui/dialogs/process_dialog.rs:146 src/ui/dialogs/process_dialog.rs:169 #: src/ui/dialogs/process_dialog.rs:176 src/ui/dialogs/process_dialog.rs:183 #: src/ui/dialogs/process_dialog.rs:190 src/ui/pages/applications/mod.rs:945 #: src/ui/pages/applications/mod.rs:1069 src/ui/pages/battery.rs:204 #: src/ui/pages/battery.rs:224 src/ui/pages/battery.rs:230 src/ui/pages/battery.rs:233 #: src/ui/pages/battery.rs:264 src/ui/pages/battery.rs:288 src/ui/pages/battery.rs:290 #: src/ui/pages/battery.rs:300 src/ui/pages/cpu.rs:237 src/ui/pages/cpu.rs:252 #: src/ui/pages/cpu.rs:271 src/ui/pages/cpu.rs:277 src/ui/pages/cpu.rs:283 #: src/ui/pages/cpu.rs:289 src/ui/pages/cpu.rs:293 src/ui/pages/cpu.rs:296 #: src/ui/pages/cpu.rs:420 src/ui/pages/drive.rs:315 src/ui/pages/drive.rs:346 #: src/ui/pages/drive.rs:348 src/ui/pages/drive.rs:377 src/ui/pages/drive.rs:379 #: src/ui/pages/drive.rs:395 src/ui/pages/drive.rs:396 src/ui/pages/drive.rs:403 #: src/ui/pages/drive.rs:413 src/ui/pages/drive.rs:423 src/ui/pages/drive.rs:429 #: src/ui/pages/gpu.rs:243 src/ui/pages/gpu.rs:250 src/ui/pages/gpu.rs:295 #: src/ui/pages/gpu.rs:320 src/ui/pages/gpu.rs:323 src/ui/pages/gpu.rs:334 #: src/ui/pages/gpu.rs:354 src/ui/pages/gpu.rs:366 src/ui/pages/gpu.rs:377 #: src/ui/pages/gpu.rs:389 src/ui/pages/gpu.rs:396 src/ui/pages/gpu.rs:400 #: src/ui/pages/gpu.rs:430 src/ui/pages/gpu.rs:436 src/ui/pages/memory.rs:226 #: src/ui/pages/memory.rs:227 src/ui/pages/memory.rs:231 src/ui/pages/memory.rs:232 #: src/ui/pages/memory.rs:236 src/ui/pages/memory.rs:237 src/ui/pages/memory.rs:265 #: src/ui/pages/memory.rs:326 src/ui/pages/network.rs:240 src/ui/pages/network.rs:247 #: src/ui/pages/network.rs:254 src/ui/pages/network.rs:260 src/ui/pages/network.rs:263 #: src/ui/pages/network.rs:270 src/ui/pages/network.rs:335 src/ui/pages/network.rs:338 #: src/ui/pages/network.rs:340 src/ui/pages/network.rs:369 src/ui/pages/network.rs:372 #: src/ui/pages/network.rs:374 src/ui/pages/npu.rs:217 src/ui/pages/npu.rs:253 #: src/ui/pages/npu.rs:308 src/ui/pages/npu.rs:317 src/ui/pages/npu.rs:329 #: src/ui/pages/npu.rs:336 src/ui/pages/npu.rs:340 src/ui/pages/npu.rs:361 #: src/ui/pages/npu.rs:367 src/ui/pages/processes/mod.rs:1220 #: src/ui/pages/processes/mod.rs:1286 src/ui/pages/processes/mod.rs:1352 #: src/ui/pages/processes/mod.rs:1418 src/ui/pages/processes/mod.rs:1900 #: src/ui/pages/processes/mod.rs:1902 src/utils/battery.rs:149 src/utils/drive.rs:136 #: src/utils/gpu/mod.rs:284 src/utils/gpu/mod.rs:296 src/utils/link.rs:314 #: src/utils/npu/mod.rs:260 src/utils/npu/mod.rs:266 msgid "N/A" msgstr "N/A" #: src/ui/dialogs/process_options_dialog.rs:145 src/ui/pages/cpu.rs:251 #: src/ui/pages/cpu.rs:389 src/ui/pages/cpu.rs:393 msgid "CPU {}" msgstr "CPU {}" #: src/ui/pages/applications/application_entry.rs:190 src/ui/pages/drive.rs:410 #: src/ui/pages/drive.rs:420 src/ui/pages/processes/process_entry.rs:211 msgid "No" msgstr "Nie" #: src/ui/pages/applications/application_entry.rs:191 #: src/ui/pages/processes/process_entry.rs:212 msgid "Yes (Flatpak)" msgstr "Tak (Flatpak)" #: src/ui/pages/applications/application_entry.rs:192 #: src/ui/pages/processes/process_entry.rs:213 msgid "Yes (Snap)" msgstr "Tak (Snap)" #: src/ui/pages/applications/mod.rs:131 data/resources/ui/window.ui:65 #: data/resources/ui/window.ui:72 data/resources/ui/dialogs/settings_dialog.ui:122 msgid "Apps" msgstr "Aplikacje" #. -1 because we don't want to count System Processes #: src/ui/pages/applications/mod.rs:659 msgid "Running Apps: {}" msgstr "Uruchomione programy: {}" #: src/ui/pages/applications/mod.rs:699 src/ui/pages/processes/mod.rs:861 msgid "Cancel" msgstr "Anuluj" #: src/ui/pages/applications/mod.rs:745 msgid "App" msgstr "Aplikacja" #: src/ui/pages/applications/mod.rs:861 src/ui/pages/cpu.rs:123 #: src/ui/pages/processes/mod.rs:1136 src/ui/window.rs:289 #: data/resources/ui/window.ui:145 data/resources/ui/window.ui:152 #: data/resources/ui/dialogs/app_dialog.ui:73 #: data/resources/ui/dialogs/process_dialog.ui:55 #: data/resources/ui/dialogs/settings_dialog.ui:133 #: data/resources/ui/dialogs/settings_dialog.ui:225 msgid "Processor" msgstr "Procesor" #: src/ui/pages/applications/mod.rs:924 src/ui/pages/processes/mod.rs:1199 #: data/resources/ui/dialogs/app_dialog.ui:100 #: data/resources/ui/dialogs/process_dialog.ui:78 #: data/resources/ui/dialogs/settings_dialog.ui:138 #: data/resources/ui/dialogs/settings_dialog.ui:230 msgid "Drive Read" msgstr "Odczyt dysku" #: src/ui/pages/applications/mod.rs:988 src/ui/pages/processes/mod.rs:1265 #: data/resources/ui/dialogs/app_dialog.ui:109 #: data/resources/ui/dialogs/process_dialog.ui:87 #: data/resources/ui/dialogs/settings_dialog.ui:143 #: data/resources/ui/dialogs/settings_dialog.ui:235 msgid "Drive Read Total" msgstr "Łączny odczyt dysku" #: src/ui/pages/applications/mod.rs:1048 src/ui/pages/processes/mod.rs:1331 #: data/resources/ui/dialogs/app_dialog.ui:118 #: data/resources/ui/dialogs/process_dialog.ui:96 #: data/resources/ui/dialogs/settings_dialog.ui:148 #: data/resources/ui/dialogs/settings_dialog.ui:240 msgid "Drive Write" msgstr "Zapis dysku" #: src/ui/pages/applications/mod.rs:1114 src/ui/pages/processes/mod.rs:1397 #: data/resources/ui/dialogs/app_dialog.ui:127 #: data/resources/ui/dialogs/process_dialog.ui:105 #: data/resources/ui/dialogs/settings_dialog.ui:153 #: data/resources/ui/dialogs/settings_dialog.ui:245 msgid "Drive Write Total" msgstr "Łączny zapis dysku" #: src/ui/pages/applications/mod.rs:1233 src/ui/pages/processes/mod.rs:1520 #: data/resources/ui/dialogs/app_dialog.ui:158 #: data/resources/ui/dialogs/process_dialog.ui:136 #: data/resources/ui/dialogs/settings_dialog.ui:168 #: data/resources/ui/dialogs/settings_dialog.ui:260 msgid "Video Encoder" msgstr "Enkodowanie wideo" #: src/ui/pages/applications/mod.rs:1293 src/ui/pages/processes/mod.rs:1580 #: data/resources/ui/dialogs/app_dialog.ui:167 #: data/resources/ui/dialogs/process_dialog.ui:145 #: data/resources/ui/dialogs/settings_dialog.ui:173 #: data/resources/ui/dialogs/settings_dialog.ui:265 msgid "Video Decoder" msgstr "Dekodowanie wideo" #: src/ui/pages/applications/mod.rs:1352 src/ui/pages/processes/mod.rs:1640 #: data/resources/ui/dialogs/app_dialog.ui:149 #: data/resources/ui/dialogs/process_dialog.ui:127 #: data/resources/ui/dialogs/settings_dialog.ui:163 #: data/resources/ui/dialogs/settings_dialog.ui:255 msgid "Video Memory" msgstr "Pamięć wideo" #: src/ui/pages/applications/mod.rs:1410 src/ui/pages/memory.rs:197 #: src/ui/pages/processes/mod.rs:1943 data/resources/ui/dialogs/app_dialog.ui:91 #: data/resources/ui/dialogs/process_dialog.ui:73 #: data/resources/ui/dialogs/settings_dialog.ui:178 #: data/resources/ui/dialogs/settings_dialog.ui:290 msgid "Swap" msgstr "Pamięć wymiany" #: src/ui/pages/applications/mod.rs:1469 src/ui/pages/processes/mod.rs:2001 #: data/resources/ui/dialogs/settings_dialog.ui:183 #: data/resources/ui/dialogs/settings_dialog.ui:295 msgid "Combined Memory" msgstr "Łączna pamięć" #: src/ui/pages/applications/mod.rs:1528 src/ui/pages/processes/mod.rs:2060 msgid "End {}?" msgstr "Zakończyć {}?" #: src/ui/pages/applications/mod.rs:1529 src/ui/pages/processes/mod.rs:2061 msgid "Halt {}?" msgstr "Wstrzymać {}?" #: src/ui/pages/applications/mod.rs:1530 src/ui/pages/processes/mod.rs:2062 msgid "Kill {}?" msgstr "Zabić {}?" #: src/ui/pages/applications/mod.rs:1531 src/ui/pages/processes/mod.rs:2063 msgid "Continue {}?" msgstr "Wznowić {}?" #: src/ui/pages/applications/mod.rs:1537 src/ui/pages/processes/mod.rs:2098 msgid "Unsaved work might be lost." msgstr "Niezapisana praca zostanie utracona." #: src/ui/pages/applications/mod.rs:1539 msgid "" "Halting an app can come with serious risks such as losing data and security " "implications. Use with caution." msgstr "" "Wstrzymanie programu może nieść ze sobą ryzyko utraty danych lub naruszenie " "bezpieczeństwa. Używaj z rozwagą." #: src/ui/pages/applications/mod.rs:1542 msgid "" "Killing an app can come with serious risks such as losing data and security " "implications. Use with caution." msgstr "" "Zabicie programu może nieść ze sobą ryzyko utraty danych lub naruszenie " "bezpieczeństwa. Używaj z rozwagą." #: src/ui/pages/applications/mod.rs:1550 data/resources/ui/pages/applications.ui:22 #: data/resources/ui/pages/applications.ui:98 msgid "End App" msgstr "Zakończ program" #: src/ui/pages/applications/mod.rs:1551 data/resources/ui/pages/applications.ui:10 #: data/resources/ui/pages/applications.ui:30 msgid "Halt App" msgstr "Wstrzymaj program" #: src/ui/pages/applications/mod.rs:1552 data/resources/ui/pages/applications.ui:6 #: data/resources/ui/pages/applications.ui:26 msgid "Kill App" msgstr "Zabij program" #: src/ui/pages/applications/mod.rs:1553 data/resources/ui/pages/applications.ui:14 #: data/resources/ui/pages/applications.ui:34 msgid "Continue App" msgstr "Wznów program" #: src/ui/pages/battery.rs:102 src/ui/pages/drive.rs:126 msgid "Drive" msgstr "Dysk" #: src/ui/pages/battery.rs:209 msgid "Battery Charge" msgstr "Naładowanie baterii" #: src/ui/pages/battery.rs:216 data/resources/ui/pages/gpu.ui:55 #: data/resources/ui/pages/npu.ui:49 msgid "Power Usage" msgstr "Zużycie energii" #: src/ui/pages/battery.rs:278 src/ui/pages/cpu.rs:410 src/ui/pages/drive.rs:340 #: src/ui/pages/drive.rs:371 src/ui/pages/gpu.rs:422 src/ui/pages/network.rs:327 #: src/ui/pages/network.rs:361 src/ui/pages/npu.rs:304 src/ui/pages/npu.rs:353 msgid "Highest:" msgstr "Najwięcej:" #: src/ui/pages/cpu.rs:236 src/ui/pages/gpu.rs:210 src/ui/pages/npu.rs:201 msgid "Total Usage" msgstr "Łączne użycie" #: src/ui/pages/cpu.rs:264 src/ui/pages/gpu.rs:237 src/ui/pages/npu.rs:211 msgid "Temperature" msgstr "Temperatura" #: src/ui/pages/drive.rs:235 msgid "Drive Activity" msgstr "Aktywność Dysku" #: src/ui/pages/drive.rs:242 msgid "Read Speed" msgstr "Szybkość odczytu" #: src/ui/pages/drive.rs:246 msgid "Write Speed" msgstr "Szybkość zapisu" #: src/ui/pages/drive.rs:408 src/ui/pages/drive.rs:418 msgid "Yes" msgstr "Tak" #. Translators: This is an abbreviation for "Read" and "Write". This is displayed in the sidebar so your #. translation should preferably be quite short or an abbreviation #: src/ui/pages/drive.rs:436 msgid "R: {} · W: {}" msgstr "R: {} · W: {}" #: src/ui/pages/gpu.rs:218 msgid "Video Encoder/Decoder Usage" msgstr "Wykorzystanie enkodera/dekodera wideo" #: src/ui/pages/gpu.rs:224 msgid "Video Encoder Usage" msgstr "Enkodowanie wideo" #: src/ui/pages/gpu.rs:229 msgid "Video Decoder Usage" msgstr "Dekodowanie wideo" #: src/ui/pages/gpu.rs:234 msgid "Video Memory Usage" msgstr "Wykorzystanie pamięci wideo" #. Translators: This will be displayed in the sidebar, please try to keep your translation as short as (or even #. shorter than) 'Memory' #: src/ui/pages/gpu.rs:408 src/ui/pages/npu.rs:278 src/ui/pages/npu.rs:299 msgid "Memory: {}" msgstr "Pamięć: {}" #: src/ui/pages/memory.rs:261 msgid "{} of {}" msgstr "{} z {}" #: src/ui/pages/memory.rs:264 msgid "{} MT/s" msgstr "{} MT/s" #. Translators: This will be displayed in the sidebar, so your translation for "Swap" should #. preferably be quite short or an abbreviation #: src/ui/pages/memory.rs:345 msgid "{} / {} · Swap: {} %" msgstr "{} / {} · p. wymiany: {} %" #: src/ui/pages/network.rs:118 src/utils/network.rs:136 msgid "Network Interface" msgstr "Interfejs sieciowy" #: src/ui/pages/network.rs:229 msgid "Receiving" msgstr "Odbieranie" #: src/ui/pages/network.rs:233 msgid "Sending" msgstr "Wysyłanie" #. Translators: This is an abbreviation for "Receive" and "Send". This is displayed in the sidebar so #. your translation should preferably be quite short or an abbreviation #: src/ui/pages/network.rs:384 msgid "R: {} · S: {}" msgstr "R: {} · S: {}" #: src/ui/pages/npu.rs:109 src/ui/window.rs:484 msgid "NPU" msgstr "NPU" #: src/ui/pages/npu.rs:208 msgid "Memory Usage" msgstr "Wykorzystanie pamięci" #: src/ui/pages/processes/mod.rs:175 data/resources/ui/window.ui:105 #: data/resources/ui/window.ui:112 data/resources/ui/dialogs/settings_dialog.ui:193 msgid "Processes" msgstr "Procesy" #: src/ui/pages/processes/mod.rs:522 src/ui/pages/processes/mod.rs:2111 #: data/resources/ui/pages/processes.ui:38 data/resources/ui/pages/processes.ui:157 msgid "End Process" msgstr "Zakończ proces" #: src/ui/pages/processes/mod.rs:526 data/resources/ui/pages/processes.ui:70 msgid "End Processes" msgstr "Zakończ procesy" #: src/ui/pages/processes/mod.rs:812 msgid "Running Processes: {}" msgstr "Uruchomione procesy: {}" #: src/ui/pages/processes/mod.rs:910 msgid "Process" msgstr "Proces" #: src/ui/pages/processes/mod.rs:971 data/resources/ui/dialogs/process_dialog.ui:186 #: data/resources/ui/dialogs/settings_dialog.ui:210 msgid "Process ID" msgstr "Identyfikator" #: src/ui/pages/processes/mod.rs:1024 data/resources/ui/dialogs/process_dialog.ui:213 #: data/resources/ui/dialogs/settings_dialog.ui:215 msgid "User" msgstr "Użytkownik" #: src/ui/pages/processes/mod.rs:1699 data/resources/ui/dialogs/process_dialog.ui:154 #: data/resources/ui/dialogs/settings_dialog.ui:270 msgid "Total CPU Time" msgstr "Łącznie użycie" #: src/ui/pages/processes/mod.rs:1758 data/resources/ui/dialogs/process_dialog.ui:163 #: data/resources/ui/dialogs/settings_dialog.ui:275 msgid "User CPU Time" msgstr "Czas CPU użytkownika" #: src/ui/pages/processes/mod.rs:1817 data/resources/ui/dialogs/process_dialog.ui:172 #: data/resources/ui/dialogs/settings_dialog.ui:280 msgid "System CPU Time" msgstr "Czas CPU systemu" #: src/ui/pages/processes/mod.rs:1876 #: data/resources/ui/dialogs/process_options_dialog.ui:87 #: data/resources/ui/dialogs/settings_dialog.ui:285 msgid "Priority" msgstr "Priorytet" #: src/ui/pages/processes/mod.rs:2070 msgid "End process?" msgid_plural "End {} processes?" msgstr[0] "Zakończyć proces?" msgstr[1] "Zakończyć {} procesy?" msgstr[2] "Zakończyć {} procesów?" #: src/ui/pages/processes/mod.rs:2076 msgid "Halt process?" msgid_plural "Halt {} processes?" msgstr[0] "Wstrzymać proces?" msgstr[1] "Wstrzymać {} procesy?" msgstr[2] "Wstrzymać {} procesów?" #: src/ui/pages/processes/mod.rs:2082 src/ui/pages/processes/mod.rs:2088 msgid "Kill process?" msgid_plural "Kill {} processes?" msgstr[0] "Zabić proces?" msgstr[1] "Zabić {} procesy?" msgstr[2] "Zabić {} procesów?" #: src/ui/pages/processes/mod.rs:2100 msgid "" "Halting a process can come with serious risks such as losing data and security " "implications. Use with caution." msgstr "" "Wstrzymanie procesu może nieść ze sobą ryzyko utraty danych lub naruszenie " "bezpieczeństwa. Używaj z rozwagą." #: src/ui/pages/processes/mod.rs:2103 msgid "" "Killing a process can come with serious risks such as losing data and security " "implications. Use with caution." msgstr "" "Zabicie procesu może nieść ze sobą ryzyko utraty danych lub naruszenie " "bezpieczeństwa. Używaj z rozwagą." #: src/ui/pages/processes/mod.rs:2112 data/resources/ui/pages/processes.ui:10 #: data/resources/ui/pages/processes.ui:46 msgid "Halt Process" msgstr "Wstrzymaj proces" #: src/ui/pages/processes/mod.rs:2113 data/resources/ui/pages/processes.ui:6 #: data/resources/ui/pages/processes.ui:42 msgid "Kill Process" msgstr "Zabij proces" #: src/ui/pages/processes/mod.rs:2114 data/resources/ui/pages/processes.ui:14 #: data/resources/ui/pages/processes.ui:50 msgid "Continue Process" msgstr "Wznów proces" #: src/ui/window.rs:452 msgid "GPU {}" msgstr "GPU {}" #: src/ui/window.rs:482 msgid "NPU {}" msgstr "NPU {}" #: src/ui/window.rs:1158 msgid "Successfully adjusted {}" msgstr "Pomyślnie dostosowano {}" #: src/ui/window.rs:1159 msgid "There was a problem adjusting {}" msgstr "Wystąpił problem podczas dostosowywania {}" #: src/ui/window.rs:1241 msgid "Successfully ended {}" msgstr "Zakończono {}" #: src/ui/window.rs:1242 msgid "Successfully halted {}" msgstr "Wstrzymano {}" #: src/ui/window.rs:1243 msgid "Successfully killed {}" msgstr "Zabito {}" #: src/ui/window.rs:1244 msgid "Successfully continued {}" msgstr "Wznowiono {}" #: src/ui/window.rs:1251 msgid "Successfully ended the process" msgid_plural "Successfully ended {} processes" msgstr[0] "Pomyślnie zakończono proces" msgstr[1] "Pomyślnie zakończono {} procesy" msgstr[2] "Pomyślnie zakończono {} procesów" #: src/ui/window.rs:1257 msgid "Successfully halted the process" msgid_plural "Successfully halted {} processes" msgstr[0] "Pomyślnie wstrzymano proces" msgstr[1] "Pomyślnie wstrzymano {} procesy" msgstr[2] "Pomyślnie wstrzymano {} procesów" #: src/ui/window.rs:1263 msgid "Successfully killed the process" msgid_plural "Successfully killed {} processes" msgstr[0] "Pomyślnie zabito proces" msgstr[1] "Pomyślnie zabito {} procesy" msgstr[2] "Pomyślnie zabito {} procesów" #: src/ui/window.rs:1269 msgid "Successfully continued the process" msgid_plural "Successfully continued {} processes" msgstr[0] "Pomyślnie wznowiono proces" msgstr[1] "Pomyślnie wznowiono {} procesy" msgstr[2] "Pomyślnie wznowiono {} procesów" #: src/ui/window.rs:1280 msgid "There was a problem ending a process" msgid_plural "There were problems ending {} processes" msgstr[0] "Wystąpił problem podczas kończenia procesu" msgstr[1] "Wystąpił problem podczas kończenia {} procesów" msgstr[2] "Wystąpił problem podczas kończenia {} procesów" #: src/ui/window.rs:1286 msgid "There was a problem halting a process" msgid_plural "There were problems halting {} processes" msgstr[0] "Wystąpił problem podczas kończenia procesu" msgstr[1] "Wystąpił problem podczas kończenia {} procesów" msgstr[2] "Wystąpił problem podczas kończenia {} procesów" #: src/ui/window.rs:1292 msgid "There was a problem killing a process" msgid_plural "There were problems killing {} processes" msgstr[0] "Wystąpił problem podczas zabijania procesu" msgstr[1] "Wystąpił problem podczas zabijania {} procesów" msgstr[2] "Wystąpił problem podczas zabijania {} procesów" #: src/ui/window.rs:1298 msgid "There was a problem continuing a process" msgid_plural "There were problems continuing {} processes" msgstr[0] "Wystąpił problem podczas wznawiania procesu" msgstr[1] "Wystąpił problem podczas wznawiania {} procesów" msgstr[2] "Wystąpił problem podczas wznawiania {} procesów" #: src/ui/window.rs:1308 msgid "There was a problem ending {}" msgstr "Wystąpił problem podczas kończenia {}" #: src/ui/window.rs:1309 msgid "There was a problem halting {}" msgstr "Wystąpił problem podczas wznawiania {}" #: src/ui/window.rs:1310 msgid "There was a problem killing {}" msgstr "Wystąpił problem podczas zabijania {}" #: src/ui/window.rs:1311 msgid "There was a problem continuing {}" msgstr "Wystąpił problem podczas wznawiania {}" #: src/utils/app.rs:222 msgid "System Processes" msgstr "Procesy systemowe" #: src/utils/battery.rs:90 msgid "Charging" msgstr "Ładowanie" #: src/utils/battery.rs:91 msgid "Discharging" msgstr "Rozładowywanie" #: src/utils/battery.rs:92 msgid "Empty" msgstr "Pusta" #: src/utils/battery.rs:93 msgid "Full" msgstr "Pełna" #: src/utils/battery.rs:94 msgid "Unknown" msgstr "Nieznana" #: src/utils/battery.rs:140 msgid "Nickel-Metal Hydride" msgstr "Niklowo-metalowo-wodorkowa" #: src/utils/battery.rs:141 msgid "Nickel-Cadmium" msgstr "Niklowo-kadmowa" #: src/utils/battery.rs:142 msgid "Nickel-Zinc" msgstr "Niklowo-cynkowa" #: src/utils/battery.rs:143 msgid "Lead-Acid" msgstr "Kwasowo-ołowiowa" #: src/utils/battery.rs:144 msgid "Lithium-Ion" msgstr "Litowo-jonowa" #: src/utils/battery.rs:145 msgid "Lithium Iron Phosphate" msgstr "Fosforan litowo-żelazowy" #: src/utils/battery.rs:146 msgid "Lithium Polymer" msgstr "Litowo-polimerowa" #: src/utils/battery.rs:148 msgid "Rechargeable Alkaline Managanese" msgstr "Alkaiczna" #: src/utils/battery.rs:259 msgid "{} Battery" msgstr "Bateria {}" #: src/utils/battery.rs:261 msgid "Battery" msgstr "Bateria" #: src/utils/drive.rs:128 src/utils/drive.rs:207 msgid "CD/DVD/Blu-ray Drive" msgstr "Dysk CD/DVD/Blu-ray" #: src/utils/drive.rs:129 msgid "eMMC Storage" msgstr "Dysk eMMC" #: src/utils/drive.rs:130 msgid "Flash Storage" msgstr "Dysk Flash" #: src/utils/drive.rs:131 src/utils/drive.rs:208 msgid "Floppy Drive" msgstr "Dyskietka" #: src/utils/drive.rs:132 msgid "Hard Disk Drive" msgstr "Dysk Twardy" #: src/utils/drive.rs:133 msgid "Loop Device" msgstr "Urządzenie pętli" #: src/utils/drive.rs:134 msgid "Mapped Device" msgstr "Zmapowane urządzenie" #: src/utils/drive.rs:135 msgid "NVMe Drive" msgstr "Dysk NVMe" #: src/utils/drive.rs:137 msgid "Software Raid" msgstr "Software Raid" #: src/utils/drive.rs:138 msgid "RAM Disk" msgstr "Dysk RAM" #: src/utils/drive.rs:139 msgid "Solid State Drive" msgstr "Dysk SSD" #: src/utils/drive.rs:140 msgid "ZFS Volume" msgstr "Wolumin ZFS" #: src/utils/drive.rs:141 msgid "Compressed RAM Disk (zram)" msgstr "Skompresowany dysk RAM (zram)" #: src/utils/drive.rs:209 msgid "{} Loop Device" msgstr "Urządzenie pętli {}" #: src/utils/drive.rs:210 msgid "{} Mapped Device" msgstr "Zmapowane urządzenie {}" #: src/utils/drive.rs:211 msgid "{} RAID" msgstr "RAID {}" #: src/utils/drive.rs:212 msgid "{} RAM Disk" msgstr "Dysk RAM {}" #: src/utils/drive.rs:213 msgid "{} zram Device" msgstr "Urządzenie zram {}" #: src/utils/drive.rs:214 msgid "{} ZFS Volume" msgstr "Wolumin ZFS {}" #: src/utils/drive.rs:215 msgid "{} Drive" msgstr "Dysk {}" #: src/utils/network.rs:124 msgid "Bluetooth Tether" msgstr "Tethering przez Bluetooth" #: src/utils/network.rs:125 msgid "Network Bridge" msgstr "Mostek sieciowy" #: src/utils/network.rs:126 msgid "Ethernet Connection" msgstr "Połączenie Ethernet" #: src/utils/network.rs:127 msgid "Docker Bridge" msgstr "Mostek Dockera" #: src/utils/network.rs:128 msgid "InfiniBand Connection" msgstr "Połączenie InfiniBand" #: src/utils/network.rs:129 msgid "Serial Line IP Connection" msgstr "Połączenie Serial Line IP" #: src/utils/network.rs:130 msgid "Virtual Ethernet Device" msgstr "Wirtualne urządzenie Ethernet" #: src/utils/network.rs:131 msgid "VM Network Bridge" msgstr "Mostek sieci VM" #: src/utils/network.rs:132 msgid "VPN Tunnel" msgstr "Tunel VPN" #: src/utils/network.rs:133 msgid "VPN Tunnel (WireGuard)" msgstr "Tunel VPN (WireGuard)" #: src/utils/network.rs:134 msgid "Wi-Fi Connection" msgstr "Połączenie Wi-Fi" #: src/utils/network.rs:135 msgid "WWAN Connection" msgstr "Połączenie WWAN" #: src/utils/units.rs:76 msgid "{} K" msgstr "{} K" #: src/utils/units.rs:78 msgid "{} °C" msgstr "{} °C" #: src/utils/units.rs:80 msgid "{} °F" msgstr "{} °F" #: src/utils/units.rs:98 src/utils/units.rs:112 src/utils/units.rs:132 #: src/utils/units.rs:146 msgid "{} B" msgstr "{} B" #: src/utils/units.rs:99 src/utils/units.rs:113 msgid "{} kB" msgstr "{} kB" #: src/utils/units.rs:100 src/utils/units.rs:114 msgid "{} MB" msgstr "{} MB" #: src/utils/units.rs:101 src/utils/units.rs:115 msgid "{} GB" msgstr "{} GB" #: src/utils/units.rs:102 src/utils/units.rs:116 msgid "{} TB" msgstr "{} TB" #: src/utils/units.rs:103 src/utils/units.rs:117 msgid "{} PB" msgstr "{} PB" #: src/utils/units.rs:104 src/utils/units.rs:118 msgid "{} EB" msgstr "{} EB" #: src/utils/units.rs:105 src/utils/units.rs:119 msgid "{} ZB" msgstr "{} ZB" #: src/utils/units.rs:106 src/utils/units.rs:120 msgid "{} YB" msgstr "{} YB" #: src/utils/units.rs:107 src/utils/units.rs:121 msgid "{} RB" msgstr "{} RB" #: src/utils/units.rs:108 src/utils/units.rs:122 msgid "{} QB" msgstr "{} QB" #: src/utils/units.rs:133 src/utils/units.rs:147 msgid "{} KiB" msgstr "{} KiB" #: src/utils/units.rs:134 src/utils/units.rs:148 msgid "{} MiB" msgstr "{} MiB" #: src/utils/units.rs:135 src/utils/units.rs:149 msgid "{} GiB" msgstr "{} GiB" #: src/utils/units.rs:136 src/utils/units.rs:150 msgid "{} TiB" msgstr "{} TiB" #: src/utils/units.rs:137 src/utils/units.rs:151 msgid "{} PiB" msgstr "{} PiB" #: src/utils/units.rs:138 src/utils/units.rs:152 msgid "{} EiB" msgstr "{} EiB" #: src/utils/units.rs:139 src/utils/units.rs:153 msgid "{} ZiB" msgstr "{} ZiB" #: src/utils/units.rs:140 src/utils/units.rs:154 msgid "{} YiB" msgstr "{} YiB" #: src/utils/units.rs:141 src/utils/units.rs:155 msgid "{} RiB" msgstr "{} RiB" #: src/utils/units.rs:142 src/utils/units.rs:156 msgid "{} QiB" msgstr "{} QiB" #: src/utils/units.rs:183 src/utils/units.rs:200 msgid "{} B/s" msgstr "{} B/s" #: src/utils/units.rs:184 msgid "{} kB/s" msgstr "{} kB/s" #: src/utils/units.rs:185 msgid "{} MB/s" msgstr "{} MB/s" #: src/utils/units.rs:186 msgid "{} GB/s" msgstr "{} GB/s" #: src/utils/units.rs:187 msgid "{} TB/s" msgstr "{} TB/s" #: src/utils/units.rs:188 msgid "{} PB/s" msgstr "{} PB/s" #: src/utils/units.rs:189 msgid "{} EB/s" msgstr "{} EB/s" #: src/utils/units.rs:190 msgid "{} ZB/s" msgstr "{} ZB/s" #: src/utils/units.rs:191 msgid "{} YB/s" msgstr "{} YB/s" #: src/utils/units.rs:192 msgid "{} RB/s" msgstr "{} RB/s" #: src/utils/units.rs:193 msgid "{} QB/s" msgstr "{} QB/s" #: src/utils/units.rs:201 msgid "{} KiB/s" msgstr "{} KiB/s" #: src/utils/units.rs:202 msgid "{} MiB/s" msgstr "{} MiB/s" #: src/utils/units.rs:203 msgid "{} GiB/s" msgstr "{} GiB/s" #: src/utils/units.rs:204 msgid "{} TiB/s" msgstr "{} TiB/s" #: src/utils/units.rs:205 msgid "{} PiB/s" msgstr "{} PiB/s" #: src/utils/units.rs:206 msgid "{} EiB/s" msgstr "{} EiB/s" #: src/utils/units.rs:207 msgid "{} ZiB/s" msgstr "{} ZiB/s" #: src/utils/units.rs:208 msgid "{} YiB/s" msgstr "{} YiB/s" #: src/utils/units.rs:209 msgid "{} RiB/s" msgstr "{} RiB/s" #: src/utils/units.rs:210 msgid "{} QiB/s" msgstr "{} QiB/s" #: src/utils/units.rs:224 src/utils/units.rs:241 msgid "{} b/s" msgstr "{} b/s" #: src/utils/units.rs:225 msgid "{} kb/s" msgstr "{} kb/s" #: src/utils/units.rs:226 msgid "{} Mb/s" msgstr "{} Mb/s" #: src/utils/units.rs:227 msgid "{} Gb/s" msgstr "{} Gb/s" #: src/utils/units.rs:228 msgid "{} Tb/s" msgstr "{} Tb/s" #: src/utils/units.rs:229 msgid "{} Pb/s" msgstr "{} Pb/s" #: src/utils/units.rs:230 msgid "{} Eb/s" msgstr "{} Eb/s" #: src/utils/units.rs:231 msgid "{} Zb/s" msgstr "{} Zb/s" #: src/utils/units.rs:232 msgid "{} Yb/s" msgstr "{} Yb/s" #: src/utils/units.rs:233 msgid "{} Rb/s" msgstr "{} Rb/s" #: src/utils/units.rs:234 msgid "{} Qb/s" msgstr "{} Qb/s" #: src/utils/units.rs:242 msgid "{} Kib/s" msgstr "{} Kib/s" #: src/utils/units.rs:243 msgid "{} Mib/s" msgstr "{} Mib/s" #: src/utils/units.rs:244 msgid "{} Gib/s" msgstr "{} Gib/s" #: src/utils/units.rs:245 msgid "{} Tib/s" msgstr "{} Tib/s" #: src/utils/units.rs:246 msgid "{} Pib/s" msgstr "{} Pib/s" #: src/utils/units.rs:247 msgid "{} Eib/s" msgstr "{} Eib/s" #: src/utils/units.rs:248 msgid "{} Zib/s" msgstr "{} Zib/s" #: src/utils/units.rs:249 msgid "{} Yib/s" msgstr "{} Yib/s" #: src/utils/units.rs:250 msgid "{} Rib/s" msgstr "{} Rib/s" #: src/utils/units.rs:251 msgid "{} Qib/s" msgstr "{} Qib/s" #: src/utils/units.rs:258 msgid "{} Hz" msgstr "{} Hz" #: src/utils/units.rs:259 msgid "{} kHz" msgstr "{} kHz" #: src/utils/units.rs:260 msgid "{} MHz" msgstr "{} MHz" #: src/utils/units.rs:261 msgid "{} GHz" msgstr "{} GHz" #: src/utils/units.rs:262 msgid "{} THz" msgstr "{} THz" #: src/utils/units.rs:263 msgid "{} PHz" msgstr "{} PHz" #: src/utils/units.rs:264 msgid "{} EHz" msgstr "{} EHz" #: src/utils/units.rs:265 msgid "{} ZHz" msgstr "{} ZHz" #: src/utils/units.rs:266 msgid "{} YHz" msgstr "{} YHz" #: src/utils/units.rs:267 msgid "{} RHz" msgstr "{} RHz" #: src/utils/units.rs:268 msgid "{} QHz" msgstr "{} QHz" #: src/utils/units.rs:275 msgid "{} W" msgstr "{} W" #: src/utils/units.rs:276 msgid "{} kW" msgstr "{} kW" #: src/utils/units.rs:277 msgid "{} MW" msgstr "{} MW" #: src/utils/units.rs:278 msgid "{} GW" msgstr "{} GW" #: src/utils/units.rs:279 msgid "{} TW" msgstr "{} TW" #: src/utils/units.rs:280 msgid "{} PW" msgstr "{} PW" #: src/utils/units.rs:281 msgid "{} EW" msgstr "{} EW" #: src/utils/units.rs:282 msgid "{} ZW" msgstr "{} ZW" #: src/utils/units.rs:283 msgid "{} YW" msgstr "{} YW" #: src/utils/units.rs:284 msgid "{} RW" msgstr "{} RW" #: src/utils/units.rs:285 msgid "{} QW" msgstr "{} QW" #: src/utils/units.rs:294 src/utils/units.rs:308 msgid "{} Wh" msgstr "{} Wh" #: src/utils/units.rs:295 src/utils/units.rs:309 msgid "{} kWh" msgstr "{} kWh" #: src/utils/units.rs:296 src/utils/units.rs:310 msgid "{} MWh" msgstr "{} MWh" #: src/utils/units.rs:297 src/utils/units.rs:311 msgid "{} GWh" msgstr "{} GWh" #: src/utils/units.rs:298 src/utils/units.rs:312 msgid "{} TWh" msgstr "{} TWh" #: src/utils/units.rs:299 src/utils/units.rs:313 msgid "{} PWh" msgstr "{} PWh" #: src/utils/units.rs:300 src/utils/units.rs:314 msgid "{} EWh" msgstr "{} EWh" #: src/utils/units.rs:301 src/utils/units.rs:315 msgid "{} ZWh" msgstr "{} ZWh" #: src/utils/units.rs:302 src/utils/units.rs:316 msgid "{} YWh" msgstr "{} YWh" #: src/utils/units.rs:303 src/utils/units.rs:317 msgid "{} RWh" msgstr "{} RWh" #: src/utils/units.rs:304 src/utils/units.rs:318 msgid "{} QWh" msgstr "{} QWh" #: data/resources/ui/shortcuts.ui:11 msgctxt "shortcut window" msgid "General" msgstr "Ogólne" #: data/resources/ui/shortcuts.ui:14 msgctxt "shortcut window" msgid "Preferences" msgstr "Ustawienia" #: data/resources/ui/shortcuts.ui:20 msgctxt "shortcut window" msgid "Show Shortcuts" msgstr "Wyświetl skróty" #: data/resources/ui/shortcuts.ui:26 msgctxt "shortcut window" msgid "Quit" msgstr "Zakończ" #: data/resources/ui/shortcuts.ui:32 msgctxt "shortcut window" msgid "Toggle Search Field" msgstr "Przełącz pole wyszukiwania" #: data/resources/ui/shortcuts.ui:38 msgctxt "shortcut window" msgid "End App/Process" msgstr "Zakończ program/proces" #: data/resources/ui/shortcuts.ui:44 msgctxt "shortcut window" msgid "Kill App/Process" msgstr "Zabij program/proces" #: data/resources/ui/shortcuts.ui:50 msgctxt "shortcut window" msgid "Halt App/Process" msgstr "Wstrzymaj program/proces" #: data/resources/ui/shortcuts.ui:56 msgctxt "shortcut window" msgid "Continue App/Process" msgstr "Wznów program/proces" #: data/resources/ui/shortcuts.ui:62 msgctxt "shortcut window" msgid "Show Information for App/Process" msgstr "Pokaż informację o programie/procesie" #: data/resources/ui/shortcuts.ui:68 msgctxt "shortcut window" msgid "Show Process Options" msgstr "Pokaż opcje procesu" #: data/resources/ui/window.ui:6 msgid "Preferences" msgstr "Ustawienia" #: data/resources/ui/window.ui:10 msgid "Keyboard Shortcuts" msgstr "Skróty klawiszowe" #: data/resources/ui/window.ui:14 msgid "About Resources" msgstr "O programie" #: data/resources/ui/window.ui:88 data/resources/ui/window.ui:128 msgid "Search" msgstr "Szukaj" #: data/resources/ui/window.ui:90 data/resources/ui/window.ui:130 msgid "Toggle search field" msgstr "Przełącz pole wyszukiwania" #: data/resources/ui/dialogs/app_dialog.ui:7 msgid "App Information" msgstr "Informacje o programie" #: data/resources/ui/dialogs/app_dialog.ui:70 #: data/resources/ui/dialogs/process_dialog.ui:48 data/resources/ui/pages/battery.ui:22 #: data/resources/ui/pages/cpu.ui:37 data/resources/ui/pages/cpu.ui:50 #: data/resources/ui/pages/drive.ui:22 data/resources/ui/pages/gpu.ui:22 #: data/resources/ui/pages/memory.ui:31 data/resources/ui/pages/network.ui:22 #: data/resources/ui/pages/npu.ui:22 msgid "Usage" msgstr "Wykorzystanie" #: data/resources/ui/dialogs/app_dialog.ui:174 #: data/resources/ui/dialogs/process_dialog.ui:179 #: data/resources/ui/pages/battery.ui:33 data/resources/ui/pages/cpu.ui:83 #: data/resources/ui/pages/drive.ui:54 data/resources/ui/pages/gpu.ui:74 #: data/resources/ui/pages/memory.ui:42 data/resources/ui/pages/network.ui:51 #: data/resources/ui/pages/npu.ui:68 msgid "Properties" msgstr "Właściwości" #: data/resources/ui/dialogs/app_dialog.ui:180 msgid "ID" msgstr "ID" #: data/resources/ui/dialogs/app_dialog.ui:190 #: data/resources/ui/dialogs/process_dialog.ui:195 msgid "Running Since" msgstr "Uruchomiono" #: data/resources/ui/dialogs/app_dialog.ui:198 msgid "Running Processes" msgstr "Działające procesy" #: data/resources/ui/dialogs/app_dialog.ui:207 #: data/resources/ui/dialogs/process_dialog.ui:231 msgid "Containerized" msgstr "W kontenerze" #: data/resources/ui/dialogs/process_dialog.ui:7 msgid "Process Information" msgstr "Informacje o procesie" #: data/resources/ui/dialogs/process_dialog.ui:204 msgid "Commandline" msgstr "Polecenie" #: data/resources/ui/dialogs/process_dialog.ui:222 msgid "Control Group" msgstr "Grupa kontrolna" #: data/resources/ui/dialogs/process_options_dialog.ui:7 #: data/resources/ui/dialogs/process_options_dialog.ui:69 msgid "Process Options" msgstr "Opcje procesu" #: data/resources/ui/dialogs/process_options_dialog.ui:29 msgid "Apply" msgstr "Zastosuj" #: data/resources/ui/dialogs/process_options_dialog.ui:72 msgid "Niceness" msgstr "Nice" #: data/resources/ui/dialogs/process_options_dialog.ui:73 msgid "" "The priority of a process is given by its niceness. A lower niceness value " "correspond to a higher priority." msgstr "" "Priorytet procesu jest określany przez jego wartość nice. Niższa wartość nice " "odpowiada wyższemu priorytetowi." #: data/resources/ui/dialogs/process_options_dialog.ui:91 msgctxt "process priority" msgid "Very High" msgstr "Bardzo wysoki" #: data/resources/ui/dialogs/process_options_dialog.ui:92 msgctxt "process priority" msgid "High" msgstr "Wysoki" #: data/resources/ui/dialogs/process_options_dialog.ui:93 msgctxt "process priority" msgid "Normal" msgstr "Normalny" #: data/resources/ui/dialogs/process_options_dialog.ui:94 msgctxt "process priority" msgid "Low" msgstr "Niski" #: data/resources/ui/dialogs/process_options_dialog.ui:95 msgctxt "process priority" msgid "Very Low" msgstr "Bardzo niski" #: data/resources/ui/dialogs/process_options_dialog.ui:103 msgid "Processor Affinity" msgstr "Koligacja procesora" #: data/resources/ui/dialogs/process_options_dialog.ui:108 msgid "Toggle All" msgstr "Przełącz wszystkie" #: data/resources/ui/dialogs/process_options_dialog.ui:111 msgid "Select which processor cores the process is allowed to run on" msgstr "Wybór rdzeni procesora, na których proces może być uruchamiany" #: data/resources/ui/dialogs/settings_dialog.ui:7 msgid "General" msgstr "Ogólne" #: data/resources/ui/dialogs/settings_dialog.ui:10 msgid "Units" msgstr "Jednostki" #: data/resources/ui/dialogs/settings_dialog.ui:13 msgid "Data Unit Prefix" msgstr "Przedrostek jednostek SI" #: data/resources/ui/dialogs/settings_dialog.ui:17 msgid "Decimal" msgstr "Dziesiętny" #: data/resources/ui/dialogs/settings_dialog.ui:18 msgid "Binary" msgstr "Binarny" #: data/resources/ui/dialogs/settings_dialog.ui:26 msgid "Show Network Speeds in Bits per Second" msgstr "Pokaż prędkość sieci w bitach na sekundę" #: data/resources/ui/dialogs/settings_dialog.ui:31 msgid "Temperature Unit" msgstr "Jednostka temperatury" #: data/resources/ui/dialogs/settings_dialog.ui:35 msgid "Celsius" msgstr "Celsjusz" #: data/resources/ui/dialogs/settings_dialog.ui:36 msgid "Kelvin" msgstr "Kelwin" #: data/resources/ui/dialogs/settings_dialog.ui:37 msgid "Fahrenheit" msgstr "Fahrenheit" #: data/resources/ui/dialogs/settings_dialog.ui:47 msgid "User Interface" msgstr "Interfejs" #: data/resources/ui/dialogs/settings_dialog.ui:50 msgid "Refresh Speed" msgstr "Szybkość odświeżania" #: data/resources/ui/dialogs/settings_dialog.ui:51 msgid "Higher refresh speeds can lead to higher processor usage" msgstr "" "Wyższe prędkości odświeżania mogą prowadzić do wyższego wykorzystania procesora" #: data/resources/ui/dialogs/settings_dialog.ui:55 msgctxt "UI refresh speed" msgid "Very Slow" msgstr "Bardzo wolny" #: data/resources/ui/dialogs/settings_dialog.ui:56 msgctxt "UI refresh speed" msgid "Slow" msgstr "Wolny" #: data/resources/ui/dialogs/settings_dialog.ui:57 msgctxt "UI refresh speed" msgid "Normal" msgstr "Normalny" #: data/resources/ui/dialogs/settings_dialog.ui:58 msgctxt "UI refresh speed" msgid "Fast" msgstr "Szybki" #: data/resources/ui/dialogs/settings_dialog.ui:59 msgctxt "UI refresh speed" msgid "Very Fast" msgstr "Bardzo szybki" #: data/resources/ui/dialogs/settings_dialog.ui:67 msgid "Show Graph Grids" msgstr "Pokaż siatkę w wykresach" #: data/resources/ui/dialogs/settings_dialog.ui:72 msgid "Graph Data Points" msgstr "Punkty danych wykresu" #: data/resources/ui/dialogs/settings_dialog.ui:86 msgid "Show Usage Details in Sidebar" msgstr "Pokaż szczegóły użycia na pasku bocznym" #: data/resources/ui/dialogs/settings_dialog.ui:87 msgid "If enabled, the usage along with other information will be displayed" msgstr "" "Jeśli ta opcja jest włączona, wyświetlane będzie wykorzystanie wraz z innymi " "informacjami" #: data/resources/ui/dialogs/settings_dialog.ui:92 msgid "Show Device Descriptions in Sidebar" msgstr "Pokaż opisy urządzeń na pasku bocznym" #: data/resources/ui/dialogs/settings_dialog.ui:93 msgid "If enabled, a device identifier like its name or device type will be displayed" msgstr "" "Jeśli ta opcja jest włączona, wyświetlany będzie identyfikator urządzenia, taki jak " "jego nazwa lub typ" #: data/resources/ui/dialogs/settings_dialog.ui:98 msgid "Sidebar Meter Type" msgstr "Typ miernika na pasku" #: data/resources/ui/dialogs/settings_dialog.ui:102 msgid "Bar" msgstr "Pasek" #: data/resources/ui/dialogs/settings_dialog.ui:103 msgid "Graph" msgstr "Wykres" #: data/resources/ui/dialogs/settings_dialog.ui:111 msgid "Normalize Processor Usage" msgstr "Normalizacja wykorzystania procesora" #: data/resources/ui/dialogs/settings_dialog.ui:112 msgid "If enabled, the total usage of all cores will be divided by the amount of cores" msgstr "Całkowite wykorzystanie wszystkich rdzeni zostanie podzielone przez ich liczbę" #: data/resources/ui/dialogs/settings_dialog.ui:125 #: data/resources/ui/dialogs/settings_dialog.ui:207 msgid "Information Columns" msgstr "Kolumny informacyjne" #: data/resources/ui/dialogs/settings_dialog.ui:196 data/resources/ui/pages/cpu.ui:22 #: data/resources/ui/pages/processes.ui:56 msgid "Options" msgstr "Opcje" #: data/resources/ui/dialogs/settings_dialog.ui:199 msgid "Show Niceness Values" msgstr "Wyświetlaj wartości nice" #: data/resources/ui/dialogs/settings_dialog.ui:200 msgid "Display priorities as niceness to allow for more fine-grained adjustments" msgstr "" "Wyświetlaj priorytety jako wartość nice, aby umożliwić bardziej szczegółowe " "dostosowanie" #: data/resources/ui/dialogs/settings_dialog.ui:305 msgid "Devices" msgstr "Urządzenia" #: data/resources/ui/dialogs/settings_dialog.ui:308 msgid "Drives" msgstr "Dyski" #: data/resources/ui/dialogs/settings_dialog.ui:311 msgid "Show Virtual Drives" msgstr "Pokaż wirtualne dyski" #: data/resources/ui/dialogs/settings_dialog.ui:312 msgid "Virtual drives are for example ZFS volumes or mapped devices" msgstr "Dyski wirtualne to na przykład woluminy ZFS lub zmapowane urządzenia" #: data/resources/ui/dialogs/settings_dialog.ui:322 msgid "Show Virtual Network Interfaces" msgstr "Pokaż wirtualne interfejsy sieciowe" #: data/resources/ui/dialogs/settings_dialog.ui:323 msgid "Virtual network interfaces are for example bridges or VPN tunnels" msgstr "Wirtualne interfejsy sieciowe to na przykład mosty lub tunele VPN" #: data/resources/ui/pages/applications.ui:40 data/resources/ui/pages/processes.ui:62 msgid "Information" msgstr "Informacje" #: data/resources/ui/pages/applications.ui:57 msgid "Search applications" msgstr "Wyszukaj programy" #: data/resources/ui/pages/applications.ui:87 #: data/resources/ui/pages/applications.ui:89 msgid "Show App Information" msgstr "Pokaż informacje o programie" #: data/resources/ui/pages/battery.ui:36 msgid "Battery Health" msgstr "Zdrowie baterii" #: data/resources/ui/pages/battery.ui:45 msgid "Design Capacity" msgstr "Fabryczna pojemność" #: data/resources/ui/pages/battery.ui:54 msgid "Charge Cycles" msgstr "Cykle ładowania" #: data/resources/ui/pages/battery.ui:63 msgid "Technology" msgstr "Technologia" #: data/resources/ui/pages/battery.ui:72 data/resources/ui/pages/gpu.ui:81 #: data/resources/ui/pages/network.ui:58 data/resources/ui/pages/npu.ui:75 msgid "Manufacturer" msgstr "Producent" #: data/resources/ui/pages/battery.ui:81 msgid "Model Name" msgstr "Model" #: data/resources/ui/pages/battery.ui:90 data/resources/ui/pages/drive.ui:66 msgid "Device" msgstr "Urządzenie" #: data/resources/ui/pages/cpu.ui:26 msgid "Show Usages of Logical CPUs" msgstr "Pokaż wykorzystanie logicznych procesorów" #: data/resources/ui/pages/cpu.ui:75 data/resources/ui/pages/gpu.ui:66 #: data/resources/ui/pages/npu.ui:60 msgid "Sensors" msgstr "Czujniki" #: data/resources/ui/pages/cpu.ui:90 msgid "Max Frequency" msgstr "Maksymalna częstotliwość" #: data/resources/ui/pages/cpu.ui:99 msgid "Logical Cores" msgstr "Rdzenie logiczne" #: data/resources/ui/pages/cpu.ui:108 msgid "Physical Cores" msgstr "Rdzenie fizyczne" #: data/resources/ui/pages/cpu.ui:117 msgid "Sockets" msgstr "Gniazda" #: data/resources/ui/pages/cpu.ui:126 msgid "Virtualization" msgstr "Wirtualizacja" #: data/resources/ui/pages/cpu.ui:135 msgid "Architecture" msgstr "Architektura" #: data/resources/ui/pages/drive.ui:38 msgid "Total Read" msgstr "Łączny odczyt" #: data/resources/ui/pages/drive.ui:47 msgid "Total Written" msgstr "Łączny zapis" #: data/resources/ui/pages/drive.ui:57 data/resources/ui/pages/memory.ui:72 msgid "Type" msgstr "Typ" #: data/resources/ui/pages/drive.ui:75 msgid "Capacity" msgstr "Pojemność" #: data/resources/ui/pages/drive.ui:84 msgid "Writable" msgstr "Zapisywalny" #: data/resources/ui/pages/drive.ui:93 msgid "Removable" msgstr "Usuwalny" #. Translators: "Link" refers to something like "PCIe 4.0 ×16" #: data/resources/ui/pages/drive.ui:102 data/resources/ui/pages/gpu.ui:113 #: data/resources/ui/pages/npu.ui:107 msgid "Link" msgstr "Łącze" #: data/resources/ui/pages/gpu.ui:37 msgid "GPU Frequency" msgstr "Częstotliwość GPU" #: data/resources/ui/pages/gpu.ui:50 msgid "Video Memory Frequency" msgstr "Częstotliwość pamięci wideo" #: data/resources/ui/pages/gpu.ui:90 data/resources/ui/pages/npu.ui:84 msgid "PCI Slot" msgstr "Slot PCI" #: data/resources/ui/pages/gpu.ui:99 data/resources/ui/pages/network.ui:67 #: data/resources/ui/pages/npu.ui:93 msgid "Driver Used" msgstr "Sterownik" #: data/resources/ui/pages/gpu.ui:108 data/resources/ui/pages/npu.ui:102 msgid "Max Power Cap" msgstr "Maksymalny limit energii" #: data/resources/ui/pages/memory.ui:9 msgid "You need to authenticate to see memory properties" msgstr "Wymagana autoryzacja aby wyświetlić właściwości pamięci" #: data/resources/ui/pages/memory.ui:10 msgid "Authenticate" msgstr "Autoryzuj" #: data/resources/ui/pages/memory.ui:45 msgid "Slots Used" msgstr "Użyte sloty" #: data/resources/ui/pages/memory.ui:54 msgid "Speed" msgstr "Szybkość" #: data/resources/ui/pages/memory.ui:63 msgid "Form Factor" msgstr "Forma" #: data/resources/ui/pages/memory.ui:81 msgid "Type Detail" msgstr "Szczegóły typu" #: data/resources/ui/pages/network.ui:35 msgid "Total Received" msgstr "Łącznie odebrano" #: data/resources/ui/pages/network.ui:44 msgid "Total Sent" msgstr "Łącznie wysłano" #: data/resources/ui/pages/network.ui:76 msgid "Interface" msgstr "Interfejs" #: data/resources/ui/pages/network.ui:85 msgid "Hardware Address" msgstr "Adres sprzętowy" #: data/resources/ui/pages/network.ui:94 msgid "Link Speed" msgstr "Prędkość łącza" #: data/resources/ui/pages/npu.ui:31 msgid "NPU Frequency" msgstr "Częstotliwość NPU" #: data/resources/ui/pages/npu.ui:44 msgid "Memory Frequency" msgstr "Częstotliwość pamięci" #: data/resources/ui/pages/processes.ui:22 data/resources/ui/pages/processes.ui:74 msgid "Kill Processes" msgstr "Zabij procesy" #: data/resources/ui/pages/processes.ui:26 data/resources/ui/pages/processes.ui:78 msgid "Halt Processes" msgstr "Wstrzymaj procesy" #: data/resources/ui/pages/processes.ui:30 data/resources/ui/pages/processes.ui:82 msgid "Continue Processes" msgstr "Wznów procesy" #: data/resources/ui/pages/processes.ui:103 msgid "Search processes" msgstr "Wyszukaj proces" #: data/resources/ui/pages/processes.ui:133 data/resources/ui/pages/processes.ui:135 msgid "Show Process Options" msgstr "Pokaż opcje" #: data/resources/ui/pages/processes.ui:146 data/resources/ui/pages/processes.ui:148 msgid "Show Process Information" msgstr "Pokaż informacje o procesie" #~ msgid "Show Search Fields on Launch" #~ msgstr "Pokaż pola wyszukiwania po uruchomieniu" #~ msgid "VRAM: {}" #~ msgstr "VRAM: {}" #, fuzzy #~| msgid "Highest:" #~ msgid "High" #~ msgstr "Najwięcej:" #~ msgid "Normal" #~ msgstr "Normalny" #, fuzzy #~| msgid "Very Slow" #~ msgid "Very Low" #~ msgstr "Bardzo wolny" #~ msgid "End app" #~ msgstr "Zakończ program" #~ msgid "Halt app" #~ msgstr "Wstrzymaj program" #~ msgid "Kill app" #~ msgstr "Zabij program" #~ msgid "Continue app" #~ msgstr "Wznów program" #~ msgid "Continue process" #~ msgstr "Wznów proces" #~ msgid "Application" #~ msgstr "Program" #~ msgid "root" #~ msgstr "root" #~ msgctxt "shortcut window" #~ msgid "End Application/Process" #~ msgstr "Zakończ program/proces" #~ msgctxt "shortcut window" #~ msgid "Kill Application/Process" #~ msgstr "Zabij program/proces" #~ msgctxt "shortcut window" #~ msgid "Halt Application/Process" #~ msgstr "Wstrzymaj program/proces" #~ msgctxt "shortcut window" #~ msgid "Continue Application/Process" #~ msgstr "Wznów program/proces" #~ msgid "Window width" #~ msgstr "Szerokość okna" #~ msgid "Window height" #~ msgstr "Wysokość okna" #~ msgid "Window maximized state" #~ msgstr "Stan maksymalizacji okna" #~ msgid "Temperature unit" #~ msgstr "Jednostka temperatury" #~ msgid "Unit Prefix Base" #~ msgstr "Przedrostek jednostek SI" #~ msgid "Show search field for Processes and Applications on launch" #~ msgstr "Pokaż pole wyszukiwania dla procesów i programów po uruchomieniu" #~ msgid "Show virtual block devices such as LVM containers" #~ msgstr "Pokaż wirtualne urządzenia blokowe, na przykład kontenery LVM" #~ msgid "Show virtual network interfaces such as Docker interfaces" #~ msgstr "Pokaż wirtualne interfejsy sieciowe, na przykład interfejsy Dockera" #~ msgid "Show usage details in the sidebar" #~ msgstr "Pokaż szczegóły użycia na pasku bocznym" #~ msgid "Show device description in the sidebar" #~ msgstr "Pokaż opis urządzenia na pasku bocznym" #~ msgid "Display network speeds in bits per second" #~ msgstr "Wyświetlaj prędkość sieci w bitach na sekundę" #~ msgid "Display memory usage in Applications view" #~ msgstr "Wyświetlaj użycie pamięci w widoku programów" #~ msgid "Display CPU usage in Applications view" #~ msgstr "Wyświetlaj wykorzystanie CPU w widoku programów" #~ msgid "Display drive read speed in Applications view" #~ msgstr "Wyświetlaj prędkość odczytu dysku w widoku programów" #~ msgid "Display drive read total in Applications view" #~ msgstr "Wyświetlaj łączny odczyt dysku w widoku programów" #~ msgid "Display drive write speed in Applications view" #~ msgstr "Wyświetlaj prędkość zapisu dysku w widoku programów" #~ msgid "Display drive write total in Applications view" #~ msgstr "Wyświetlaj łączny zapis dysku w widoku programów" #~ msgid "Display GPU usage in Applications view" #~ msgstr "Wyświetlaj użycie GPU w widoku programów" #~ msgid "Display video encoder usage in Applications view" #~ msgstr "Wyświetlaj użycie enkodera wideo w widoku programów" #~ msgid "Display video decoder usage in Applications view" #~ msgstr "Wyświetlaj użycie dekodera wideo w widoku programów" #~ msgid "Display GPU memory usage in Applications view" #~ msgstr "Wyświetlaj użycie pamięci GPU w widoku programów" #~ msgid "Display process ID in Processes view" #~ msgstr "Wyświetlaj ID procesu w widoku procesów" #~ msgid "Display user name in Processes view" #~ msgstr "Wyświetlaj użytkownika w widoku procesów" #~ msgid "Display memory usage in Processes view" #~ msgstr "Wyświetlaj wykorzystanie pamięci w widoku procesów" #~ msgid "Display CPU usage in Processes view" #~ msgstr "Wyświetlaj wykorzystanie CPU w widoku procesów" #~ msgid "Display drive read speed in Processes view" #~ msgstr "Wyświetlaj prędkość odczytu dysku w widoku procesów" #~ msgid "Display drive read total in Processes view" #~ msgstr "Wyświetlaj łączny odczyt dysku w widoku procesów" #~ msgid "Display drive write speed in Processes view" #~ msgstr "Wyświetlaj prędkość zapisu dysku w widoku procesów" #~ msgid "Display drive write total in Processes view" #~ msgstr "Wyświetlaj łączny zapis dysku w widoku procesów" #~ msgid "Display GPU usage in Processes view" #~ msgstr "Wyświetlaj użycie GPU w widoku procesów" #~ msgid "Display video encoder usage in Processes view" #~ msgstr "Wyświetlaj użycie enkodera wideo w widoku procesów" #~ msgid "Display video decoder usage in Processes view" #~ msgstr "Wyświetlaj użycie dekodera wideo w widoku procesów" #~ msgid "Display GPU memory usage in Processes view" #~ msgstr "Wyświetlaj użycie pamięci GPU w widoku procesów" #~ msgid "Display logical CPU graphs in Processor view" #~ msgstr "Wyświetlanie wykresów procesorów logicznych w widoku procesora" #~ msgid "Show grids in graphs" #~ msgstr "Pokaż siatki na wykresach" #~ msgid "Amount of data points that should be shown in a graph" #~ msgstr "Liczba punktów danych, które powinny być wyświetlane na wykresie" #~ msgid "GPU Usage" #~ msgstr "Wykorzystanie GPU" #~ msgid "Current Power Cap" #~ msgstr "Ustawiony limit energii" #~ msgid "Monitor your system resources and processes" #~ msgstr "Monitoruj zasoby oraz procesy systemu" resources-1.9.1/po/pt_BR.po000066400000000000000000001550241510634446000155320ustar00rootroot00000000000000# # nokyan , 2023. # Victor L. Pavan , 2023-2024. # Filipe Motta , 2024. # Juliano de Souza Camargo , 2025. # msgid "" msgstr "" "Project-Id-Version: resources\n" "Report-Msgid-Bugs-To: https://github.com/nokyan/resources/issues/\n" "POT-Creation-Date: 2025-10-04 03:35+0000\n" "PO-Revision-Date: 2025-10-04 12:40+0000\n" "Last-Translator: Juliano de Souza Camargo \n" "Language-Team: Brazilian Portuguese \n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: Gtranslator 49.0\n" "X-Poedit-SourceCharset: UTF-8\n" #: data/net.nokyan.Resources.desktop.in.in:2 #: data/net.nokyan.Resources.metainfo.xml.in.in:4 #: data/resources/ui/window.ui:22 src/application.rs:272 msgid "Resources" msgstr "Recursos" #. Translators: The summary should be 35 characters or less according to Flathub appstream guidelines #: data/net.nokyan.Resources.desktop.in.in:3 #: data/net.nokyan.Resources.metainfo.xml.in.in:5 msgid "Keep an eye on system resources" msgstr "Monitore os recursos do sistema" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/net.nokyan.Resources.desktop.in.in:9 msgid "System;Resources;Monitor;Processes;Usage;Task;Manager;CPU;RAM;Memory;GPU;" msgstr "Sistema;Resources;Recursos;Monitor;Processos;Uso;Tarefas;Gerenciador;CPU;RAM;Memória;GPU;" #: data/net.nokyan.Resources.metainfo.xml.in.in:17 msgid "" "Resources allows you to check the utilization of your system resources and " "control your running processes and apps. It’s designed to be user-friendly " "and feel right at home on a modern desktop by using GNOME’s libadwaita." msgstr "" "Recursos permite que você verifique a utilização dos recursos do seu sistema " "e controle os processos e aplicativos em execução. É projetado para ter uma " "interface amigável e se encaixar em um desktop moderno, usando Libadwaita do " "GNOME." #: data/net.nokyan.Resources.metainfo.xml.in.in:20 msgid "Resources supports monitoring the following components:" msgstr "Recursos suporta o monitoramento dos seguintes componentes:" #: data/net.nokyan.Resources.metainfo.xml.in.in:24 msgid "CPU" msgstr "CPU" #: data/net.nokyan.Resources.metainfo.xml.in.in:25 #: data/resources/ui/dialogs/app_dialog.ui:82 #: data/resources/ui/dialogs/process_dialog.ui:64 #: data/resources/ui/dialogs/settings_dialog.ui:128 #: data/resources/ui/dialogs/settings_dialog.ui:220 #: data/resources/ui/window.ui:176 data/resources/ui/window.ui:183 #: src/ui/pages/applications/mod.rs:803 src/ui/pages/memory.rs:106 #: src/ui/pages/memory.rs:192 src/ui/pages/processes/mod.rs:1079 msgid "Memory" msgstr "Memória" #: data/net.nokyan.Resources.metainfo.xml.in.in:26 #: data/resources/ui/dialogs/app_dialog.ui:140 #: data/resources/ui/dialogs/process_dialog.ui:118 #: data/resources/ui/dialogs/settings_dialog.ui:158 #: data/resources/ui/dialogs/settings_dialog.ui:250 #: src/ui/pages/applications/mod.rs:1181 src/ui/pages/gpu.rs:119 #: src/ui/pages/processes/mod.rs:1469 src/ui/window.rs:468 msgid "GPU" msgstr "GPU" #: data/net.nokyan.Resources.metainfo.xml.in.in:27 #: data/resources/ui/dialogs/settings_dialog.ui:319 msgid "Network Interfaces" msgstr "Interfaces de rede" #: data/net.nokyan.Resources.metainfo.xml.in.in:28 msgid "Storage Devices" msgstr "Dispositivos de Armazenamento" #: data/net.nokyan.Resources.metainfo.xml.in.in:29 msgid "Batteries" msgstr "Baterias" #: data/net.nokyan.Resources.metainfo.xml.in.in:51 msgid "Apps page in light theme" msgstr "Página de Aplicativos no modo claro" #: data/net.nokyan.Resources.metainfo.xml.in.in:55 msgid "Processes page in dark theme" msgstr "Página de Processos no modo escuro" #: data/net.nokyan.Resources.metainfo.xml.in.in:59 msgid "Processor page in light theme" msgstr "Página de Processador no modo claro" #: data/net.nokyan.Resources.metainfo.xml.in.in:63 msgid "Memory page in dark theme" msgstr "Página de Memória no modo escuro" #: data/net.nokyan.Resources.metainfo.xml.in.in:67 msgid "GPU page in light theme" msgstr "Página de GPU no modo claro" #: data/net.nokyan.Resources.metainfo.xml.in.in:71 msgid "Drive page in dark theme" msgstr "Página de Unidade no modo escuro" #: data/net.nokyan.Resources.metainfo.xml.in.in:75 msgid "Network Interface page in light theme" msgstr "Página de Interface de Rede no modo claro" #: data/net.nokyan.Resources.metainfo.xml.in.in:79 msgid "Battery page in dark theme" msgstr "Página de Bateria no modo escuro" #: data/net.nokyan.Resources.policy.in.in:9 msgid "Control Process" msgstr "Controlar processo" #: data/net.nokyan.Resources.policy.in.in:10 msgid "" "Authentication is required to control superuser’s or other users’ processes" msgstr "" "A autenticação é requerida para controlar processos de superusuário ou " "outros usuários" #: data/resources/ui/dialogs/app_dialog.ui:7 msgid "App Information" msgstr "Informações do Aplicativo" #: data/resources/ui/dialogs/app_dialog.ui:70 #: data/resources/ui/dialogs/process_dialog.ui:48 #: data/resources/ui/pages/battery.ui:22 data/resources/ui/pages/cpu.ui:37 #: data/resources/ui/pages/cpu.ui:50 data/resources/ui/pages/drive.ui:22 #: data/resources/ui/pages/gpu.ui:22 data/resources/ui/pages/memory.ui:31 #: data/resources/ui/pages/network.ui:22 data/resources/ui/pages/npu.ui:22 msgid "Usage" msgstr "Uso" #: data/resources/ui/dialogs/app_dialog.ui:73 #: data/resources/ui/dialogs/process_dialog.ui:55 #: data/resources/ui/dialogs/settings_dialog.ui:133 #: data/resources/ui/dialogs/settings_dialog.ui:225 #: data/resources/ui/window.ui:145 data/resources/ui/window.ui:152 #: src/ui/pages/applications/mod.rs:862 src/ui/pages/cpu.rs:128 #: src/ui/pages/processes/mod.rs:1138 src/ui/window.rs:290 msgid "Processor" msgstr "Processador" #: data/resources/ui/dialogs/app_dialog.ui:91 #: data/resources/ui/dialogs/process_dialog.ui:73 #: data/resources/ui/dialogs/settings_dialog.ui:178 #: data/resources/ui/dialogs/settings_dialog.ui:290 #: src/ui/pages/applications/mod.rs:1420 src/ui/pages/memory.rs:198 #: src/ui/pages/processes/mod.rs:1954 msgid "Swap" msgstr "Swap" #: data/resources/ui/dialogs/app_dialog.ui:100 #: data/resources/ui/dialogs/process_dialog.ui:78 #: data/resources/ui/dialogs/settings_dialog.ui:138 #: data/resources/ui/dialogs/settings_dialog.ui:230 #: src/ui/pages/applications/mod.rs:926 src/ui/pages/processes/mod.rs:1202 msgid "Drive Read" msgstr "Leitura da Unidade" #: data/resources/ui/dialogs/app_dialog.ui:109 #: data/resources/ui/dialogs/process_dialog.ui:87 #: data/resources/ui/dialogs/settings_dialog.ui:143 #: data/resources/ui/dialogs/settings_dialog.ui:235 #: src/ui/pages/applications/mod.rs:991 src/ui/pages/processes/mod.rs:1269 msgid "Drive Read Total" msgstr "Total de Leitura da Unidade" #: data/resources/ui/dialogs/app_dialog.ui:118 #: data/resources/ui/dialogs/process_dialog.ui:96 #: data/resources/ui/dialogs/settings_dialog.ui:148 #: data/resources/ui/dialogs/settings_dialog.ui:240 #: src/ui/pages/applications/mod.rs:1052 src/ui/pages/processes/mod.rs:1336 msgid "Drive Write" msgstr "Gravação da Unidade" #: data/resources/ui/dialogs/app_dialog.ui:127 #: data/resources/ui/dialogs/process_dialog.ui:105 #: data/resources/ui/dialogs/settings_dialog.ui:153 #: data/resources/ui/dialogs/settings_dialog.ui:245 #: src/ui/pages/applications/mod.rs:1119 src/ui/pages/processes/mod.rs:1403 msgid "Drive Write Total" msgstr "Total de Gravação da Unidade" #: data/resources/ui/dialogs/app_dialog.ui:149 #: data/resources/ui/dialogs/process_dialog.ui:127 #: data/resources/ui/dialogs/settings_dialog.ui:163 #: data/resources/ui/dialogs/settings_dialog.ui:255 #: src/ui/pages/applications/mod.rs:1361 src/ui/pages/processes/mod.rs:1650 msgid "Video Memory" msgstr "Memória de Vídeo" #: data/resources/ui/dialogs/app_dialog.ui:158 #: data/resources/ui/dialogs/process_dialog.ui:136 #: data/resources/ui/dialogs/settings_dialog.ui:168 #: data/resources/ui/dialogs/settings_dialog.ui:260 #: src/ui/pages/applications/mod.rs:1240 src/ui/pages/processes/mod.rs:1528 msgid "Video Encoder" msgstr "Codificador de Vídeo" #: data/resources/ui/dialogs/app_dialog.ui:167 #: data/resources/ui/dialogs/process_dialog.ui:145 #: data/resources/ui/dialogs/settings_dialog.ui:173 #: data/resources/ui/dialogs/settings_dialog.ui:265 #: src/ui/pages/applications/mod.rs:1301 src/ui/pages/processes/mod.rs:1589 msgid "Video Decoder" msgstr "Decodificador de Vídeo" #: data/resources/ui/dialogs/app_dialog.ui:174 #: data/resources/ui/dialogs/process_dialog.ui:179 #: data/resources/ui/pages/battery.ui:33 data/resources/ui/pages/cpu.ui:83 #: data/resources/ui/pages/drive.ui:54 data/resources/ui/pages/gpu.ui:74 #: data/resources/ui/pages/memory.ui:42 data/resources/ui/pages/network.ui:51 #: data/resources/ui/pages/npu.ui:68 msgid "Properties" msgstr "Propriedades" #: data/resources/ui/dialogs/app_dialog.ui:180 msgid "ID" msgstr "ID" #: data/resources/ui/dialogs/app_dialog.ui:190 #: data/resources/ui/dialogs/process_dialog.ui:195 msgid "Running Since" msgstr "Em execução desde" #: data/resources/ui/dialogs/app_dialog.ui:198 msgid "Running Processes" msgstr "Processos em Execução" #: data/resources/ui/dialogs/app_dialog.ui:207 #: data/resources/ui/dialogs/process_dialog.ui:231 msgid "Containerized" msgstr "Em Contêiner" #: data/resources/ui/dialogs/process_dialog.ui:7 msgid "Process Information" msgstr "Informação do Processo" #: data/resources/ui/dialogs/process_dialog.ui:154 #: data/resources/ui/dialogs/settings_dialog.ui:270 #: src/ui/pages/processes/mod.rs:1710 msgid "Total CPU Time" msgstr "Tempo Total de CPU" #: data/resources/ui/dialogs/process_dialog.ui:163 #: data/resources/ui/dialogs/settings_dialog.ui:275 #: src/ui/pages/processes/mod.rs:1769 msgid "User CPU Time" msgstr "Tempo de CPU do Usuário" #: data/resources/ui/dialogs/process_dialog.ui:172 #: data/resources/ui/dialogs/settings_dialog.ui:280 #: src/ui/pages/processes/mod.rs:1828 msgid "System CPU Time" msgstr "Tempo de CPU do Sistema" #: data/resources/ui/dialogs/process_dialog.ui:186 #: data/resources/ui/dialogs/settings_dialog.ui:210 #: src/ui/pages/processes/mod.rs:972 msgid "Process ID" msgstr "ID do Processo" #: data/resources/ui/dialogs/process_dialog.ui:204 msgid "Commandline" msgstr "Linha de Comando" #: data/resources/ui/dialogs/process_dialog.ui:213 #: data/resources/ui/dialogs/settings_dialog.ui:215 #: src/ui/pages/processes/mod.rs:1025 msgid "User" msgstr "Usuário" #: data/resources/ui/dialogs/process_dialog.ui:222 msgid "Control Group" msgstr "Grupo de Controle" #: data/resources/ui/dialogs/process_options_dialog.ui:7 #: data/resources/ui/dialogs/process_options_dialog.ui:69 msgid "Process Options" msgstr "Opções do Processo" #: data/resources/ui/dialogs/process_options_dialog.ui:29 msgid "Apply" msgstr "Aplicar" #: data/resources/ui/dialogs/process_options_dialog.ui:72 msgid "Niceness" msgstr "Niceness" #: data/resources/ui/dialogs/process_options_dialog.ui:73 msgid "" "The priority of a process is given by its niceness. A lower niceness value " "correspond to a higher priority." msgstr "" "A prioridade de um processo é definida por seu valor de niceness. Um valor " "inferior de niceness corresponde a uma prioridade mais elevada." #: data/resources/ui/dialogs/process_options_dialog.ui:87 #: data/resources/ui/dialogs/settings_dialog.ui:285 #: src/ui/pages/processes/mod.rs:1887 msgid "Priority" msgstr "Prioridade" #: data/resources/ui/dialogs/process_options_dialog.ui:91 msgctxt "process priority" msgid "Very High" msgstr "Muito Alta" #: data/resources/ui/dialogs/process_options_dialog.ui:92 msgctxt "process priority" msgid "High" msgstr "Alta" #: data/resources/ui/dialogs/process_options_dialog.ui:93 msgctxt "process priority" msgid "Normal" msgstr "Normal" #: data/resources/ui/dialogs/process_options_dialog.ui:94 msgctxt "process priority" msgid "Low" msgstr "Baixa" #: data/resources/ui/dialogs/process_options_dialog.ui:95 msgctxt "process priority" msgid "Very Low" msgstr "Muito Baixa" #: data/resources/ui/dialogs/process_options_dialog.ui:103 msgid "Processor Affinity" msgstr "Afinidade de Processador" #: data/resources/ui/dialogs/process_options_dialog.ui:108 msgid "Toggle All" msgstr "Ativar Todos" #: data/resources/ui/dialogs/process_options_dialog.ui:111 msgid "Select which processor cores the process is allowed to run on" msgstr "Selecione em quais núcleos do processador o processo pode rodar" #: data/resources/ui/dialogs/settings_dialog.ui:7 msgid "General" msgstr "Geral" #: data/resources/ui/dialogs/settings_dialog.ui:10 msgid "Units" msgstr "Unidades" #: data/resources/ui/dialogs/settings_dialog.ui:13 msgid "Data Unit Prefix" msgstr "Prefixo de Unidade dos Dados" #: data/resources/ui/dialogs/settings_dialog.ui:17 msgid "Decimal" msgstr "Decimal" #: data/resources/ui/dialogs/settings_dialog.ui:18 msgid "Binary" msgstr "Binário" #: data/resources/ui/dialogs/settings_dialog.ui:26 msgid "Show Network Speeds in Bits per Second" msgstr "Mostrar Velocidade de Redes em Bits por Segundo" #: data/resources/ui/dialogs/settings_dialog.ui:31 msgid "Temperature Unit" msgstr "Unidade de Temperatura" #: data/resources/ui/dialogs/settings_dialog.ui:35 msgid "Celsius" msgstr "Celsius" #: data/resources/ui/dialogs/settings_dialog.ui:36 msgid "Kelvin" msgstr "Kelvin" #: data/resources/ui/dialogs/settings_dialog.ui:37 msgid "Fahrenheit" msgstr "Fahrenheit" #: data/resources/ui/dialogs/settings_dialog.ui:47 msgid "User Interface" msgstr "Interface de Usuário" #: data/resources/ui/dialogs/settings_dialog.ui:50 msgid "Refresh Speed" msgstr "Taxa de Atualização" #: data/resources/ui/dialogs/settings_dialog.ui:51 msgid "Higher refresh speeds can lead to higher processor usage" msgstr "" "Velocidades de atualização mais altas podem levar a maior uso de processador" #: data/resources/ui/dialogs/settings_dialog.ui:55 msgctxt "UI refresh speed" msgid "Very Slow" msgstr "Muito Lenta" #: data/resources/ui/dialogs/settings_dialog.ui:56 msgctxt "UI refresh speed" msgid "Slow" msgstr "Lenta" #: data/resources/ui/dialogs/settings_dialog.ui:57 msgctxt "UI refresh speed" msgid "Normal" msgstr "Normal" #: data/resources/ui/dialogs/settings_dialog.ui:58 msgctxt "UI refresh speed" msgid "Fast" msgstr "Rápida" #: data/resources/ui/dialogs/settings_dialog.ui:59 msgctxt "UI refresh speed" msgid "Very Fast" msgstr "Muito Rápida" #: data/resources/ui/dialogs/settings_dialog.ui:67 msgid "Show Graph Grids" msgstr "Mostrar Grades de Gráficos" #: data/resources/ui/dialogs/settings_dialog.ui:72 msgid "Graph Data Points" msgstr "Pontos de Dados dos Gráficos" #: data/resources/ui/dialogs/settings_dialog.ui:86 msgid "Show Usage Details in Sidebar" msgstr "Mostrar Detalhes de Uso na Barra Lateral" #: data/resources/ui/dialogs/settings_dialog.ui:87 msgid "If enabled, the usage along with other information will be displayed" msgstr "Se ativado, o uso será mostrado, junto com outras informações" #: data/resources/ui/dialogs/settings_dialog.ui:92 msgid "Show Device Descriptions in Sidebar" msgstr "Mostrar Descrição do Dispositivo na Barra Lateral" #: data/resources/ui/dialogs/settings_dialog.ui:93 msgid "" "If enabled, a device identifier like its name or device type will be " "displayed" msgstr "" "Se ativado, um identificador de dispositivo será mostrado, como seu nome ou " "tipo de dispositivo" #: data/resources/ui/dialogs/settings_dialog.ui:98 msgid "Sidebar Meter Type" msgstr "Tipo de Medidor da Barra Lateral" #: data/resources/ui/dialogs/settings_dialog.ui:102 msgid "Bar" msgstr "Barra" #: data/resources/ui/dialogs/settings_dialog.ui:103 msgid "Graph" msgstr "Gráfico" #: data/resources/ui/dialogs/settings_dialog.ui:111 msgid "Normalize Processor Usage" msgstr "Normalizar Uso de Processador" #: data/resources/ui/dialogs/settings_dialog.ui:112 msgid "" "If enabled, the total usage of all cores will be divided by the amount of " "cores" msgstr "" "Se ativado, o uso total de todos os núcleos será dividido pelo número de " "núcleos" #: data/resources/ui/dialogs/settings_dialog.ui:122 #: data/resources/ui/window.ui:65 data/resources/ui/window.ui:72 #: src/ui/pages/applications/mod.rs:131 msgid "Apps" msgstr "Aplicativos" #: data/resources/ui/dialogs/settings_dialog.ui:125 #: data/resources/ui/dialogs/settings_dialog.ui:207 msgid "Information Columns" msgstr "Colunas de Informação" #: data/resources/ui/dialogs/settings_dialog.ui:183 #: data/resources/ui/dialogs/settings_dialog.ui:295 #: src/ui/pages/applications/mod.rs:1479 src/ui/pages/processes/mod.rs:2013 msgid "Combined Memory" msgstr "Memória combinada" #: data/resources/ui/dialogs/settings_dialog.ui:193 #: data/resources/ui/window.ui:105 data/resources/ui/window.ui:112 #: src/ui/pages/processes/mod.rs:175 msgid "Processes" msgstr "Processos" #: data/resources/ui/dialogs/settings_dialog.ui:196 #: data/resources/ui/pages/cpu.ui:22 data/resources/ui/pages/processes.ui:56 msgid "Options" msgstr "Opções" #: data/resources/ui/dialogs/settings_dialog.ui:199 msgid "Show Niceness Values" msgstr "Mostrar Valores de Niceness" #: data/resources/ui/dialogs/settings_dialog.ui:200 msgid "" "Display priorities as niceness to allow for more fine-grained adjustments" msgstr "" "Mostrar prioridades como valores de niceness, para permitir ajustes mais " "finos" #: data/resources/ui/dialogs/settings_dialog.ui:305 msgid "Devices" msgstr "Dispositivos" #: data/resources/ui/dialogs/settings_dialog.ui:308 msgid "Drives" msgstr "Unidades" #: data/resources/ui/dialogs/settings_dialog.ui:311 msgid "Show Virtual Drives" msgstr "Mostrar Unidades Virtuais" #: data/resources/ui/dialogs/settings_dialog.ui:312 msgid "Virtual drives are for example ZFS volumes or mapped devices" msgstr "" "Unidades virtuais são, por exemplo, volumes ZFS ou dispositivos mapeados" #: data/resources/ui/dialogs/settings_dialog.ui:322 msgid "Show Virtual Network Interfaces" msgstr "Mostrar Interfaces de Rede Virtuais" #: data/resources/ui/dialogs/settings_dialog.ui:323 msgid "Virtual network interfaces are for example bridges or VPN tunnels" msgstr "Interfaces de rede virtuais são, por exemplo, pontes ou túneis VPN" #: data/resources/ui/pages/applications.ui:6 #: data/resources/ui/pages/applications.ui:26 #: src/ui/pages/applications/mod.rs:1563 msgid "Kill App" msgstr "Matar Aplicativo" #: data/resources/ui/pages/applications.ui:10 #: data/resources/ui/pages/applications.ui:30 #: src/ui/pages/applications/mod.rs:1562 msgid "Halt App" msgstr "Interromper Aplicativo" #: data/resources/ui/pages/applications.ui:14 #: data/resources/ui/pages/applications.ui:34 #: src/ui/pages/applications/mod.rs:1564 msgid "Continue App" msgstr "Continuar Aplicativo" #: data/resources/ui/pages/applications.ui:22 #: data/resources/ui/pages/applications.ui:98 #: src/ui/pages/applications/mod.rs:1561 msgid "End App" msgstr "Encerrar Aplicativo" #: data/resources/ui/pages/applications.ui:40 #: data/resources/ui/pages/processes.ui:62 msgid "Information" msgstr "Informações" #: data/resources/ui/pages/applications.ui:57 msgid "Search applications" msgstr "Pesquisar aplicativos" #: data/resources/ui/pages/applications.ui:87 #: data/resources/ui/pages/applications.ui:89 msgid "Show App Information" msgstr "Mostrar informações do aplicativo" #: data/resources/ui/pages/battery.ui:36 msgid "Battery Health" msgstr "Saúde da Bateria" #: data/resources/ui/pages/battery.ui:45 msgid "Design Capacity" msgstr "Capacidade Projetada" #: data/resources/ui/pages/battery.ui:54 msgid "Charge Cycles" msgstr "Ciclos de Carga" #: data/resources/ui/pages/battery.ui:63 msgid "Technology" msgstr "Tecnologia" #: data/resources/ui/pages/battery.ui:72 data/resources/ui/pages/gpu.ui:81 #: data/resources/ui/pages/network.ui:58 data/resources/ui/pages/npu.ui:75 msgid "Manufacturer" msgstr "Fabricante" #: data/resources/ui/pages/battery.ui:81 msgid "Model Name" msgstr "Nome do Modelo" #: data/resources/ui/pages/battery.ui:90 data/resources/ui/pages/drive.ui:66 msgid "Device" msgstr "Dispositivo" #: data/resources/ui/pages/cpu.ui:26 msgid "Show Usages of Logical CPUs" msgstr "Mostrar Uso das CPUs Lógicas" #: data/resources/ui/pages/cpu.ui:75 data/resources/ui/pages/gpu.ui:66 #: data/resources/ui/pages/npu.ui:60 msgid "Sensors" msgstr "Sensores" #: data/resources/ui/pages/cpu.ui:90 msgid "Max Frequency" msgstr "Frequência Máxima" #: data/resources/ui/pages/cpu.ui:99 msgid "Logical Cores" msgstr "Núcleos Lógicos" #: data/resources/ui/pages/cpu.ui:108 msgid "Physical Cores" msgstr "Núcleos Físicos" #: data/resources/ui/pages/cpu.ui:117 msgid "Sockets" msgstr "Soquetes" #: data/resources/ui/pages/cpu.ui:126 msgid "Uptime" msgstr "Tempo ativo" #: data/resources/ui/pages/cpu.ui:135 msgid "Virtualization" msgstr "Virtualização" #: data/resources/ui/pages/cpu.ui:144 msgid "Architecture" msgstr "Arquitetura" #: data/resources/ui/pages/drive.ui:38 msgid "Total Read" msgstr "Total Lido" #: data/resources/ui/pages/drive.ui:47 msgid "Total Written" msgstr "Total Gravado" #: data/resources/ui/pages/drive.ui:57 data/resources/ui/pages/memory.ui:72 msgid "Type" msgstr "Tipo" #: data/resources/ui/pages/drive.ui:75 msgid "Capacity" msgstr "Capacidade" #: data/resources/ui/pages/drive.ui:84 msgid "Writable" msgstr "Gravável" #: data/resources/ui/pages/drive.ui:93 msgid "Removable" msgstr "Removível" #. Translators: "Link" refers to something like "PCIe 4.0 ×16" #: data/resources/ui/pages/drive.ui:102 data/resources/ui/pages/gpu.ui:113 #: data/resources/ui/pages/network.ui:103 data/resources/ui/pages/npu.ui:107 msgid "Link" msgstr "Link" #: data/resources/ui/pages/gpu.ui:37 msgid "GPU Frequency" msgstr "Frequência da GPU" #: data/resources/ui/pages/gpu.ui:50 msgid "Video Memory Frequency" msgstr "Frequência da Memória de Vídeo" #: data/resources/ui/pages/gpu.ui:55 data/resources/ui/pages/npu.ui:49 #: src/ui/pages/battery.rs:217 msgid "Power Usage" msgstr "Consumo de Energia" #: data/resources/ui/pages/gpu.ui:90 data/resources/ui/pages/npu.ui:84 msgid "PCI Slot" msgstr "Soquete PCI" #: data/resources/ui/pages/gpu.ui:99 data/resources/ui/pages/network.ui:67 #: data/resources/ui/pages/npu.ui:93 msgid "Driver Used" msgstr "Controlador Usado" #: data/resources/ui/pages/gpu.ui:108 data/resources/ui/pages/npu.ui:102 msgid "Max Power Cap" msgstr "Limite Máximo de Energia" #: data/resources/ui/pages/memory.ui:9 msgid "You need to authenticate to see memory properties" msgstr "Autenticação necessária para ver as propriedades de memória" #: data/resources/ui/pages/memory.ui:10 msgid "Authenticate" msgstr "Autenticar" #: data/resources/ui/pages/memory.ui:45 msgid "Slots Used" msgstr "Soquetes Utilizados" #: data/resources/ui/pages/memory.ui:54 msgid "Speed" msgstr "Velocidade" #: data/resources/ui/pages/memory.ui:63 msgid "Form Factor" msgstr "Fator de Forma" #: data/resources/ui/pages/memory.ui:81 msgid "Type Detail" msgstr "Detalhe do Tipo" #: data/resources/ui/pages/network.ui:35 msgid "Total Received" msgstr "Total Recebido" #: data/resources/ui/pages/network.ui:44 msgid "Total Sent" msgstr "Total Enviado" #: data/resources/ui/pages/network.ui:76 msgid "Interface" msgstr "Interface" #: data/resources/ui/pages/network.ui:85 msgid "Hardware Address" msgstr "Endereço Físico" #: data/resources/ui/pages/network.ui:94 msgid "Network Name" msgstr "Nome da rede" #: data/resources/ui/pages/network.ui:112 msgid "Link Speed" msgstr "Velocidade do link" #: data/resources/ui/pages/npu.ui:31 msgid "NPU Frequency" msgstr "Frequência da NPU" #: data/resources/ui/pages/npu.ui:44 msgid "Memory Frequency" msgstr "Frequência da Memória" #: data/resources/ui/pages/processes.ui:6 #: data/resources/ui/pages/processes.ui:42 src/ui/pages/processes/mod.rs:2126 msgid "Kill Process" msgstr "Matar Processo" #: data/resources/ui/pages/processes.ui:10 #: data/resources/ui/pages/processes.ui:46 src/ui/pages/processes/mod.rs:2125 msgid "Halt Process" msgstr "Interromper Processo" #: data/resources/ui/pages/processes.ui:14 #: data/resources/ui/pages/processes.ui:50 src/ui/pages/processes/mod.rs:2127 msgid "Continue Process" msgstr "Continuar Processo" #: data/resources/ui/pages/processes.ui:22 #: data/resources/ui/pages/processes.ui:74 msgid "Kill Processes" msgstr "Matar Processos" #: data/resources/ui/pages/processes.ui:26 #: data/resources/ui/pages/processes.ui:78 msgid "Halt Processes" msgstr "Interromper Processos" #: data/resources/ui/pages/processes.ui:30 #: data/resources/ui/pages/processes.ui:82 msgid "Continue Processes" msgstr "Continuar Processos" #: data/resources/ui/pages/processes.ui:38 #: data/resources/ui/pages/processes.ui:157 src/ui/pages/processes/mod.rs:523 #: src/ui/pages/processes/mod.rs:2124 msgid "End Process" msgstr "Encerrar Processo" #: data/resources/ui/pages/processes.ui:70 src/ui/pages/processes/mod.rs:527 msgid "End Processes" msgstr "Encerrar Processos" #: data/resources/ui/pages/processes.ui:103 msgid "Search processes" msgstr "Pesquisar processos" #: data/resources/ui/pages/processes.ui:133 #: data/resources/ui/pages/processes.ui:135 msgid "Show Process Options" msgstr "Mostrar opções do processo" #: data/resources/ui/pages/processes.ui:146 #: data/resources/ui/pages/processes.ui:148 msgid "Show Process Information" msgstr "Mostrar informações do processo" #: data/resources/ui/shortcuts.ui:6 msgctxt "shortcut window" msgid "General" msgstr "Geral" #: data/resources/ui/shortcuts.ui:9 msgctxt "shortcut window" msgid "Preferences" msgstr "Preferências" #: data/resources/ui/shortcuts.ui:15 msgctxt "shortcut window" msgid "Show Shortcuts" msgstr "Mostrar Atalhos" #: data/resources/ui/shortcuts.ui:21 msgctxt "shortcut window" msgid "Quit" msgstr "Sair" #: data/resources/ui/shortcuts.ui:29 msgctxt "shortcut window" msgid "Apps/Processes" msgstr "Aplicativos/Processos" #: data/resources/ui/shortcuts.ui:32 msgctxt "shortcut window" msgid "Toggle Search Field" msgstr "Mostrar/Ocultar Campo de Pesquisa" #: data/resources/ui/shortcuts.ui:38 msgctxt "shortcut window" msgid "End App/Process" msgstr "Encerrar Aplicativo/Processo" #: data/resources/ui/shortcuts.ui:44 msgctxt "shortcut window" msgid "Kill App/Process" msgstr "Matar Aplicativo/Processo" #: data/resources/ui/shortcuts.ui:50 msgctxt "shortcut window" msgid "Halt App/Process" msgstr "Interromper Aplicativo/Processo" #: data/resources/ui/shortcuts.ui:56 msgctxt "shortcut window" msgid "Continue App/Process" msgstr "Continuar Aplicativo/Processo" #: data/resources/ui/shortcuts.ui:62 msgctxt "shortcut window" msgid "Show Information for App/Process" msgstr "Mostrar Informações sobre o Aplicativo/Processo" #: data/resources/ui/shortcuts.ui:68 msgctxt "shortcut window" msgid "Show Process Options" msgstr "Mostrar opções do processo" #: data/resources/ui/window.ui:6 msgid "Preferences" msgstr "Preferências" #: data/resources/ui/window.ui:10 msgid "Keyboard Shortcuts" msgstr "Atalhos de teclado" #: data/resources/ui/window.ui:14 msgid "About Resources" msgstr "Sobre o Recursos" #: data/resources/ui/window.ui:88 data/resources/ui/window.ui:128 msgid "Search" msgstr "Pesquisar" #: data/resources/ui/window.ui:90 data/resources/ui/window.ui:130 msgid "Toggle search field" msgstr "Mostrar/Ocultar campo de pesquisa" #: src/application.rs:274 msgid "The Nalux Team" msgstr "Equipe Nalux" #: src/application.rs:282 msgid "Report Issues" msgstr "Reportar Problemas" #. Translator credits. Replace "translator-credits" with your name/username, and optionally an email or URL. #. One name per line, please do not remove previous names. #: src/application.rs:288 msgid "translator-credits" msgstr "" "Victor L. Pavan , 2023-2024.\n" "Filipe Motta , 2024.\n" "Juliano de Souza Camargo " #: src/application.rs:289 msgid "Icon by" msgstr "Ícone por" #: src/ui/dialogs/app_dialog.rs:155 src/ui/dialogs/process_dialog.rs:133 #: src/ui/dialogs/process_dialog.rs:137 src/ui/dialogs/process_dialog.rs:146 #: src/ui/dialogs/process_dialog.rs:148 src/ui/dialogs/process_dialog.rs:171 #: src/ui/dialogs/process_dialog.rs:178 src/ui/dialogs/process_dialog.rs:185 #: src/ui/dialogs/process_dialog.rs:192 src/ui/pages/applications/mod.rs:948 #: src/ui/pages/applications/mod.rs:1074 src/ui/pages/battery.rs:205 #: src/ui/pages/battery.rs:225 src/ui/pages/battery.rs:231 #: src/ui/pages/battery.rs:234 src/ui/pages/battery.rs:265 #: src/ui/pages/battery.rs:289 src/ui/pages/battery.rs:291 #: src/ui/pages/battery.rs:301 src/ui/pages/cpu.rs:243 src/ui/pages/cpu.rs:258 #: src/ui/pages/cpu.rs:278 src/ui/pages/cpu.rs:284 src/ui/pages/cpu.rs:290 #: src/ui/pages/cpu.rs:296 src/ui/pages/cpu.rs:300 src/ui/pages/cpu.rs:303 #: src/ui/pages/cpu.rs:341 src/ui/pages/cpu.rs:448 src/ui/pages/drive.rs:319 #: src/ui/pages/drive.rs:350 src/ui/pages/drive.rs:352 #: src/ui/pages/drive.rs:381 src/ui/pages/drive.rs:383 #: src/ui/pages/drive.rs:399 src/ui/pages/drive.rs:400 #: src/ui/pages/drive.rs:407 src/ui/pages/drive.rs:417 #: src/ui/pages/drive.rs:427 src/ui/pages/drive.rs:433 src/ui/pages/gpu.rs:245 #: src/ui/pages/gpu.rs:252 src/ui/pages/gpu.rs:297 src/ui/pages/gpu.rs:322 #: src/ui/pages/gpu.rs:325 src/ui/pages/gpu.rs:336 src/ui/pages/gpu.rs:377 #: src/ui/pages/gpu.rs:384 src/ui/pages/gpu.rs:396 src/ui/pages/gpu.rs:403 #: src/ui/pages/gpu.rs:407 src/ui/pages/gpu.rs:437 src/ui/pages/gpu.rs:443 #: src/ui/pages/memory.rs:227 src/ui/pages/memory.rs:228 #: src/ui/pages/memory.rs:232 src/ui/pages/memory.rs:233 #: src/ui/pages/memory.rs:237 src/ui/pages/memory.rs:238 #: src/ui/pages/memory.rs:266 src/ui/pages/memory.rs:327 #: src/ui/pages/network.rs:252 src/ui/pages/network.rs:259 #: src/ui/pages/network.rs:266 src/ui/pages/network.rs:272 #: src/ui/pages/network.rs:275 src/ui/pages/network.rs:285 #: src/ui/pages/network.rs:292 src/ui/pages/network.rs:302 #: src/ui/pages/network.rs:370 src/ui/pages/network.rs:373 #: src/ui/pages/network.rs:375 src/ui/pages/network.rs:404 #: src/ui/pages/network.rs:407 src/ui/pages/network.rs:409 #: src/ui/pages/network.rs:417 src/ui/pages/network.rs:424 #: src/ui/pages/network.rs:434 src/ui/pages/processes/mod.rs:1224 #: src/ui/pages/processes/mod.rs:1291 src/ui/pages/processes/mod.rs:1358 #: src/ui/pages/processes/mod.rs:1425 src/ui/pages/processes/mod.rs:1911 #: src/ui/pages/processes/mod.rs:1913 src/utils/battery.rs:152 #: src/utils/drive.rs:137 src/utils/gpu/mod.rs:279 src/utils/gpu/mod.rs:291 #: src/utils/link/mod.rs:61 src/utils/npu/mod.rs:244 src/utils/npu/mod.rs:250 msgid "N/A" msgstr "N/D" #: src/ui/dialogs/process_options_dialog.rs:147 src/ui/pages/cpu.rs:257 #: src/ui/pages/cpu.rs:417 src/ui/pages/cpu.rs:421 msgid "CPU {}" msgstr "CPU {}" #: src/ui/pages/applications/application_entry.rs:190 src/ui/pages/drive.rs:414 #: src/ui/pages/drive.rs:424 src/ui/pages/processes/process_entry.rs:211 msgid "No" msgstr "Não" #: src/ui/pages/applications/application_entry.rs:191 #: src/ui/pages/processes/process_entry.rs:212 msgid "Yes (Flatpak)" msgstr "Sim (Flatpak)" #: src/ui/pages/applications/application_entry.rs:192 #: src/ui/pages/processes/process_entry.rs:213 msgid "Yes (Snap)" msgstr "Sim (Snap)" #: src/ui/pages/applications/mod.rs:660 msgid "Running Apps: {}" msgstr "Aplicativos em Execução: {}" #: src/ui/pages/applications/mod.rs:700 src/ui/pages/processes/mod.rs:862 msgid "Cancel" msgstr "Cancelar" #: src/ui/pages/applications/mod.rs:746 msgid "App" msgstr "Aplicativo" #: src/ui/pages/applications/mod.rs:1539 src/ui/pages/processes/mod.rs:2073 msgid "End {}?" msgstr "Encerrar {}?" #: src/ui/pages/applications/mod.rs:1540 src/ui/pages/processes/mod.rs:2074 msgid "Halt {}?" msgstr "Interromper {}?" #: src/ui/pages/applications/mod.rs:1541 src/ui/pages/processes/mod.rs:2075 msgid "Kill {}?" msgstr "Matar {}?" #: src/ui/pages/applications/mod.rs:1542 src/ui/pages/processes/mod.rs:2076 msgid "Continue {}?" msgstr "Continuar {}?" #: src/ui/pages/applications/mod.rs:1548 src/ui/pages/processes/mod.rs:2111 msgid "Unsaved work might be lost." msgstr "Trabalhos não salvos poderão ser perdidos." #: src/ui/pages/applications/mod.rs:1550 msgid "" "Halting an app can come with serious risks such as losing data and security " "implications. Use with caution." msgstr "" "Interromper um aplicativo pode trazer sérios riscos, como perda de dados e " "implicações de segurança. Use esta opção com cautela." #: src/ui/pages/applications/mod.rs:1553 msgid "" "Killing an app can come with serious risks such as losing data and security " "implications. Use with caution." msgstr "" "Matar um aplicativo pode trazer sérios riscos, como perda de dados e " "implicações de segurança. Use esta opção com cautela." #: src/ui/pages/battery.rs:102 src/utils/battery.rs:258 msgid "Battery" msgstr "Bateria" #: src/ui/pages/battery.rs:210 msgid "Battery Charge" msgstr "Carga da Bateria" #: src/ui/pages/battery.rs:279 src/ui/pages/cpu.rs:438 #: src/ui/pages/drive.rs:344 src/ui/pages/drive.rs:375 src/ui/pages/gpu.rs:429 #: src/ui/pages/network.rs:362 src/ui/pages/network.rs:396 msgid "Highest:" msgstr "Máximo:" #: src/ui/pages/cpu.rs:242 src/ui/pages/gpu.rs:212 msgid "Total Usage" msgstr "Uso Total" #: src/ui/pages/cpu.rs:271 src/ui/pages/gpu.rs:239 msgid "Temperature" msgstr "Temperatura" #: src/ui/pages/drive.rs:126 msgid "Drive" msgstr "Unidade" #: src/ui/pages/drive.rs:236 msgid "Drive Activity" msgstr "Atividade da Unidade" #: src/ui/pages/drive.rs:243 msgid "Read Speed" msgstr "Velocidade de Leitura" #: src/ui/pages/drive.rs:247 msgid "Write Speed" msgstr "Velocidade de Gravação" #: src/ui/pages/drive.rs:412 src/ui/pages/drive.rs:422 msgid "Yes" msgstr "Sim" #. Translators: This is an abbreviation for "Read" and "Write". This is displayed in the sidebar so your #. translation should preferably be quite short or an abbreviation #: src/ui/pages/drive.rs:440 msgid "R: {} · W: {}" msgstr "L: {} · G: {}" #: src/ui/pages/gpu.rs:220 msgid "Video Encoder/Decoder Usage" msgstr "Uso de Codificador/Decodificador de Vídeo" #: src/ui/pages/gpu.rs:226 msgid "Video Encoder Usage" msgstr "Uso de Codificador de Vídeo" #: src/ui/pages/gpu.rs:231 msgid "Video Decoder Usage" msgstr "Uso de Decodificador de Vídeo" #: src/ui/pages/gpu.rs:236 msgid "Video Memory Usage" msgstr "Uso de Memória de Vídeo" #. Translators: This will be displayed in the sidebar, please try to keep your translation as short as (or even #. shorter than) 'Memory' #: src/ui/pages/gpu.rs:415 msgid "Memory: {}" msgstr "Memória: {}" #: src/ui/pages/memory.rs:262 msgid "{} of {}" msgstr "{} de {}" #: src/ui/pages/memory.rs:265 msgid "{} MT/s" msgstr "{} MT/s" #. Translators: This will be displayed in the sidebar, so your translation for "Swap" should #. preferably be quite short or an abbreviation #: src/ui/pages/memory.rs:346 msgid "{} / {} · Swap: {} %" msgstr "{} / {} · Swap: {} %" #: src/ui/pages/network.rs:127 src/utils/network.rs:135 msgid "Network Interface" msgstr "Interface de Rede" #: src/ui/pages/network.rs:241 msgid "Receiving" msgstr "Recebendo" #: src/ui/pages/network.rs:245 msgid "Sending" msgstr "Enviando" #. Translators: This is an abbreviation for "Receive" and "Send". This is displayed in the sidebar so #. your translation should preferably be quite short or an abbreviation #: src/ui/pages/network.rs:445 msgid "R: {} · S: {}" msgstr "R: {} · E: {}" #: src/ui/pages/processes/mod.rs:813 msgid "Running Processes: {}" msgstr "Processos em Execução: {}" #: src/ui/pages/processes/mod.rs:911 msgid "Process" msgstr "Processo" #: src/ui/pages/processes/mod.rs:2083 msgid "End process?" msgid_plural "End {} processes?" msgstr[0] "Encerrar processo?" msgstr[1] "Encerrar {} processos?" #: src/ui/pages/processes/mod.rs:2089 msgid "Halt process?" msgid_plural "Halt {} processes?" msgstr[0] "Interromper processo?" msgstr[1] "Interromper {} processos?" #: src/ui/pages/processes/mod.rs:2095 src/ui/pages/processes/mod.rs:2101 msgid "Kill process?" msgid_plural "Kill {} processes?" msgstr[0] "Matar processo?" msgstr[1] "Matar {} processos?" #: src/ui/pages/processes/mod.rs:2113 msgid "" "Halting a process can come with serious risks such as losing data and " "security implications. Use with caution." msgstr "" "Interromper um aplicativo pode trazer sérios riscos, como perda de dados e " "implicações de segurança. Use esta opção com cautela." #: src/ui/pages/processes/mod.rs:2116 msgid "" "Killing a process can come with serious risks such as losing data and " "security implications. Use with caution." msgstr "" "Matar um aplicativo pode trazer sérios riscos, como perda de dados e " "implicações de segurança. Use esta opção com cautela." #: src/ui/window.rs:466 msgid "GPU {}" msgstr "GPU {}" #: src/ui/window.rs:496 msgid "NPU {}" msgstr "NPU {}" #: src/ui/window.rs:498 msgid "NPU" msgstr "NPU" #: src/ui/window.rs:1174 msgid "Successfully adjusted {}" msgstr "{} ajustado com sucesso" #: src/ui/window.rs:1175 msgid "There was a problem adjusting {}" msgstr "Houve um problema ao ajustar {}" #: src/ui/window.rs:1257 msgid "Successfully ended {}" msgstr "{} encerrado com sucesso" #: src/ui/window.rs:1258 msgid "Successfully halted {}" msgstr "{} interrompido com sucesso" #: src/ui/window.rs:1259 msgid "Successfully killed {}" msgstr "{} morto com sucesso" #: src/ui/window.rs:1260 msgid "Successfully continued {}" msgstr "{} continuado com sucesso" #: src/ui/window.rs:1267 msgid "Successfully ended the process" msgid_plural "Successfully ended {} processes" msgstr[0] "Processo encerrado com sucesso" msgstr[1] "{} processos encerrados com sucesso" #: src/ui/window.rs:1273 msgid "Successfully halted the process" msgid_plural "Successfully halted {} processes" msgstr[0] "Processo interrompido com sucesso" msgstr[1] "{} processos interrompidos com sucesso" #: src/ui/window.rs:1279 msgid "Successfully killed the process" msgid_plural "Successfully killed {} processes" msgstr[0] "Processo morto com sucesso" msgstr[1] "{} processos mortos com sucesso" #: src/ui/window.rs:1285 msgid "Successfully continued the process" msgid_plural "Successfully continued {} processes" msgstr[0] "Processo continuado com sucesso" msgstr[1] "{} processos continuados com sucesso" #: src/ui/window.rs:1296 msgid "There was a problem ending a process" msgid_plural "There were problems ending {} processes" msgstr[0] "Houve um problema ao encerrar um processo" msgstr[1] "Houve problemas ao encerrar {} processos" #: src/ui/window.rs:1302 msgid "There was a problem halting a process" msgid_plural "There were problems halting {} processes" msgstr[0] "Houve um problema ao interromper um processo" msgstr[1] "Houve problemas ao interromper {} processos" #: src/ui/window.rs:1308 msgid "There was a problem killing a process" msgid_plural "There were problems killing {} processes" msgstr[0] "Houve um problema ao matar um processo" msgstr[1] "Houve problemas ao matar {} processos" #: src/ui/window.rs:1314 msgid "There was a problem continuing a process" msgid_plural "There were problems continuing {} processes" msgstr[0] "Houve um problema ao continuar um processo" msgstr[1] "Houve problemas ao continuar {} processos" #: src/ui/window.rs:1324 msgid "There was a problem ending {}" msgstr "Houve um problema ao encerrar {}" #: src/ui/window.rs:1325 msgid "There was a problem halting {}" msgstr "Houve um problema ao interromper {}" #: src/ui/window.rs:1326 msgid "There was a problem killing {}" msgstr "Houve um problema ao matar {}" #: src/ui/window.rs:1327 msgid "There was a problem continuing {}" msgstr "Houve um problema ao continuar {}" #: src/utils/app.rs:222 msgid "System Processes" msgstr "Processos do Sistema" #: src/utils/battery.rs:93 msgid "Charging" msgstr "Carregando" #: src/utils/battery.rs:94 msgid "Discharging" msgstr "Descarregando" #: src/utils/battery.rs:95 msgid "Empty" msgstr "Vazia" #: src/utils/battery.rs:96 msgid "Full" msgstr "Cheia" #: src/utils/battery.rs:97 msgid "Unknown" msgstr "Desconhecido" #: src/utils/battery.rs:143 msgid "Nickel-Metal Hydride" msgstr "Níquel-Hidreto Metálico" #: src/utils/battery.rs:144 msgid "Nickel-Cadmium" msgstr "Níquel-Cádmio" #: src/utils/battery.rs:145 msgid "Nickel-Zinc" msgstr "Níquel-Zinco" #: src/utils/battery.rs:146 msgid "Lead-Acid" msgstr "Chumbo-Ácido" #: src/utils/battery.rs:147 msgid "Lithium-Ion" msgstr "Íon-Lítio" #: src/utils/battery.rs:148 msgid "Lithium Iron Phosphate" msgstr "Lítio-Fosfato de Ferro" #: src/utils/battery.rs:149 msgid "Lithium Polymer" msgstr "Polímero de Lítio" #: src/utils/battery.rs:151 msgid "Rechargeable Alkaline Managanese" msgstr "Recarregável Alcalina de Manganês" #: src/utils/battery.rs:256 msgid "{} Battery" msgstr "Bateria {}" #: src/utils/units.rs:91 msgid "{} K" msgstr "{} K" #: src/utils/units.rs:93 msgid "{} °C" msgstr "{} °C" #: src/utils/units.rs:95 msgid "{} °F" msgstr "{} °F" #: src/utils/units.rs:113 src/utils/units.rs:127 src/utils/units.rs:147 #: src/utils/units.rs:161 msgid "{} B" msgstr "{} B" #: src/utils/units.rs:114 src/utils/units.rs:128 msgid "{} kB" msgstr "{} kB" #: src/utils/units.rs:115 src/utils/units.rs:129 msgid "{} MB" msgstr "{} MB" #: src/utils/units.rs:116 src/utils/units.rs:130 msgid "{} GB" msgstr "{} GB" #: src/utils/units.rs:117 src/utils/units.rs:131 msgid "{} TB" msgstr "{} TB" #: src/utils/units.rs:118 src/utils/units.rs:132 msgid "{} PB" msgstr "{} PB" #: src/utils/units.rs:119 src/utils/units.rs:133 msgid "{} EB" msgstr "{} EB" #: src/utils/units.rs:120 src/utils/units.rs:134 msgid "{} ZB" msgstr "{} ZB" #: src/utils/units.rs:121 src/utils/units.rs:135 msgid "{} YB" msgstr "{} YB" #: src/utils/units.rs:122 src/utils/units.rs:136 msgid "{} RB" msgstr "{} RB" #: src/utils/units.rs:123 src/utils/units.rs:137 msgid "{} QB" msgstr "{} QB" #: src/utils/units.rs:148 src/utils/units.rs:162 msgid "{} KiB" msgstr "{} KiB" #: src/utils/units.rs:149 src/utils/units.rs:163 msgid "{} MiB" msgstr "{} MiB" #: src/utils/units.rs:150 src/utils/units.rs:164 msgid "{} GiB" msgstr "{} GiB" #: src/utils/units.rs:151 src/utils/units.rs:165 msgid "{} TiB" msgstr "{} TiB" #: src/utils/units.rs:152 src/utils/units.rs:166 msgid "{} PiB" msgstr "{} PiB" #: src/utils/units.rs:153 src/utils/units.rs:167 msgid "{} EiB" msgstr "{} EiB" #: src/utils/units.rs:154 src/utils/units.rs:168 msgid "{} ZiB" msgstr "{} ZiB" #: src/utils/units.rs:155 src/utils/units.rs:169 msgid "{} YiB" msgstr "{} YiB" #: src/utils/units.rs:156 src/utils/units.rs:170 msgid "{} RiB" msgstr "{} RiB" #: src/utils/units.rs:157 src/utils/units.rs:171 msgid "{} QiB" msgstr "{} QiB" #: src/utils/units.rs:198 src/utils/units.rs:215 msgid "{} B/s" msgstr "{} B/s" #: src/utils/units.rs:199 msgid "{} kB/s" msgstr "{} kB/s" #: src/utils/units.rs:200 msgid "{} MB/s" msgstr "{} MB/s" #: src/utils/units.rs:201 msgid "{} GB/s" msgstr "{} GB/s" #: src/utils/units.rs:202 msgid "{} TB/s" msgstr "{} TB/s" #: src/utils/units.rs:203 msgid "{} PB/s" msgstr "{} PB/s" #: src/utils/units.rs:204 msgid "{} EB/s" msgstr "{} EB/s" #: src/utils/units.rs:205 msgid "{} ZB/s" msgstr "{} ZB/s" #: src/utils/units.rs:206 msgid "{} YB/s" msgstr "{} YB/s" #: src/utils/units.rs:207 msgid "{} RB/s" msgstr "{} RB/s" #: src/utils/units.rs:208 msgid "{} QB/s" msgstr "{} QB/s" #: src/utils/units.rs:216 msgid "{} KiB/s" msgstr "{} KiB/s" #: src/utils/units.rs:217 msgid "{} MiB/s" msgstr "{} MiB/s" #: src/utils/units.rs:218 msgid "{} GiB/s" msgstr "{} GiB/s" #: src/utils/units.rs:219 msgid "{} TiB/s" msgstr "{} TiB/s" #: src/utils/units.rs:220 msgid "{} PiB/s" msgstr "{} PiB/s" #: src/utils/units.rs:221 msgid "{} EiB/s" msgstr "{} EiB/s" #: src/utils/units.rs:222 msgid "{} ZiB/s" msgstr "{} ZiB/s" #: src/utils/units.rs:223 msgid "{} YiB/s" msgstr "{} YiB/s" #: src/utils/units.rs:224 msgid "{} RiB/s" msgstr "{} RiB/s" #: src/utils/units.rs:225 msgid "{} QiB/s" msgstr "{} QiB/s" #: src/utils/units.rs:239 src/utils/units.rs:256 msgid "{} b/s" msgstr "{} b/s" #: src/utils/units.rs:240 msgid "{} kb/s" msgstr "{} kb/s" #: src/utils/units.rs:241 msgid "{} Mb/s" msgstr "{} Mb/s" #: src/utils/units.rs:242 msgid "{} Gb/s" msgstr "{} Gb/s" #: src/utils/units.rs:243 msgid "{} Tb/s" msgstr "{} Tb/s" #: src/utils/units.rs:244 msgid "{} Pb/s" msgstr "{} Pb/s" #: src/utils/units.rs:245 msgid "{} Eb/s" msgstr "{} Eb/s" #: src/utils/units.rs:246 msgid "{} Zb/s" msgstr "{} Zb/s" #: src/utils/units.rs:247 msgid "{} Yb/s" msgstr "{} Yb/s" #: src/utils/units.rs:248 msgid "{} Rb/s" msgstr "{} Rb/s" #: src/utils/units.rs:249 msgid "{} Qb/s" msgstr "{} Qb/s" #: src/utils/units.rs:257 msgid "{} Kib/s" msgstr "{} Kib/s" #: src/utils/units.rs:258 msgid "{} Mib/s" msgstr "{} Mib/s" #: src/utils/units.rs:259 msgid "{} Gib/s" msgstr "{} Gib/s" #: src/utils/units.rs:260 msgid "{} Tib/s" msgstr "{} Tib/s" #: src/utils/units.rs:261 msgid "{} Pib/s" msgstr "{} Pib/s" #: src/utils/units.rs:262 msgid "{} Eib/s" msgstr "{} Eib/s" #: src/utils/units.rs:263 msgid "{} Zib/s" msgstr "{} Zib/s" #: src/utils/units.rs:264 msgid "{} Yib/s" msgstr "{} Yib/s" #: src/utils/units.rs:265 msgid "{} Rib/s" msgstr "{} Rib/s" #: src/utils/units.rs:266 msgid "{} Qib/s" msgstr "{} Qib/s" #: src/utils/units.rs:273 msgid "{} Hz" msgstr "{} Hz" #: src/utils/units.rs:274 msgid "{} kHz" msgstr "{} kHz" #: src/utils/units.rs:275 msgid "{} MHz" msgstr "{} MHz" #: src/utils/units.rs:276 msgid "{} GHz" msgstr "{} GHz" #: src/utils/units.rs:277 msgid "{} THz" msgstr "{} THz" #: src/utils/units.rs:278 msgid "{} PHz" msgstr "{} PHz" #: src/utils/units.rs:279 msgid "{} EHz" msgstr "{} EHz" #: src/utils/units.rs:280 msgid "{} ZHz" msgstr "{} ZHz" #: src/utils/units.rs:281 msgid "{} YHz" msgstr "{} YHz" #: src/utils/units.rs:282 msgid "{} RHz" msgstr "{} RHz" #: src/utils/units.rs:283 msgid "{} QHz" msgstr "{} QHz" #: src/utils/units.rs:290 msgid "{} W" msgstr "{} W" #: src/utils/units.rs:291 msgid "{} kW" msgstr "{} kW" #: src/utils/units.rs:292 msgid "{} MW" msgstr "{} MW" #: src/utils/units.rs:293 msgid "{} GW" msgstr "{} GW" #: src/utils/units.rs:294 msgid "{} TW" msgstr "{} TW" #: src/utils/units.rs:295 msgid "{} PW" msgstr "{} PW" #: src/utils/units.rs:296 msgid "{} EW" msgstr "{} EW" #: src/utils/units.rs:297 msgid "{} ZW" msgstr "{} ZW" #: src/utils/units.rs:298 msgid "{} YW" msgstr "{} YW" #: src/utils/units.rs:299 msgid "{} RW" msgstr "{} RW" #: src/utils/units.rs:300 msgid "{} QW" msgstr "{} QW" #: src/utils/units.rs:309 src/utils/units.rs:323 msgid "{} Wh" msgstr "{} Wh" #: src/utils/units.rs:310 src/utils/units.rs:324 msgid "{} kWh" msgstr "{} kWh" #: src/utils/units.rs:311 src/utils/units.rs:325 msgid "{} MWh" msgstr "{} MWh" #: src/utils/units.rs:312 src/utils/units.rs:326 msgid "{} GWh" msgstr "{} GWh" #: src/utils/units.rs:313 src/utils/units.rs:327 msgid "{} TWh" msgstr "{} TWh" #: src/utils/units.rs:314 src/utils/units.rs:328 msgid "{} PWh" msgstr "{} PWh" #: src/utils/units.rs:315 src/utils/units.rs:329 msgid "{} EWh" msgstr "{} EWh" #: src/utils/units.rs:316 src/utils/units.rs:330 msgid "{} ZWh" msgstr "{} ZWh" #: src/utils/units.rs:317 src/utils/units.rs:331 msgid "{} YWh" msgstr "{} YWh" #: src/utils/units.rs:318 src/utils/units.rs:332 msgid "{} RWh" msgstr "{} RWh" #: src/utils/units.rs:319 src/utils/units.rs:333 msgid "{} QWh" msgstr "{} QWh" #: src/utils/drive.rs:129 src/utils/drive.rs:208 msgid "CD/DVD/Blu-ray Drive" msgstr "Unidade CD/DVD/Blu-ray" #: src/utils/drive.rs:130 msgid "eMMC Storage" msgstr "Armazenamento eMMC" #: src/utils/drive.rs:131 msgid "Flash Storage" msgstr "Armazenamento Flash" #: src/utils/drive.rs:132 src/utils/drive.rs:209 msgid "Floppy Drive" msgstr "Disquete" #: src/utils/drive.rs:133 msgid "Hard Disk Drive" msgstr "Disco Rígido" #: src/utils/drive.rs:134 msgid "Loop Device" msgstr "Dispositivo de Loop" #: src/utils/drive.rs:135 msgid "Mapped Device" msgstr "Dispositivo Mapeado" #: src/utils/drive.rs:136 msgid "NVMe Drive" msgstr "Unidade NVMe" #: src/utils/drive.rs:138 msgid "Software Raid" msgstr "RAID de Software" #: src/utils/drive.rs:139 msgid "RAM Disk" msgstr "Disco RAM" #: src/utils/drive.rs:140 msgid "Solid State Drive" msgstr "Unidade de Estado Sólido" #: src/utils/drive.rs:141 msgid "ZFS Volume" msgstr "Volume ZFS" #: src/utils/drive.rs:142 msgid "Compressed RAM Disk (zram)" msgstr "Disco RAM Comprimido (zram)" #: src/utils/drive.rs:210 msgid "{} Loop Device" msgstr "Dispositivo de Loop {}" #: src/utils/drive.rs:211 msgid "{} Mapped Device" msgstr "Dispositivo Mapeado {}" #: src/utils/drive.rs:212 msgid "{} RAID" msgstr "RAID {}" #: src/utils/drive.rs:213 msgid "{} RAM Disk" msgstr "Disco RAM {}" #: src/utils/drive.rs:214 msgid "{} zram Device" msgstr "Dispositivo zram {}" #: src/utils/drive.rs:215 msgid "{} ZFS Volume" msgstr "Volume ZFS {}" #: src/utils/drive.rs:216 msgid "{} Drive" msgstr "Unidade {}" #: src/utils/network.rs:123 msgid "Bluetooth Tether" msgstr "Tether Bluetooth" #: src/utils/network.rs:124 msgid "Network Bridge" msgstr "Ponte de Rede" #: src/utils/network.rs:125 msgid "Ethernet Connection" msgstr "Conexão Cabeada" #: src/utils/network.rs:126 msgid "Docker Bridge" msgstr "Ponte do Docker" #: src/utils/network.rs:127 msgid "InfiniBand Connection" msgstr "Conexão InfiniBand" #: src/utils/network.rs:128 msgid "Serial Line IP Connection" msgstr "Conexão Serial Line IP" #: src/utils/network.rs:129 msgid "Virtual Ethernet Device" msgstr "Dispositivo Ethernet Virtual" #: src/utils/network.rs:130 msgid "VM Network Bridge" msgstr "Ponte de Rede de VM" #: src/utils/network.rs:131 msgid "VPN Tunnel" msgstr "Túnel VPN" #: src/utils/network.rs:132 msgid "VPN Tunnel (WireGuard)" msgstr "Túnel VPN (WireGuard)" #: src/utils/network.rs:133 msgid "Wi-Fi Connection" msgstr "Conexão Wi-Fi" #: src/utils/network.rs:134 msgid "WWAN Connection" msgstr "Conexão WWAN" #~ msgid "Memory Usage" #~ msgstr "Uso de Memória" #~ msgid "Show Search Fields on Launch" #~ msgstr "Mostrar Campos de Pesquisa ao Iniciar" #~ msgid "VRAM: {}" #~ msgstr "VRAM: {}" #~ msgid "End app" #~ msgstr "Encerrar Aplicativo" #~ msgid "Halt app" #~ msgstr "Interromper Aplicativo" #~ msgid "Kill app" #~ msgstr "Matar Aplicativo" #~ msgid "Continue app" #~ msgstr "Continuar Aplicativo" #~ msgid "Continue process" #~ msgstr "Continuar Processo" #~ msgid "Application" #~ msgstr "Aplicativo" #~ msgid "root" #~ msgstr "root" #~ msgctxt "shortcut window" #~ msgid "End Application/Process" #~ msgstr "Encerrar Aplicativo/Processo" #~ msgctxt "shortcut window" #~ msgid "Kill Application/Process" #~ msgstr "Matar Aplicativo/Processo" #~ msgctxt "shortcut window" #~ msgid "Halt Application/Process" #~ msgstr "Interromper Aplicativo/Processo" #~ msgctxt "shortcut window" #~ msgid "Continue Application/Process" #~ msgstr "Continuar Aplicativo/Processo" #~ msgid "Window width" #~ msgstr "Largura da janela" #~ msgid "Window height" #~ msgstr "Altura da janela" #~ msgid "Window maximized state" #~ msgstr "Estado maximizado da janela" #~ msgid "Temperature unit" #~ msgstr "Unidade de temperatura" #~ msgid "Unit Prefix Base" #~ msgstr "Base de Prefixo de Unidade" #~ msgid "Show search field for Processes and Applications on launch" #~ msgstr "Mostrar campo de pesquisa por Processos e Aplicativos ao iniciar" #~ msgid "Show virtual block devices such as LVM containers" #~ msgstr "Mostrar dispositivos de bloco virtuais, como contêineres LVM" #~ msgid "Show virtual network interfaces such as Docker interfaces" #~ msgstr "Mostrar interfaces de rede virtuais, como interfaces do Docker" #~ msgid "Show usage details in the sidebar" #~ msgstr "Mostrar detalhes de uso na barra lateral" #~ msgid "Show device description in the sidebar" #~ msgstr "Mostrar descrição do dispositivo na barra lateral" #~ msgid "Display network speeds in bits per second" #~ msgstr "Exibir velocidade de redes em bits por segundo" #~ msgid "Display memory usage in Applications view" #~ msgstr "Exibir uso de memória na visão de Aplicativos" #~ msgid "Display CPU usage in Applications view" #~ msgstr "Exibir uso de CPU na visão de Aplicativos" #~ msgid "Display drive read speed in Applications view" #~ msgstr "Exibir velocidade de leitura na visão de Aplicativos" #~ msgid "Display drive read total in Applications view" #~ msgstr "Exibir total de leitura na visão de Aplicativos" #~ msgid "Display drive write speed in Applications view" #~ msgstr "Exibir velocidade de gravação na visão de Aplicativos" #~ msgid "Display drive write total in Applications view" #~ msgstr "Exibir total de gravação na visão de Aplicativos" #~ msgid "Display GPU usage in Applications view" #~ msgstr "Exibir uso de GPU na visão de Aplicativos" #~ msgid "Display video encoder usage in Applications view" #~ msgstr "Exibir uso de codificador de vídeo na visão de Aplicativos" #~ msgid "Display video decoder usage in Applications view" #~ msgstr "Exibir uso de decodificador de vídeo na visão de Aplicativos" #~ msgid "Display GPU memory usage in Applications view" #~ msgstr "Exibir uso de memória de GPU na visão de Aplicativos" #~ msgid "Display process ID in Processes view" #~ msgstr "Exibir ID de processo na visão de Processos" #~ msgid "Display user name in Processes view" #~ msgstr "Exibir nome de usuário na visão de Processos" #~ msgid "Display memory usage in Processes view" #~ msgstr "Exibir uso de memória na visão de Processos" #~ msgid "Display CPU usage in Processes view" #~ msgstr "Exibir uso de CPU na visão de Processos" #~ msgid "Display drive read speed in Processes view" #~ msgstr "Exibir velocidade de leitura na visão de Processos" #~ msgid "Display drive read total in Processes view" #~ msgstr "Exibir total de leitura na visão de Processos" #~ msgid "Display drive write speed in Processes view" #~ msgstr "Exibir velocidade de gravação na visão de Processos" #~ msgid "Display drive write total in Processes view" #~ msgstr "Exibir total de gravação na visão de Processos" #~ msgid "Display GPU usage in Processes view" #~ msgstr "Exibir uso de GPU na visão de Processos" #~ msgid "Display video encoder usage in Processes view" #~ msgstr "Exibir uso de codificador de vídeo na visão de Processos" #~ msgid "Display video decoder usage in Processes view" #~ msgstr "Exibir uso de decodificador de vídeo na visão de Processos" #~ msgid "Display GPU memory usage in Processes view" #~ msgstr "Exibir uso de memória de GPU na visão de Processos" #~ msgid "Display logical CPU graphs in Processor view" #~ msgstr "Exibir gráficos lógicos de CPU na visão de Processador" #~ msgid "Show grids in graphs" #~ msgstr "Exibir grades nos gráficos" #~ msgid "Amount of data points that should be shown in a graph" #~ msgstr "Quantidade de pontos de dados a serem mostrados em um gráfico" #~ msgid "GPU Usage" #~ msgstr "Uso de GPU" #~ msgid "Current Power Cap" #~ msgstr "Limite Atual de Energia" resources-1.9.1/po/resources.pot000066400000000000000000001224101510634446000167130ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-06-07 13:42+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" #: data/net.nokyan.Resources.desktop.in.in:2 #: data/net.nokyan.Resources.metainfo.xml.in.in:4 src/application.rs:265 #: data/resources/ui/window.ui:22 msgid "Resources" msgstr "" #. Translators: The summary should be 35 characters or less according to Flathub appstream guidelines #: data/net.nokyan.Resources.desktop.in.in:3 #: data/net.nokyan.Resources.metainfo.xml.in.in:5 msgid "Keep an eye on system resources" msgstr "" #: data/net.nokyan.Resources.desktop.in.in:9 msgid "System;Resources;Monitor;Processes;Usage;Task;Manager;CPU;RAM;Memory;GPU;" msgstr "" #: data/net.nokyan.Resources.metainfo.xml.in.in:17 msgid "" "Resources allows you to check the utilization of your system resources and " "control your running processes and apps. It’s designed to be user-friendly " "and feel right at home on a modern desktop by using GNOME’s libadwaita." msgstr "" #: data/net.nokyan.Resources.metainfo.xml.in.in:20 msgid "Resources supports monitoring the following components:" msgstr "" #: data/net.nokyan.Resources.metainfo.xml.in.in:24 msgid "CPU" msgstr "" #: data/net.nokyan.Resources.metainfo.xml.in.in:25 #: src/ui/pages/applications/mod.rs:802 src/ui/pages/memory.rs:106 #: src/ui/pages/memory.rs:191 src/ui/pages/processes/mod.rs:1078 #: data/resources/ui/window.ui:176 data/resources/ui/window.ui:183 #: data/resources/ui/dialogs/app_dialog.ui:82 #: data/resources/ui/dialogs/process_dialog.ui:64 #: data/resources/ui/dialogs/settings_dialog.ui:128 #: data/resources/ui/dialogs/settings_dialog.ui:220 msgid "Memory" msgstr "" #: data/net.nokyan.Resources.metainfo.xml.in.in:26 #: src/ui/pages/applications/mod.rs:1175 src/ui/pages/gpu.rs:118 #: src/ui/pages/processes/mod.rs:1462 src/ui/window.rs:454 #: data/resources/ui/dialogs/app_dialog.ui:140 #: data/resources/ui/dialogs/process_dialog.ui:118 #: data/resources/ui/dialogs/settings_dialog.ui:158 #: data/resources/ui/dialogs/settings_dialog.ui:250 msgid "GPU" msgstr "" #: data/net.nokyan.Resources.metainfo.xml.in.in:27 #: data/resources/ui/dialogs/settings_dialog.ui:319 msgid "Network Interfaces" msgstr "" #: data/net.nokyan.Resources.metainfo.xml.in.in:28 msgid "Storage Devices" msgstr "" #: data/net.nokyan.Resources.metainfo.xml.in.in:29 msgid "Batteries" msgstr "" #: data/net.nokyan.Resources.metainfo.xml.in.in:51 msgid "Apps page in light theme" msgstr "" #: data/net.nokyan.Resources.metainfo.xml.in.in:55 msgid "Processes page in dark theme" msgstr "" #: data/net.nokyan.Resources.metainfo.xml.in.in:59 msgid "Processor page in light theme" msgstr "" #: data/net.nokyan.Resources.metainfo.xml.in.in:63 msgid "Memory page in dark theme" msgstr "" #: data/net.nokyan.Resources.metainfo.xml.in.in:67 msgid "GPU page in light theme" msgstr "" #: data/net.nokyan.Resources.metainfo.xml.in.in:71 msgid "Drive page in dark theme" msgstr "" #: data/net.nokyan.Resources.metainfo.xml.in.in:75 msgid "Network Interface page in light theme" msgstr "" #: data/net.nokyan.Resources.metainfo.xml.in.in:79 msgid "Battery page in dark theme" msgstr "" #: src/application.rs:267 msgid "The Nalux Team" msgstr "" #: src/application.rs:275 msgid "Report Issues" msgstr "" #. Translator credits. Replace "translator-credits" with your name/username, and optionally an email or URL. #. One name per line, please do not remove previous names. #: src/application.rs:281 msgid "translator-credits" msgstr "" #: src/application.rs:282 msgid "Icon by" msgstr "" #: src/ui/dialogs/app_dialog.rs:153 src/ui/dialogs/process_dialog.rs:131 #: src/ui/dialogs/process_dialog.rs:135 src/ui/dialogs/process_dialog.rs:144 #: src/ui/dialogs/process_dialog.rs:146 src/ui/dialogs/process_dialog.rs:169 #: src/ui/dialogs/process_dialog.rs:176 src/ui/dialogs/process_dialog.rs:183 #: src/ui/dialogs/process_dialog.rs:190 src/ui/pages/applications/mod.rs:945 #: src/ui/pages/applications/mod.rs:1069 src/ui/pages/battery.rs:204 #: src/ui/pages/battery.rs:224 src/ui/pages/battery.rs:230 #: src/ui/pages/battery.rs:233 src/ui/pages/battery.rs:264 #: src/ui/pages/battery.rs:288 src/ui/pages/battery.rs:290 #: src/ui/pages/battery.rs:300 src/ui/pages/cpu.rs:242 src/ui/pages/cpu.rs:257 #: src/ui/pages/cpu.rs:276 src/ui/pages/cpu.rs:282 src/ui/pages/cpu.rs:288 #: src/ui/pages/cpu.rs:294 src/ui/pages/cpu.rs:298 src/ui/pages/cpu.rs:301 #: src/ui/pages/cpu.rs:339 src/ui/pages/cpu.rs:446 src/ui/pages/drive.rs:315 #: src/ui/pages/drive.rs:346 src/ui/pages/drive.rs:348 #: src/ui/pages/drive.rs:377 src/ui/pages/drive.rs:379 #: src/ui/pages/drive.rs:395 src/ui/pages/drive.rs:396 #: src/ui/pages/drive.rs:403 src/ui/pages/drive.rs:413 #: src/ui/pages/drive.rs:423 src/ui/pages/drive.rs:429 src/ui/pages/gpu.rs:243 #: src/ui/pages/gpu.rs:250 src/ui/pages/gpu.rs:295 src/ui/pages/gpu.rs:320 #: src/ui/pages/gpu.rs:323 src/ui/pages/gpu.rs:334 src/ui/pages/gpu.rs:354 #: src/ui/pages/gpu.rs:366 src/ui/pages/gpu.rs:377 src/ui/pages/gpu.rs:389 #: src/ui/pages/gpu.rs:396 src/ui/pages/gpu.rs:400 src/ui/pages/gpu.rs:430 #: src/ui/pages/gpu.rs:436 src/ui/pages/memory.rs:226 #: src/ui/pages/memory.rs:227 src/ui/pages/memory.rs:231 #: src/ui/pages/memory.rs:232 src/ui/pages/memory.rs:236 #: src/ui/pages/memory.rs:237 src/ui/pages/memory.rs:265 #: src/ui/pages/memory.rs:326 src/ui/pages/network.rs:240 #: src/ui/pages/network.rs:247 src/ui/pages/network.rs:254 #: src/ui/pages/network.rs:260 src/ui/pages/network.rs:263 #: src/ui/pages/network.rs:270 src/ui/pages/network.rs:335 #: src/ui/pages/network.rs:338 src/ui/pages/network.rs:340 #: src/ui/pages/network.rs:369 src/ui/pages/network.rs:372 #: src/ui/pages/network.rs:374 src/ui/pages/npu.rs:217 src/ui/pages/npu.rs:253 #: src/ui/pages/npu.rs:308 src/ui/pages/npu.rs:317 src/ui/pages/npu.rs:329 #: src/ui/pages/npu.rs:336 src/ui/pages/npu.rs:340 src/ui/pages/npu.rs:361 #: src/ui/pages/npu.rs:367 src/ui/pages/processes/mod.rs:1220 #: src/ui/pages/processes/mod.rs:1286 src/ui/pages/processes/mod.rs:1352 #: src/ui/pages/processes/mod.rs:1418 src/ui/pages/processes/mod.rs:1900 #: src/ui/pages/processes/mod.rs:1902 src/utils/battery.rs:149 #: src/utils/drive.rs:136 src/utils/gpu/mod.rs:274 src/utils/gpu/mod.rs:286 #: src/utils/link.rs:314 src/utils/npu/mod.rs:243 src/utils/npu/mod.rs:249 msgid "N/A" msgstr "" #: src/ui/dialogs/process_options_dialog.rs:145 src/ui/pages/cpu.rs:256 #: src/ui/pages/cpu.rs:415 src/ui/pages/cpu.rs:419 msgid "CPU {}" msgstr "" #: src/ui/pages/applications/application_entry.rs:190 src/ui/pages/drive.rs:410 #: src/ui/pages/drive.rs:420 src/ui/pages/processes/process_entry.rs:211 msgid "No" msgstr "" #: src/ui/pages/applications/application_entry.rs:191 #: src/ui/pages/processes/process_entry.rs:212 msgid "Yes (Flatpak)" msgstr "" #: src/ui/pages/applications/application_entry.rs:192 #: src/ui/pages/processes/process_entry.rs:213 msgid "Yes (Snap)" msgstr "" #: src/ui/pages/applications/mod.rs:131 data/resources/ui/window.ui:65 #: data/resources/ui/window.ui:72 #: data/resources/ui/dialogs/settings_dialog.ui:122 msgid "Apps" msgstr "" #. -1 because we don't want to count System Processes #: src/ui/pages/applications/mod.rs:659 msgid "Running Apps: {}" msgstr "" #: src/ui/pages/applications/mod.rs:699 src/ui/pages/processes/mod.rs:861 msgid "Cancel" msgstr "" #: src/ui/pages/applications/mod.rs:745 msgid "App" msgstr "" #: src/ui/pages/applications/mod.rs:861 src/ui/pages/cpu.rs:128 #: src/ui/pages/processes/mod.rs:1136 src/ui/window.rs:289 #: data/resources/ui/window.ui:145 data/resources/ui/window.ui:152 #: data/resources/ui/dialogs/app_dialog.ui:73 #: data/resources/ui/dialogs/process_dialog.ui:55 #: data/resources/ui/dialogs/settings_dialog.ui:133 #: data/resources/ui/dialogs/settings_dialog.ui:225 msgid "Processor" msgstr "" #: src/ui/pages/applications/mod.rs:924 src/ui/pages/processes/mod.rs:1199 #: data/resources/ui/dialogs/app_dialog.ui:100 #: data/resources/ui/dialogs/process_dialog.ui:78 #: data/resources/ui/dialogs/settings_dialog.ui:138 #: data/resources/ui/dialogs/settings_dialog.ui:230 msgid "Drive Read" msgstr "" #: src/ui/pages/applications/mod.rs:988 src/ui/pages/processes/mod.rs:1265 #: data/resources/ui/dialogs/app_dialog.ui:109 #: data/resources/ui/dialogs/process_dialog.ui:87 #: data/resources/ui/dialogs/settings_dialog.ui:143 #: data/resources/ui/dialogs/settings_dialog.ui:235 msgid "Drive Read Total" msgstr "" #: src/ui/pages/applications/mod.rs:1048 src/ui/pages/processes/mod.rs:1331 #: data/resources/ui/dialogs/app_dialog.ui:118 #: data/resources/ui/dialogs/process_dialog.ui:96 #: data/resources/ui/dialogs/settings_dialog.ui:148 #: data/resources/ui/dialogs/settings_dialog.ui:240 msgid "Drive Write" msgstr "" #: src/ui/pages/applications/mod.rs:1114 src/ui/pages/processes/mod.rs:1397 #: data/resources/ui/dialogs/app_dialog.ui:127 #: data/resources/ui/dialogs/process_dialog.ui:105 #: data/resources/ui/dialogs/settings_dialog.ui:153 #: data/resources/ui/dialogs/settings_dialog.ui:245 msgid "Drive Write Total" msgstr "" #: src/ui/pages/applications/mod.rs:1233 src/ui/pages/processes/mod.rs:1520 #: data/resources/ui/dialogs/app_dialog.ui:158 #: data/resources/ui/dialogs/process_dialog.ui:136 #: data/resources/ui/dialogs/settings_dialog.ui:168 #: data/resources/ui/dialogs/settings_dialog.ui:260 msgid "Video Encoder" msgstr "" #: src/ui/pages/applications/mod.rs:1293 src/ui/pages/processes/mod.rs:1580 #: data/resources/ui/dialogs/app_dialog.ui:167 #: data/resources/ui/dialogs/process_dialog.ui:145 #: data/resources/ui/dialogs/settings_dialog.ui:173 #: data/resources/ui/dialogs/settings_dialog.ui:265 msgid "Video Decoder" msgstr "" #: src/ui/pages/applications/mod.rs:1352 src/ui/pages/processes/mod.rs:1640 #: data/resources/ui/dialogs/app_dialog.ui:149 #: data/resources/ui/dialogs/process_dialog.ui:127 #: data/resources/ui/dialogs/settings_dialog.ui:163 #: data/resources/ui/dialogs/settings_dialog.ui:255 msgid "Video Memory" msgstr "" #: src/ui/pages/applications/mod.rs:1410 src/ui/pages/memory.rs:197 #: src/ui/pages/processes/mod.rs:1943 #: data/resources/ui/dialogs/app_dialog.ui:91 #: data/resources/ui/dialogs/process_dialog.ui:73 #: data/resources/ui/dialogs/settings_dialog.ui:178 #: data/resources/ui/dialogs/settings_dialog.ui:290 msgid "Swap" msgstr "" #: src/ui/pages/applications/mod.rs:1469 src/ui/pages/processes/mod.rs:2001 #: data/resources/ui/dialogs/settings_dialog.ui:183 #: data/resources/ui/dialogs/settings_dialog.ui:295 msgid "Combined Memory" msgstr "" #: src/ui/pages/applications/mod.rs:1528 src/ui/pages/processes/mod.rs:2060 msgid "End {}?" msgstr "" #: src/ui/pages/applications/mod.rs:1529 src/ui/pages/processes/mod.rs:2061 msgid "Halt {}?" msgstr "" #: src/ui/pages/applications/mod.rs:1530 src/ui/pages/processes/mod.rs:2062 msgid "Kill {}?" msgstr "" #: src/ui/pages/applications/mod.rs:1531 src/ui/pages/processes/mod.rs:2063 msgid "Continue {}?" msgstr "" #: src/ui/pages/applications/mod.rs:1537 src/ui/pages/processes/mod.rs:2098 msgid "Unsaved work might be lost." msgstr "" #: src/ui/pages/applications/mod.rs:1539 msgid "" "Halting an app can come with serious risks such as losing data and security " "implications. Use with caution." msgstr "" #: src/ui/pages/applications/mod.rs:1542 msgid "" "Killing an app can come with serious risks such as losing data and security " "implications. Use with caution." msgstr "" #: src/ui/pages/applications/mod.rs:1550 #: data/resources/ui/pages/applications.ui:22 #: data/resources/ui/pages/applications.ui:98 msgid "End App" msgstr "" #: src/ui/pages/applications/mod.rs:1551 #: data/resources/ui/pages/applications.ui:10 #: data/resources/ui/pages/applications.ui:30 msgid "Halt App" msgstr "" #: src/ui/pages/applications/mod.rs:1552 #: data/resources/ui/pages/applications.ui:6 #: data/resources/ui/pages/applications.ui:26 msgid "Kill App" msgstr "" #: src/ui/pages/applications/mod.rs:1553 #: data/resources/ui/pages/applications.ui:14 #: data/resources/ui/pages/applications.ui:34 msgid "Continue App" msgstr "" #: src/ui/pages/battery.rs:102 src/ui/pages/drive.rs:126 msgid "Drive" msgstr "" #: src/ui/pages/battery.rs:209 msgid "Battery Charge" msgstr "" #: src/ui/pages/battery.rs:216 data/resources/ui/pages/gpu.ui:55 #: data/resources/ui/pages/npu.ui:49 msgid "Power Usage" msgstr "" #: src/ui/pages/battery.rs:278 src/ui/pages/cpu.rs:436 #: src/ui/pages/drive.rs:340 src/ui/pages/drive.rs:371 src/ui/pages/gpu.rs:422 #: src/ui/pages/network.rs:327 src/ui/pages/network.rs:361 #: src/ui/pages/npu.rs:304 src/ui/pages/npu.rs:353 msgid "Highest:" msgstr "" #: src/ui/pages/cpu.rs:241 src/ui/pages/gpu.rs:210 src/ui/pages/npu.rs:201 msgid "Total Usage" msgstr "" #: src/ui/pages/cpu.rs:269 src/ui/pages/gpu.rs:237 src/ui/pages/npu.rs:211 msgid "Temperature" msgstr "" #: src/ui/pages/drive.rs:235 msgid "Drive Activity" msgstr "" #: src/ui/pages/drive.rs:242 msgid "Read Speed" msgstr "" #: src/ui/pages/drive.rs:246 msgid "Write Speed" msgstr "" #: src/ui/pages/drive.rs:408 src/ui/pages/drive.rs:418 msgid "Yes" msgstr "" #. Translators: This is an abbreviation for "Read" and "Write". This is displayed in the sidebar so your #. translation should preferably be quite short or an abbreviation #: src/ui/pages/drive.rs:436 msgid "R: {} · W: {}" msgstr "" #: src/ui/pages/gpu.rs:218 msgid "Video Encoder/Decoder Usage" msgstr "" #: src/ui/pages/gpu.rs:224 msgid "Video Encoder Usage" msgstr "" #: src/ui/pages/gpu.rs:229 msgid "Video Decoder Usage" msgstr "" #: src/ui/pages/gpu.rs:234 msgid "Video Memory Usage" msgstr "" #. Translators: This will be displayed in the sidebar, please try to keep your translation as short as (or even #. shorter than) 'Memory' #: src/ui/pages/gpu.rs:408 src/ui/pages/npu.rs:278 src/ui/pages/npu.rs:299 msgid "Memory: {}" msgstr "" #: src/ui/pages/memory.rs:261 msgid "{} of {}" msgstr "" #: src/ui/pages/memory.rs:264 msgid "{} MT/s" msgstr "" #. Translators: This will be displayed in the sidebar, so your translation for "Swap" should #. preferably be quite short or an abbreviation #: src/ui/pages/memory.rs:345 msgid "{} / {} · Swap: {} %" msgstr "" #: src/ui/pages/network.rs:118 src/utils/network.rs:136 msgid "Network Interface" msgstr "" #: src/ui/pages/network.rs:229 msgid "Receiving" msgstr "" #: src/ui/pages/network.rs:233 msgid "Sending" msgstr "" #. Translators: This is an abbreviation for "Receive" and "Send". This is displayed in the sidebar so #. your translation should preferably be quite short or an abbreviation #: src/ui/pages/network.rs:384 msgid "R: {} · S: {}" msgstr "" #: src/ui/pages/npu.rs:109 src/ui/window.rs:484 msgid "NPU" msgstr "" #: src/ui/pages/npu.rs:208 msgid "Memory Usage" msgstr "" #: src/ui/pages/processes/mod.rs:175 data/resources/ui/window.ui:105 #: data/resources/ui/window.ui:112 #: data/resources/ui/dialogs/settings_dialog.ui:193 msgid "Processes" msgstr "" #: src/ui/pages/processes/mod.rs:522 src/ui/pages/processes/mod.rs:2111 #: data/resources/ui/pages/processes.ui:38 #: data/resources/ui/pages/processes.ui:157 msgid "End Process" msgstr "" #: src/ui/pages/processes/mod.rs:526 data/resources/ui/pages/processes.ui:70 msgid "End Processes" msgstr "" #: src/ui/pages/processes/mod.rs:812 msgid "Running Processes: {}" msgstr "" #: src/ui/pages/processes/mod.rs:910 msgid "Process" msgstr "" #: src/ui/pages/processes/mod.rs:971 #: data/resources/ui/dialogs/process_dialog.ui:186 #: data/resources/ui/dialogs/settings_dialog.ui:210 msgid "Process ID" msgstr "" #: src/ui/pages/processes/mod.rs:1024 #: data/resources/ui/dialogs/process_dialog.ui:213 #: data/resources/ui/dialogs/settings_dialog.ui:215 msgid "User" msgstr "" #: src/ui/pages/processes/mod.rs:1699 #: data/resources/ui/dialogs/process_dialog.ui:154 #: data/resources/ui/dialogs/settings_dialog.ui:270 msgid "Total CPU Time" msgstr "" #: src/ui/pages/processes/mod.rs:1758 #: data/resources/ui/dialogs/process_dialog.ui:163 #: data/resources/ui/dialogs/settings_dialog.ui:275 msgid "User CPU Time" msgstr "" #: src/ui/pages/processes/mod.rs:1817 #: data/resources/ui/dialogs/process_dialog.ui:172 #: data/resources/ui/dialogs/settings_dialog.ui:280 msgid "System CPU Time" msgstr "" #: src/ui/pages/processes/mod.rs:1876 #: data/resources/ui/dialogs/process_options_dialog.ui:87 #: data/resources/ui/dialogs/settings_dialog.ui:285 msgid "Priority" msgstr "" #: src/ui/pages/processes/mod.rs:2070 msgid "End process?" msgid_plural "End {} processes?" msgstr[0] "" msgstr[1] "" #: src/ui/pages/processes/mod.rs:2076 msgid "Halt process?" msgid_plural "Halt {} processes?" msgstr[0] "" msgstr[1] "" #: src/ui/pages/processes/mod.rs:2082 src/ui/pages/processes/mod.rs:2088 msgid "Kill process?" msgid_plural "Kill {} processes?" msgstr[0] "" msgstr[1] "" #: src/ui/pages/processes/mod.rs:2100 msgid "" "Halting a process can come with serious risks such as losing data and " "security implications. Use with caution." msgstr "" #: src/ui/pages/processes/mod.rs:2103 msgid "" "Killing a process can come with serious risks such as losing data and " "security implications. Use with caution." msgstr "" #: src/ui/pages/processes/mod.rs:2112 data/resources/ui/pages/processes.ui:10 #: data/resources/ui/pages/processes.ui:46 msgid "Halt Process" msgstr "" #: src/ui/pages/processes/mod.rs:2113 data/resources/ui/pages/processes.ui:6 #: data/resources/ui/pages/processes.ui:42 msgid "Kill Process" msgstr "" #: src/ui/pages/processes/mod.rs:2114 data/resources/ui/pages/processes.ui:14 #: data/resources/ui/pages/processes.ui:50 msgid "Continue Process" msgstr "" #: src/ui/window.rs:452 msgid "GPU {}" msgstr "" #: src/ui/window.rs:482 msgid "NPU {}" msgstr "" #: src/ui/window.rs:1158 msgid "Successfully adjusted {}" msgstr "" #: src/ui/window.rs:1159 msgid "There was a problem adjusting {}" msgstr "" #: src/ui/window.rs:1241 msgid "Successfully ended {}" msgstr "" #: src/ui/window.rs:1242 msgid "Successfully halted {}" msgstr "" #: src/ui/window.rs:1243 msgid "Successfully killed {}" msgstr "" #: src/ui/window.rs:1244 msgid "Successfully continued {}" msgstr "" #: src/ui/window.rs:1251 msgid "Successfully ended the process" msgid_plural "Successfully ended {} processes" msgstr[0] "" msgstr[1] "" #: src/ui/window.rs:1257 msgid "Successfully halted the process" msgid_plural "Successfully halted {} processes" msgstr[0] "" msgstr[1] "" #: src/ui/window.rs:1263 msgid "Successfully killed the process" msgid_plural "Successfully killed {} processes" msgstr[0] "" msgstr[1] "" #: src/ui/window.rs:1269 msgid "Successfully continued the process" msgid_plural "Successfully continued {} processes" msgstr[0] "" msgstr[1] "" #: src/ui/window.rs:1280 msgid "There was a problem ending a process" msgid_plural "There were problems ending {} processes" msgstr[0] "" msgstr[1] "" #: src/ui/window.rs:1286 msgid "There was a problem halting a process" msgid_plural "There were problems halting {} processes" msgstr[0] "" msgstr[1] "" #: src/ui/window.rs:1292 msgid "There was a problem killing a process" msgid_plural "There were problems killing {} processes" msgstr[0] "" msgstr[1] "" #: src/ui/window.rs:1298 msgid "There was a problem continuing a process" msgid_plural "There were problems continuing {} processes" msgstr[0] "" msgstr[1] "" #: src/ui/window.rs:1308 msgid "There was a problem ending {}" msgstr "" #: src/ui/window.rs:1309 msgid "There was a problem halting {}" msgstr "" #: src/ui/window.rs:1310 msgid "There was a problem killing {}" msgstr "" #: src/ui/window.rs:1311 msgid "There was a problem continuing {}" msgstr "" #: src/utils/app.rs:222 msgid "System Processes" msgstr "" #: src/utils/battery.rs:90 msgid "Charging" msgstr "" #: src/utils/battery.rs:91 msgid "Discharging" msgstr "" #: src/utils/battery.rs:92 msgid "Empty" msgstr "" #: src/utils/battery.rs:93 msgid "Full" msgstr "" #: src/utils/battery.rs:94 msgid "Unknown" msgstr "" #: src/utils/battery.rs:140 msgid "Nickel-Metal Hydride" msgstr "" #: src/utils/battery.rs:141 msgid "Nickel-Cadmium" msgstr "" #: src/utils/battery.rs:142 msgid "Nickel-Zinc" msgstr "" #: src/utils/battery.rs:143 msgid "Lead-Acid" msgstr "" #: src/utils/battery.rs:144 msgid "Lithium-Ion" msgstr "" #: src/utils/battery.rs:145 msgid "Lithium Iron Phosphate" msgstr "" #: src/utils/battery.rs:146 msgid "Lithium Polymer" msgstr "" #: src/utils/battery.rs:148 msgid "Rechargeable Alkaline Managanese" msgstr "" #: src/utils/battery.rs:259 msgid "{} Battery" msgstr "" #: src/utils/battery.rs:261 msgid "Battery" msgstr "" #: src/utils/drive.rs:128 src/utils/drive.rs:207 msgid "CD/DVD/Blu-ray Drive" msgstr "" #: src/utils/drive.rs:129 msgid "eMMC Storage" msgstr "" #: src/utils/drive.rs:130 msgid "Flash Storage" msgstr "" #: src/utils/drive.rs:131 src/utils/drive.rs:208 msgid "Floppy Drive" msgstr "" #: src/utils/drive.rs:132 msgid "Hard Disk Drive" msgstr "" #: src/utils/drive.rs:133 msgid "Loop Device" msgstr "" #: src/utils/drive.rs:134 msgid "Mapped Device" msgstr "" #: src/utils/drive.rs:135 msgid "NVMe Drive" msgstr "" #: src/utils/drive.rs:137 msgid "Software Raid" msgstr "" #: src/utils/drive.rs:138 msgid "RAM Disk" msgstr "" #: src/utils/drive.rs:139 msgid "Solid State Drive" msgstr "" #: src/utils/drive.rs:140 msgid "ZFS Volume" msgstr "" #: src/utils/drive.rs:141 msgid "Compressed RAM Disk (zram)" msgstr "" #: src/utils/drive.rs:209 msgid "{} Loop Device" msgstr "" #: src/utils/drive.rs:210 msgid "{} Mapped Device" msgstr "" #: src/utils/drive.rs:211 msgid "{} RAID" msgstr "" #: src/utils/drive.rs:212 msgid "{} RAM Disk" msgstr "" #: src/utils/drive.rs:213 msgid "{} zram Device" msgstr "" #: src/utils/drive.rs:214 msgid "{} ZFS Volume" msgstr "" #: src/utils/drive.rs:215 msgid "{} Drive" msgstr "" #: src/utils/network.rs:124 msgid "Bluetooth Tether" msgstr "" #: src/utils/network.rs:125 msgid "Network Bridge" msgstr "" #: src/utils/network.rs:126 msgid "Ethernet Connection" msgstr "" #: src/utils/network.rs:127 msgid "Docker Bridge" msgstr "" #: src/utils/network.rs:128 msgid "InfiniBand Connection" msgstr "" #: src/utils/network.rs:129 msgid "Serial Line IP Connection" msgstr "" #: src/utils/network.rs:130 msgid "Virtual Ethernet Device" msgstr "" #: src/utils/network.rs:131 msgid "VM Network Bridge" msgstr "" #: src/utils/network.rs:132 msgid "VPN Tunnel" msgstr "" #: src/utils/network.rs:133 msgid "VPN Tunnel (WireGuard)" msgstr "" #: src/utils/network.rs:134 msgid "Wi-Fi Connection" msgstr "" #: src/utils/network.rs:135 msgid "WWAN Connection" msgstr "" #: src/utils/units.rs:91 msgid "{} K" msgstr "" #: src/utils/units.rs:93 msgid "{} °C" msgstr "" #: src/utils/units.rs:95 msgid "{} °F" msgstr "" #: src/utils/units.rs:113 src/utils/units.rs:127 src/utils/units.rs:147 #: src/utils/units.rs:161 msgid "{} B" msgstr "" #: src/utils/units.rs:114 src/utils/units.rs:128 msgid "{} kB" msgstr "" #: src/utils/units.rs:115 src/utils/units.rs:129 msgid "{} MB" msgstr "" #: src/utils/units.rs:116 src/utils/units.rs:130 msgid "{} GB" msgstr "" #: src/utils/units.rs:117 src/utils/units.rs:131 msgid "{} TB" msgstr "" #: src/utils/units.rs:118 src/utils/units.rs:132 msgid "{} PB" msgstr "" #: src/utils/units.rs:119 src/utils/units.rs:133 msgid "{} EB" msgstr "" #: src/utils/units.rs:120 src/utils/units.rs:134 msgid "{} ZB" msgstr "" #: src/utils/units.rs:121 src/utils/units.rs:135 msgid "{} YB" msgstr "" #: src/utils/units.rs:122 src/utils/units.rs:136 msgid "{} RB" msgstr "" #: src/utils/units.rs:123 src/utils/units.rs:137 msgid "{} QB" msgstr "" #: src/utils/units.rs:148 src/utils/units.rs:162 msgid "{} KiB" msgstr "" #: src/utils/units.rs:149 src/utils/units.rs:163 msgid "{} MiB" msgstr "" #: src/utils/units.rs:150 src/utils/units.rs:164 msgid "{} GiB" msgstr "" #: src/utils/units.rs:151 src/utils/units.rs:165 msgid "{} TiB" msgstr "" #: src/utils/units.rs:152 src/utils/units.rs:166 msgid "{} PiB" msgstr "" #: src/utils/units.rs:153 src/utils/units.rs:167 msgid "{} EiB" msgstr "" #: src/utils/units.rs:154 src/utils/units.rs:168 msgid "{} ZiB" msgstr "" #: src/utils/units.rs:155 src/utils/units.rs:169 msgid "{} YiB" msgstr "" #: src/utils/units.rs:156 src/utils/units.rs:170 msgid "{} RiB" msgstr "" #: src/utils/units.rs:157 src/utils/units.rs:171 msgid "{} QiB" msgstr "" #: src/utils/units.rs:198 src/utils/units.rs:215 msgid "{} B/s" msgstr "" #: src/utils/units.rs:199 msgid "{} kB/s" msgstr "" #: src/utils/units.rs:200 msgid "{} MB/s" msgstr "" #: src/utils/units.rs:201 msgid "{} GB/s" msgstr "" #: src/utils/units.rs:202 msgid "{} TB/s" msgstr "" #: src/utils/units.rs:203 msgid "{} PB/s" msgstr "" #: src/utils/units.rs:204 msgid "{} EB/s" msgstr "" #: src/utils/units.rs:205 msgid "{} ZB/s" msgstr "" #: src/utils/units.rs:206 msgid "{} YB/s" msgstr "" #: src/utils/units.rs:207 msgid "{} RB/s" msgstr "" #: src/utils/units.rs:208 msgid "{} QB/s" msgstr "" #: src/utils/units.rs:216 msgid "{} KiB/s" msgstr "" #: src/utils/units.rs:217 msgid "{} MiB/s" msgstr "" #: src/utils/units.rs:218 msgid "{} GiB/s" msgstr "" #: src/utils/units.rs:219 msgid "{} TiB/s" msgstr "" #: src/utils/units.rs:220 msgid "{} PiB/s" msgstr "" #: src/utils/units.rs:221 msgid "{} EiB/s" msgstr "" #: src/utils/units.rs:222 msgid "{} ZiB/s" msgstr "" #: src/utils/units.rs:223 msgid "{} YiB/s" msgstr "" #: src/utils/units.rs:224 msgid "{} RiB/s" msgstr "" #: src/utils/units.rs:225 msgid "{} QiB/s" msgstr "" #: src/utils/units.rs:239 src/utils/units.rs:256 msgid "{} b/s" msgstr "" #: src/utils/units.rs:240 msgid "{} kb/s" msgstr "" #: src/utils/units.rs:241 msgid "{} Mb/s" msgstr "" #: src/utils/units.rs:242 msgid "{} Gb/s" msgstr "" #: src/utils/units.rs:243 msgid "{} Tb/s" msgstr "" #: src/utils/units.rs:244 msgid "{} Pb/s" msgstr "" #: src/utils/units.rs:245 msgid "{} Eb/s" msgstr "" #: src/utils/units.rs:246 msgid "{} Zb/s" msgstr "" #: src/utils/units.rs:247 msgid "{} Yb/s" msgstr "" #: src/utils/units.rs:248 msgid "{} Rb/s" msgstr "" #: src/utils/units.rs:249 msgid "{} Qb/s" msgstr "" #: src/utils/units.rs:257 msgid "{} Kib/s" msgstr "" #: src/utils/units.rs:258 msgid "{} Mib/s" msgstr "" #: src/utils/units.rs:259 msgid "{} Gib/s" msgstr "" #: src/utils/units.rs:260 msgid "{} Tib/s" msgstr "" #: src/utils/units.rs:261 msgid "{} Pib/s" msgstr "" #: src/utils/units.rs:262 msgid "{} Eib/s" msgstr "" #: src/utils/units.rs:263 msgid "{} Zib/s" msgstr "" #: src/utils/units.rs:264 msgid "{} Yib/s" msgstr "" #: src/utils/units.rs:265 msgid "{} Rib/s" msgstr "" #: src/utils/units.rs:266 msgid "{} Qib/s" msgstr "" #: src/utils/units.rs:273 msgid "{} Hz" msgstr "" #: src/utils/units.rs:274 msgid "{} kHz" msgstr "" #: src/utils/units.rs:275 msgid "{} MHz" msgstr "" #: src/utils/units.rs:276 msgid "{} GHz" msgstr "" #: src/utils/units.rs:277 msgid "{} THz" msgstr "" #: src/utils/units.rs:278 msgid "{} PHz" msgstr "" #: src/utils/units.rs:279 msgid "{} EHz" msgstr "" #: src/utils/units.rs:280 msgid "{} ZHz" msgstr "" #: src/utils/units.rs:281 msgid "{} YHz" msgstr "" #: src/utils/units.rs:282 msgid "{} RHz" msgstr "" #: src/utils/units.rs:283 msgid "{} QHz" msgstr "" #: src/utils/units.rs:290 msgid "{} W" msgstr "" #: src/utils/units.rs:291 msgid "{} kW" msgstr "" #: src/utils/units.rs:292 msgid "{} MW" msgstr "" #: src/utils/units.rs:293 msgid "{} GW" msgstr "" #: src/utils/units.rs:294 msgid "{} TW" msgstr "" #: src/utils/units.rs:295 msgid "{} PW" msgstr "" #: src/utils/units.rs:296 msgid "{} EW" msgstr "" #: src/utils/units.rs:297 msgid "{} ZW" msgstr "" #: src/utils/units.rs:298 msgid "{} YW" msgstr "" #: src/utils/units.rs:299 msgid "{} RW" msgstr "" #: src/utils/units.rs:300 msgid "{} QW" msgstr "" #: src/utils/units.rs:309 src/utils/units.rs:323 msgid "{} Wh" msgstr "" #: src/utils/units.rs:310 src/utils/units.rs:324 msgid "{} kWh" msgstr "" #: src/utils/units.rs:311 src/utils/units.rs:325 msgid "{} MWh" msgstr "" #: src/utils/units.rs:312 src/utils/units.rs:326 msgid "{} GWh" msgstr "" #: src/utils/units.rs:313 src/utils/units.rs:327 msgid "{} TWh" msgstr "" #: src/utils/units.rs:314 src/utils/units.rs:328 msgid "{} PWh" msgstr "" #: src/utils/units.rs:315 src/utils/units.rs:329 msgid "{} EWh" msgstr "" #: src/utils/units.rs:316 src/utils/units.rs:330 msgid "{} ZWh" msgstr "" #: src/utils/units.rs:317 src/utils/units.rs:331 msgid "{} YWh" msgstr "" #: src/utils/units.rs:318 src/utils/units.rs:332 msgid "{} RWh" msgstr "" #: src/utils/units.rs:319 src/utils/units.rs:333 msgid "{} QWh" msgstr "" #: data/resources/ui/shortcuts.ui:11 msgctxt "shortcut window" msgid "General" msgstr "" #: data/resources/ui/shortcuts.ui:14 msgctxt "shortcut window" msgid "Preferences" msgstr "" #: data/resources/ui/shortcuts.ui:20 msgctxt "shortcut window" msgid "Show Shortcuts" msgstr "" #: data/resources/ui/shortcuts.ui:26 msgctxt "shortcut window" msgid "Quit" msgstr "" #: data/resources/ui/shortcuts.ui:32 msgctxt "shortcut window" msgid "Toggle Search Field" msgstr "" #: data/resources/ui/shortcuts.ui:38 msgctxt "shortcut window" msgid "End App/Process" msgstr "" #: data/resources/ui/shortcuts.ui:44 msgctxt "shortcut window" msgid "Kill App/Process" msgstr "" #: data/resources/ui/shortcuts.ui:50 msgctxt "shortcut window" msgid "Halt App/Process" msgstr "" #: data/resources/ui/shortcuts.ui:56 msgctxt "shortcut window" msgid "Continue App/Process" msgstr "" #: data/resources/ui/shortcuts.ui:62 msgctxt "shortcut window" msgid "Show Information for App/Process" msgstr "" #: data/resources/ui/shortcuts.ui:68 msgctxt "shortcut window" msgid "Show Process Options" msgstr "" #: data/resources/ui/window.ui:6 msgid "Preferences" msgstr "" #: data/resources/ui/window.ui:10 msgid "Keyboard Shortcuts" msgstr "" #: data/resources/ui/window.ui:14 msgid "About Resources" msgstr "" #: data/resources/ui/window.ui:88 data/resources/ui/window.ui:128 msgid "Search" msgstr "" #: data/resources/ui/window.ui:90 data/resources/ui/window.ui:130 msgid "Toggle search field" msgstr "" #: data/resources/ui/dialogs/app_dialog.ui:7 msgid "App Information" msgstr "" #: data/resources/ui/dialogs/app_dialog.ui:70 #: data/resources/ui/dialogs/process_dialog.ui:48 #: data/resources/ui/pages/battery.ui:22 data/resources/ui/pages/cpu.ui:37 #: data/resources/ui/pages/cpu.ui:50 data/resources/ui/pages/drive.ui:22 #: data/resources/ui/pages/gpu.ui:22 data/resources/ui/pages/memory.ui:31 #: data/resources/ui/pages/network.ui:22 data/resources/ui/pages/npu.ui:22 msgid "Usage" msgstr "" #: data/resources/ui/dialogs/app_dialog.ui:174 #: data/resources/ui/dialogs/process_dialog.ui:179 #: data/resources/ui/pages/battery.ui:33 data/resources/ui/pages/cpu.ui:83 #: data/resources/ui/pages/drive.ui:54 data/resources/ui/pages/gpu.ui:74 #: data/resources/ui/pages/memory.ui:42 data/resources/ui/pages/network.ui:51 #: data/resources/ui/pages/npu.ui:68 msgid "Properties" msgstr "" #: data/resources/ui/dialogs/app_dialog.ui:180 msgid "ID" msgstr "" #: data/resources/ui/dialogs/app_dialog.ui:190 #: data/resources/ui/dialogs/process_dialog.ui:195 msgid "Running Since" msgstr "" #: data/resources/ui/dialogs/app_dialog.ui:198 msgid "Running Processes" msgstr "" #: data/resources/ui/dialogs/app_dialog.ui:207 #: data/resources/ui/dialogs/process_dialog.ui:231 msgid "Containerized" msgstr "" #: data/resources/ui/dialogs/process_dialog.ui:7 msgid "Process Information" msgstr "" #: data/resources/ui/dialogs/process_dialog.ui:204 msgid "Commandline" msgstr "" #: data/resources/ui/dialogs/process_dialog.ui:222 msgid "Control Group" msgstr "" #: data/resources/ui/dialogs/process_options_dialog.ui:7 #: data/resources/ui/dialogs/process_options_dialog.ui:69 msgid "Process Options" msgstr "" #: data/resources/ui/dialogs/process_options_dialog.ui:29 msgid "Apply" msgstr "" #: data/resources/ui/dialogs/process_options_dialog.ui:72 msgid "Niceness" msgstr "" #: data/resources/ui/dialogs/process_options_dialog.ui:73 msgid "" "The priority of a process is given by its niceness. A lower niceness value " "correspond to a higher priority." msgstr "" #: data/resources/ui/dialogs/process_options_dialog.ui:91 msgctxt "process priority" msgid "Very High" msgstr "" #: data/resources/ui/dialogs/process_options_dialog.ui:92 msgctxt "process priority" msgid "High" msgstr "" #: data/resources/ui/dialogs/process_options_dialog.ui:93 msgctxt "process priority" msgid "Normal" msgstr "" #: data/resources/ui/dialogs/process_options_dialog.ui:94 msgctxt "process priority" msgid "Low" msgstr "" #: data/resources/ui/dialogs/process_options_dialog.ui:95 msgctxt "process priority" msgid "Very Low" msgstr "" #: data/resources/ui/dialogs/process_options_dialog.ui:103 msgid "Processor Affinity" msgstr "" #: data/resources/ui/dialogs/process_options_dialog.ui:108 msgid "Toggle All" msgstr "" #: data/resources/ui/dialogs/process_options_dialog.ui:111 msgid "Select which processor cores the process is allowed to run on" msgstr "" #: data/resources/ui/dialogs/settings_dialog.ui:7 msgid "General" msgstr "" #: data/resources/ui/dialogs/settings_dialog.ui:10 msgid "Units" msgstr "" #: data/resources/ui/dialogs/settings_dialog.ui:13 msgid "Data Unit Prefix" msgstr "" #: data/resources/ui/dialogs/settings_dialog.ui:17 msgid "Decimal" msgstr "" #: data/resources/ui/dialogs/settings_dialog.ui:18 msgid "Binary" msgstr "" #: data/resources/ui/dialogs/settings_dialog.ui:26 msgid "Show Network Speeds in Bits per Second" msgstr "" #: data/resources/ui/dialogs/settings_dialog.ui:31 msgid "Temperature Unit" msgstr "" #: data/resources/ui/dialogs/settings_dialog.ui:35 msgid "Celsius" msgstr "" #: data/resources/ui/dialogs/settings_dialog.ui:36 msgid "Kelvin" msgstr "" #: data/resources/ui/dialogs/settings_dialog.ui:37 msgid "Fahrenheit" msgstr "" #: data/resources/ui/dialogs/settings_dialog.ui:47 msgid "User Interface" msgstr "" #: data/resources/ui/dialogs/settings_dialog.ui:50 msgid "Refresh Speed" msgstr "" #: data/resources/ui/dialogs/settings_dialog.ui:51 msgid "Higher refresh speeds can lead to higher processor usage" msgstr "" #: data/resources/ui/dialogs/settings_dialog.ui:55 msgctxt "UI refresh speed" msgid "Very Slow" msgstr "" #: data/resources/ui/dialogs/settings_dialog.ui:56 msgctxt "UI refresh speed" msgid "Slow" msgstr "" #: data/resources/ui/dialogs/settings_dialog.ui:57 msgctxt "UI refresh speed" msgid "Normal" msgstr "" #: data/resources/ui/dialogs/settings_dialog.ui:58 msgctxt "UI refresh speed" msgid "Fast" msgstr "" #: data/resources/ui/dialogs/settings_dialog.ui:59 msgctxt "UI refresh speed" msgid "Very Fast" msgstr "" #: data/resources/ui/dialogs/settings_dialog.ui:67 msgid "Show Graph Grids" msgstr "" #: data/resources/ui/dialogs/settings_dialog.ui:72 msgid "Graph Data Points" msgstr "" #: data/resources/ui/dialogs/settings_dialog.ui:86 msgid "Show Usage Details in Sidebar" msgstr "" #: data/resources/ui/dialogs/settings_dialog.ui:87 msgid "If enabled, the usage along with other information will be displayed" msgstr "" #: data/resources/ui/dialogs/settings_dialog.ui:92 msgid "Show Device Descriptions in Sidebar" msgstr "" #: data/resources/ui/dialogs/settings_dialog.ui:93 msgid "" "If enabled, a device identifier like its name or device type will be " "displayed" msgstr "" #: data/resources/ui/dialogs/settings_dialog.ui:98 msgid "Sidebar Meter Type" msgstr "" #: data/resources/ui/dialogs/settings_dialog.ui:102 msgid "Bar" msgstr "" #: data/resources/ui/dialogs/settings_dialog.ui:103 msgid "Graph" msgstr "" #: data/resources/ui/dialogs/settings_dialog.ui:111 msgid "Normalize Processor Usage" msgstr "" #: data/resources/ui/dialogs/settings_dialog.ui:112 msgid "" "If enabled, the total usage of all cores will be divided by the amount of " "cores" msgstr "" #: data/resources/ui/dialogs/settings_dialog.ui:125 #: data/resources/ui/dialogs/settings_dialog.ui:207 msgid "Information Columns" msgstr "" #: data/resources/ui/dialogs/settings_dialog.ui:196 #: data/resources/ui/pages/cpu.ui:22 data/resources/ui/pages/processes.ui:56 msgid "Options" msgstr "" #: data/resources/ui/dialogs/settings_dialog.ui:199 msgid "Show Niceness Values" msgstr "" #: data/resources/ui/dialogs/settings_dialog.ui:200 msgid "" "Display priorities as niceness to allow for more fine-grained adjustments" msgstr "" #: data/resources/ui/dialogs/settings_dialog.ui:305 msgid "Devices" msgstr "" #: data/resources/ui/dialogs/settings_dialog.ui:308 msgid "Drives" msgstr "" #: data/resources/ui/dialogs/settings_dialog.ui:311 msgid "Show Virtual Drives" msgstr "" #: data/resources/ui/dialogs/settings_dialog.ui:312 msgid "Virtual drives are for example ZFS volumes or mapped devices" msgstr "" #: data/resources/ui/dialogs/settings_dialog.ui:322 msgid "Show Virtual Network Interfaces" msgstr "" #: data/resources/ui/dialogs/settings_dialog.ui:323 msgid "Virtual network interfaces are for example bridges or VPN tunnels" msgstr "" #: data/resources/ui/pages/applications.ui:40 #: data/resources/ui/pages/processes.ui:62 msgid "Information" msgstr "" #: data/resources/ui/pages/applications.ui:57 msgid "Search applications" msgstr "" #: data/resources/ui/pages/applications.ui:87 #: data/resources/ui/pages/applications.ui:89 msgid "Show App Information" msgstr "" #: data/resources/ui/pages/battery.ui:36 msgid "Battery Health" msgstr "" #: data/resources/ui/pages/battery.ui:45 msgid "Design Capacity" msgstr "" #: data/resources/ui/pages/battery.ui:54 msgid "Charge Cycles" msgstr "" #: data/resources/ui/pages/battery.ui:63 msgid "Technology" msgstr "" #: data/resources/ui/pages/battery.ui:72 data/resources/ui/pages/gpu.ui:81 #: data/resources/ui/pages/network.ui:58 data/resources/ui/pages/npu.ui:75 msgid "Manufacturer" msgstr "" #: data/resources/ui/pages/battery.ui:81 msgid "Model Name" msgstr "" #: data/resources/ui/pages/battery.ui:90 data/resources/ui/pages/drive.ui:66 msgid "Device" msgstr "" #: data/resources/ui/pages/cpu.ui:26 msgid "Show Usages of Logical CPUs" msgstr "" #: data/resources/ui/pages/cpu.ui:75 data/resources/ui/pages/gpu.ui:66 #: data/resources/ui/pages/npu.ui:60 msgid "Sensors" msgstr "" #: data/resources/ui/pages/cpu.ui:90 msgid "Max Frequency" msgstr "" #: data/resources/ui/pages/cpu.ui:99 msgid "Logical Cores" msgstr "" #: data/resources/ui/pages/cpu.ui:108 msgid "Physical Cores" msgstr "" #: data/resources/ui/pages/cpu.ui:117 msgid "Sockets" msgstr "" #: data/resources/ui/pages/cpu.ui:126 msgid "Uptime" msgstr "" #: data/resources/ui/pages/cpu.ui:135 msgid "Virtualization" msgstr "" #: data/resources/ui/pages/cpu.ui:144 msgid "Architecture" msgstr "" #: data/resources/ui/pages/drive.ui:38 msgid "Total Read" msgstr "" #: data/resources/ui/pages/drive.ui:47 msgid "Total Written" msgstr "" #: data/resources/ui/pages/drive.ui:57 data/resources/ui/pages/memory.ui:72 msgid "Type" msgstr "" #: data/resources/ui/pages/drive.ui:75 msgid "Capacity" msgstr "" #: data/resources/ui/pages/drive.ui:84 msgid "Writable" msgstr "" #: data/resources/ui/pages/drive.ui:93 msgid "Removable" msgstr "" #. Translators: "Link" refers to something like "PCIe 4.0 ×16" #: data/resources/ui/pages/drive.ui:102 data/resources/ui/pages/gpu.ui:113 #: data/resources/ui/pages/npu.ui:107 msgid "Link" msgstr "" #: data/resources/ui/pages/gpu.ui:37 msgid "GPU Frequency" msgstr "" #: data/resources/ui/pages/gpu.ui:50 msgid "Video Memory Frequency" msgstr "" #: data/resources/ui/pages/gpu.ui:90 data/resources/ui/pages/npu.ui:84 msgid "PCI Slot" msgstr "" #: data/resources/ui/pages/gpu.ui:99 data/resources/ui/pages/network.ui:67 #: data/resources/ui/pages/npu.ui:93 msgid "Driver Used" msgstr "" #: data/resources/ui/pages/gpu.ui:108 data/resources/ui/pages/npu.ui:102 msgid "Max Power Cap" msgstr "" #: data/resources/ui/pages/memory.ui:9 msgid "You need to authenticate to see memory properties" msgstr "" #: data/resources/ui/pages/memory.ui:10 msgid "Authenticate" msgstr "" #: data/resources/ui/pages/memory.ui:45 msgid "Slots Used" msgstr "" #: data/resources/ui/pages/memory.ui:54 msgid "Speed" msgstr "" #: data/resources/ui/pages/memory.ui:63 msgid "Form Factor" msgstr "" #: data/resources/ui/pages/memory.ui:81 msgid "Type Detail" msgstr "" #: data/resources/ui/pages/network.ui:35 msgid "Total Received" msgstr "" #: data/resources/ui/pages/network.ui:44 msgid "Total Sent" msgstr "" #: data/resources/ui/pages/network.ui:76 msgid "Interface" msgstr "" #: data/resources/ui/pages/network.ui:85 msgid "Hardware Address" msgstr "" #: data/resources/ui/pages/network.ui:94 msgid "Link Speed" msgstr "" #: data/resources/ui/pages/npu.ui:31 msgid "NPU Frequency" msgstr "" #: data/resources/ui/pages/npu.ui:44 msgid "Memory Frequency" msgstr "" #: data/resources/ui/pages/processes.ui:22 #: data/resources/ui/pages/processes.ui:74 msgid "Kill Processes" msgstr "" #: data/resources/ui/pages/processes.ui:26 #: data/resources/ui/pages/processes.ui:78 msgid "Halt Processes" msgstr "" #: data/resources/ui/pages/processes.ui:30 #: data/resources/ui/pages/processes.ui:82 msgid "Continue Processes" msgstr "" #: data/resources/ui/pages/processes.ui:103 msgid "Search processes" msgstr "" #: data/resources/ui/pages/processes.ui:133 #: data/resources/ui/pages/processes.ui:135 msgid "Show Process Options" msgstr "" #: data/resources/ui/pages/processes.ui:146 #: data/resources/ui/pages/processes.ui:148 msgid "Show Process Information" msgstr "" resources-1.9.1/po/ru.po000066400000000000000000001771151510634446000151570ustar00rootroot00000000000000# # nokyan , 2023. # msgid "" msgstr "" "Project-Id-Version: resources\n" "Report-Msgid-Bugs-To: https://github.com/nokyan/resources/issues/\n" "POT-Creation-Date: 2025-10-04 03:35+0000\n" "PO-Revision-Date: 2025-10-04 10:45+0300\n" "Last-Translator: Artur So \n" "Language-Team: Russian\n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n" "X-Generator: Poedit 3.7\n" #: data/net.nokyan.Resources.desktop.in.in:2 #: data/net.nokyan.Resources.metainfo.xml.in.in:4 #: data/resources/ui/window.ui:22 src/application.rs:272 msgid "Resources" msgstr "Ресурсы" #. Translators: The summary should be 35 characters or less according to Flathub appstream guidelines #: data/net.nokyan.Resources.desktop.in.in:3 #: data/net.nokyan.Resources.metainfo.xml.in.in:5 msgid "Keep an eye on system resources" msgstr "Отслеживайте системные ресурсы" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/net.nokyan.Resources.desktop.in.in:9 msgid "System;Resources;Monitor;Processes;Usage;Task;Manager;CPU;RAM;Memory;GPU;" msgstr "System;Resources;Monitor;Processes;Usage;Task;Manager;CPU;RAM;Memory;GPU;Система;Ресурсы;Процессы;ЦП;ОЗУ;Память;Видеоадаптер;Монитор;Использование;" #: data/net.nokyan.Resources.metainfo.xml.in.in:17 msgid "" "Resources allows you to check the utilization of your system resources and " "control your running processes and apps. It’s designed to be user-friendly " "and feel right at home on a modern desktop by using GNOME’s libadwaita." msgstr "" "Приложение позволяет вам проверять использование системных ресурсов и " "контролировать запущенные процессы и приложения. Оно разработано так, чтобы " "быть удобным для пользователя и чувствовать себя как дома на современном " "рабочем столе благодаря использованию библиотеки GNOME libadwaita." #: data/net.nokyan.Resources.metainfo.xml.in.in:20 msgid "Resources supports monitoring the following components:" msgstr "Приложение поддерживает мониторинг следующих компонентов:" #: data/net.nokyan.Resources.metainfo.xml.in.in:24 msgid "CPU" msgstr "ЦП" #: data/net.nokyan.Resources.metainfo.xml.in.in:25 #: data/resources/ui/dialogs/app_dialog.ui:82 #: data/resources/ui/dialogs/process_dialog.ui:64 #: data/resources/ui/dialogs/settings_dialog.ui:128 #: data/resources/ui/dialogs/settings_dialog.ui:220 #: data/resources/ui/window.ui:176 data/resources/ui/window.ui:183 #: src/ui/pages/applications/mod.rs:803 src/ui/pages/memory.rs:106 #: src/ui/pages/memory.rs:192 src/ui/pages/processes/mod.rs:1079 msgid "Memory" msgstr "Память" #: data/net.nokyan.Resources.metainfo.xml.in.in:26 #: data/resources/ui/dialogs/app_dialog.ui:140 #: data/resources/ui/dialogs/process_dialog.ui:118 #: data/resources/ui/dialogs/settings_dialog.ui:158 #: data/resources/ui/dialogs/settings_dialog.ui:250 #: src/ui/pages/applications/mod.rs:1181 src/ui/pages/gpu.rs:119 #: src/ui/pages/processes/mod.rs:1469 src/ui/window.rs:468 msgid "GPU" msgstr "Видеоадаптер" #: data/net.nokyan.Resources.metainfo.xml.in.in:27 #: data/resources/ui/dialogs/settings_dialog.ui:319 msgid "Network Interfaces" msgstr "Сетевые интерфейсы" #: data/net.nokyan.Resources.metainfo.xml.in.in:28 msgid "Storage Devices" msgstr "Устройства хранения" #: data/net.nokyan.Resources.metainfo.xml.in.in:29 msgid "Batteries" msgstr "Батареи" #: data/net.nokyan.Resources.metainfo.xml.in.in:51 msgid "Apps page in light theme" msgstr "Страница приложений в светлой теме" #: data/net.nokyan.Resources.metainfo.xml.in.in:55 msgid "Processes page in dark theme" msgstr "Страница процессов в темной теме" #: data/net.nokyan.Resources.metainfo.xml.in.in:59 msgid "Processor page in light theme" msgstr "Страница процессора в светлой теме" #: data/net.nokyan.Resources.metainfo.xml.in.in:63 msgid "Memory page in dark theme" msgstr "Страница памяти в темной теме" #: data/net.nokyan.Resources.metainfo.xml.in.in:67 msgid "GPU page in light theme" msgstr "Страница графики в светлой теме" #: data/net.nokyan.Resources.metainfo.xml.in.in:71 msgid "Drive page in dark theme" msgstr "Страница накопителя в темной теме" #: data/net.nokyan.Resources.metainfo.xml.in.in:75 msgid "Network Interface page in light theme" msgstr "Страница сетевого интерфейса в светлой теме" #: data/net.nokyan.Resources.metainfo.xml.in.in:79 msgid "Battery page in dark theme" msgstr "Страница батареи в темной теме" #: data/net.nokyan.Resources.policy.in.in:9 msgid "Control Process" msgstr "Управление процессом" #: data/net.nokyan.Resources.policy.in.in:10 msgid "" "Authentication is required to control superuser’s or other users’ processes" msgstr "" "Необходима аутентификация для управления процессами суперпользователя или " "других пользователей" #: data/resources/ui/dialogs/app_dialog.ui:7 msgid "App Information" msgstr "Информация о приложении" #: data/resources/ui/dialogs/app_dialog.ui:70 #: data/resources/ui/dialogs/process_dialog.ui:48 #: data/resources/ui/pages/battery.ui:22 data/resources/ui/pages/cpu.ui:37 #: data/resources/ui/pages/cpu.ui:50 data/resources/ui/pages/drive.ui:22 #: data/resources/ui/pages/gpu.ui:22 data/resources/ui/pages/memory.ui:31 #: data/resources/ui/pages/network.ui:22 data/resources/ui/pages/npu.ui:22 msgid "Usage" msgstr "Использование" #: data/resources/ui/dialogs/app_dialog.ui:73 #: data/resources/ui/dialogs/process_dialog.ui:55 #: data/resources/ui/dialogs/settings_dialog.ui:133 #: data/resources/ui/dialogs/settings_dialog.ui:225 #: data/resources/ui/window.ui:145 data/resources/ui/window.ui:152 #: src/ui/pages/applications/mod.rs:862 src/ui/pages/cpu.rs:128 #: src/ui/pages/processes/mod.rs:1138 src/ui/window.rs:290 msgid "Processor" msgstr "Процессор" #: data/resources/ui/dialogs/app_dialog.ui:91 #: data/resources/ui/dialogs/process_dialog.ui:73 #: data/resources/ui/dialogs/settings_dialog.ui:178 #: data/resources/ui/dialogs/settings_dialog.ui:290 #: src/ui/pages/applications/mod.rs:1420 src/ui/pages/memory.rs:198 #: src/ui/pages/processes/mod.rs:1954 msgid "Swap" msgstr "Подкачка" #: data/resources/ui/dialogs/app_dialog.ui:100 #: data/resources/ui/dialogs/process_dialog.ui:78 #: data/resources/ui/dialogs/settings_dialog.ui:138 #: data/resources/ui/dialogs/settings_dialog.ui:230 #: src/ui/pages/applications/mod.rs:926 src/ui/pages/processes/mod.rs:1202 msgid "Drive Read" msgstr "Чтение с диска" #: data/resources/ui/dialogs/app_dialog.ui:109 #: data/resources/ui/dialogs/process_dialog.ui:87 #: data/resources/ui/dialogs/settings_dialog.ui:143 #: data/resources/ui/dialogs/settings_dialog.ui:235 #: src/ui/pages/applications/mod.rs:991 src/ui/pages/processes/mod.rs:1269 msgid "Drive Read Total" msgstr "Общее чтение с диска" #: data/resources/ui/dialogs/app_dialog.ui:118 #: data/resources/ui/dialogs/process_dialog.ui:96 #: data/resources/ui/dialogs/settings_dialog.ui:148 #: data/resources/ui/dialogs/settings_dialog.ui:240 #: src/ui/pages/applications/mod.rs:1052 src/ui/pages/processes/mod.rs:1336 msgid "Drive Write" msgstr "Запись на диск" #: data/resources/ui/dialogs/app_dialog.ui:127 #: data/resources/ui/dialogs/process_dialog.ui:105 #: data/resources/ui/dialogs/settings_dialog.ui:153 #: data/resources/ui/dialogs/settings_dialog.ui:245 #: src/ui/pages/applications/mod.rs:1119 src/ui/pages/processes/mod.rs:1403 msgid "Drive Write Total" msgstr "Общая запись на диск" #: data/resources/ui/dialogs/app_dialog.ui:149 #: data/resources/ui/dialogs/process_dialog.ui:127 #: data/resources/ui/dialogs/settings_dialog.ui:163 #: data/resources/ui/dialogs/settings_dialog.ui:255 #: src/ui/pages/applications/mod.rs:1361 src/ui/pages/processes/mod.rs:1650 msgid "Video Memory" msgstr "Видеопамять" #: data/resources/ui/dialogs/app_dialog.ui:158 #: data/resources/ui/dialogs/process_dialog.ui:136 #: data/resources/ui/dialogs/settings_dialog.ui:168 #: data/resources/ui/dialogs/settings_dialog.ui:260 #: src/ui/pages/applications/mod.rs:1240 src/ui/pages/processes/mod.rs:1528 msgid "Video Encoder" msgstr "Видеокодер" #: data/resources/ui/dialogs/app_dialog.ui:167 #: data/resources/ui/dialogs/process_dialog.ui:145 #: data/resources/ui/dialogs/settings_dialog.ui:173 #: data/resources/ui/dialogs/settings_dialog.ui:265 #: src/ui/pages/applications/mod.rs:1301 src/ui/pages/processes/mod.rs:1589 msgid "Video Decoder" msgstr "Видеодекодер" #: data/resources/ui/dialogs/app_dialog.ui:174 #: data/resources/ui/dialogs/process_dialog.ui:179 #: data/resources/ui/pages/battery.ui:33 data/resources/ui/pages/cpu.ui:83 #: data/resources/ui/pages/drive.ui:54 data/resources/ui/pages/gpu.ui:74 #: data/resources/ui/pages/memory.ui:42 data/resources/ui/pages/network.ui:51 #: data/resources/ui/pages/npu.ui:68 msgid "Properties" msgstr "Свойства" #: data/resources/ui/dialogs/app_dialog.ui:180 msgid "ID" msgstr "ИД" #: data/resources/ui/dialogs/app_dialog.ui:190 #: data/resources/ui/dialogs/process_dialog.ui:195 msgid "Running Since" msgstr "Выполняется c" #: data/resources/ui/dialogs/app_dialog.ui:198 msgid "Running Processes" msgstr "Выполняемые процессы" #: data/resources/ui/dialogs/app_dialog.ui:207 #: data/resources/ui/dialogs/process_dialog.ui:231 msgid "Containerized" msgstr "В контейнере" #: data/resources/ui/dialogs/process_dialog.ui:7 msgid "Process Information" msgstr "Информация о процессе" #: data/resources/ui/dialogs/process_dialog.ui:154 #: data/resources/ui/dialogs/settings_dialog.ui:270 #: src/ui/pages/processes/mod.rs:1710 msgid "Total CPU Time" msgstr "Общее время ЦП" #: data/resources/ui/dialogs/process_dialog.ui:163 #: data/resources/ui/dialogs/settings_dialog.ui:275 #: src/ui/pages/processes/mod.rs:1769 msgid "User CPU Time" msgstr "Пользовательское время ЦП" #: data/resources/ui/dialogs/process_dialog.ui:172 #: data/resources/ui/dialogs/settings_dialog.ui:280 #: src/ui/pages/processes/mod.rs:1828 msgid "System CPU Time" msgstr "Системное время ЦП" #: data/resources/ui/dialogs/process_dialog.ui:186 #: data/resources/ui/dialogs/settings_dialog.ui:210 #: src/ui/pages/processes/mod.rs:972 msgid "Process ID" msgstr "ИД процесса" #: data/resources/ui/dialogs/process_dialog.ui:204 msgid "Commandline" msgstr "Командная строка" #: data/resources/ui/dialogs/process_dialog.ui:213 #: data/resources/ui/dialogs/settings_dialog.ui:215 #: src/ui/pages/processes/mod.rs:1025 msgid "User" msgstr "Пользователь" #: data/resources/ui/dialogs/process_dialog.ui:222 msgid "Control Group" msgstr "Контрольная группа" #: data/resources/ui/dialogs/process_options_dialog.ui:7 #: data/resources/ui/dialogs/process_options_dialog.ui:69 msgid "Process Options" msgstr "Параметры процесса" #: data/resources/ui/dialogs/process_options_dialog.ui:29 msgid "Apply" msgstr "Применить" #: data/resources/ui/dialogs/process_options_dialog.ui:72 msgid "Niceness" msgstr "Уступчивость" #: data/resources/ui/dialogs/process_options_dialog.ui:73 msgid "" "The priority of a process is given by its niceness. A lower niceness value " "correspond to a higher priority." msgstr "" "Приоритет процесса определяется его уступчивостью. Меньшее значение " "уступчивости соответствует более высокому приоритету." #: data/resources/ui/dialogs/process_options_dialog.ui:87 #: data/resources/ui/dialogs/settings_dialog.ui:285 #: src/ui/pages/processes/mod.rs:1887 msgid "Priority" msgstr "Приоритет" #: data/resources/ui/dialogs/process_options_dialog.ui:91 msgctxt "process priority" msgid "Very High" msgstr "Очень высокий" #: data/resources/ui/dialogs/process_options_dialog.ui:92 msgctxt "process priority" msgid "High" msgstr "Высокий" #: data/resources/ui/dialogs/process_options_dialog.ui:93 msgctxt "process priority" msgid "Normal" msgstr "Нормальный" #: data/resources/ui/dialogs/process_options_dialog.ui:94 msgctxt "process priority" msgid "Low" msgstr "Низкий" #: data/resources/ui/dialogs/process_options_dialog.ui:95 msgctxt "process priority" msgid "Very Low" msgstr "Очень низкий" #: data/resources/ui/dialogs/process_options_dialog.ui:103 msgid "Processor Affinity" msgstr "Привязка к процессору" #: data/resources/ui/dialogs/process_options_dialog.ui:108 msgid "Toggle All" msgstr "Переключить все" #: data/resources/ui/dialogs/process_options_dialog.ui:111 msgid "Select which processor cores the process is allowed to run on" msgstr "Выберите, на каких ядрах процессора может выполняться процесс" #: data/resources/ui/dialogs/settings_dialog.ui:7 msgid "General" msgstr "Общие" #: data/resources/ui/dialogs/settings_dialog.ui:10 msgid "Units" msgstr "Единицы измерения" #: data/resources/ui/dialogs/settings_dialog.ui:13 msgid "Data Unit Prefix" msgstr "Префикс единицы измерения" #: data/resources/ui/dialogs/settings_dialog.ui:17 msgid "Decimal" msgstr "Десятичный" #: data/resources/ui/dialogs/settings_dialog.ui:18 msgid "Binary" msgstr "Двоичный" #: data/resources/ui/dialogs/settings_dialog.ui:26 msgid "Show Network Speeds in Bits per Second" msgstr "Показывать скорость сети в битах в секунду" #: data/resources/ui/dialogs/settings_dialog.ui:31 msgid "Temperature Unit" msgstr "Единица измерения температуры" #: data/resources/ui/dialogs/settings_dialog.ui:35 msgid "Celsius" msgstr "Цельсий" #: data/resources/ui/dialogs/settings_dialog.ui:36 msgid "Kelvin" msgstr "Кельвин" #: data/resources/ui/dialogs/settings_dialog.ui:37 msgid "Fahrenheit" msgstr "Фаренгейт" #: data/resources/ui/dialogs/settings_dialog.ui:47 msgid "User Interface" msgstr "Пользовательский интерфейс" #: data/resources/ui/dialogs/settings_dialog.ui:50 msgid "Refresh Speed" msgstr "Скорость обновления" #: data/resources/ui/dialogs/settings_dialog.ui:51 msgid "Higher refresh speeds can lead to higher processor usage" msgstr "" "Более высокая скорость обновления может привести к увеличению нагрузки на " "процессор" #: data/resources/ui/dialogs/settings_dialog.ui:55 msgctxt "UI refresh speed" msgid "Very Slow" msgstr "Очень медленно" #: data/resources/ui/dialogs/settings_dialog.ui:56 msgctxt "UI refresh speed" msgid "Slow" msgstr "Медленно" #: data/resources/ui/dialogs/settings_dialog.ui:57 msgctxt "UI refresh speed" msgid "Normal" msgstr "Нормально" #: data/resources/ui/dialogs/settings_dialog.ui:58 msgctxt "UI refresh speed" msgid "Fast" msgstr "Быстро" #: data/resources/ui/dialogs/settings_dialog.ui:59 msgctxt "UI refresh speed" msgid "Very Fast" msgstr "Очень быстро" #: data/resources/ui/dialogs/settings_dialog.ui:67 msgid "Show Graph Grids" msgstr "Показывать сетки графиков" #: data/resources/ui/dialogs/settings_dialog.ui:72 msgid "Graph Data Points" msgstr "Точки данных на графике" #: data/resources/ui/dialogs/settings_dialog.ui:86 msgid "Show Usage Details in Sidebar" msgstr "Показывать подробную информацию об использовании в боковой панели" #: data/resources/ui/dialogs/settings_dialog.ui:87 msgid "If enabled, the usage along with other information will be displayed" msgstr "" "Если включено, на экране будет отображаться информация об использовании и " "другие сведения" #: data/resources/ui/dialogs/settings_dialog.ui:92 msgid "Show Device Descriptions in Sidebar" msgstr "Показывать описания устройств в боковой панели" #: data/resources/ui/dialogs/settings_dialog.ui:93 msgid "" "If enabled, a device identifier like its name or device type will be " "displayed" msgstr "" "Если включено, будет отображаться идентификатор устройства, например его " "название или тип устройства" #: data/resources/ui/dialogs/settings_dialog.ui:98 msgid "Sidebar Meter Type" msgstr "Тип счетчика боковой панели" #: data/resources/ui/dialogs/settings_dialog.ui:102 msgid "Bar" msgstr "Панель" #: data/resources/ui/dialogs/settings_dialog.ui:103 msgid "Graph" msgstr "График" #: data/resources/ui/dialogs/settings_dialog.ui:111 msgid "Normalize Processor Usage" msgstr "Нормализация использования процессора" #: data/resources/ui/dialogs/settings_dialog.ui:112 msgid "" "If enabled, the total usage of all cores will be divided by the amount of " "cores" msgstr "" "Если включено, общее использование всех ядер будет делиться на количество " "ядер" #: data/resources/ui/dialogs/settings_dialog.ui:122 #: data/resources/ui/window.ui:65 data/resources/ui/window.ui:72 #: src/ui/pages/applications/mod.rs:131 msgid "Apps" msgstr "Приложения" #: data/resources/ui/dialogs/settings_dialog.ui:125 #: data/resources/ui/dialogs/settings_dialog.ui:207 msgid "Information Columns" msgstr "Информационные столбцы" #: data/resources/ui/dialogs/settings_dialog.ui:183 #: data/resources/ui/dialogs/settings_dialog.ui:295 #: src/ui/pages/applications/mod.rs:1479 src/ui/pages/processes/mod.rs:2013 msgid "Combined Memory" msgstr "Суммарная память" #: data/resources/ui/dialogs/settings_dialog.ui:193 #: data/resources/ui/window.ui:105 data/resources/ui/window.ui:112 #: src/ui/pages/processes/mod.rs:175 msgid "Processes" msgstr "Процессы" #: data/resources/ui/dialogs/settings_dialog.ui:196 #: data/resources/ui/pages/cpu.ui:22 data/resources/ui/pages/processes.ui:56 msgid "Options" msgstr "Параметры" #: data/resources/ui/dialogs/settings_dialog.ui:199 msgid "Show Niceness Values" msgstr "Показывать значения уступчивости" #: data/resources/ui/dialogs/settings_dialog.ui:200 msgid "" "Display priorities as niceness to allow for more fine-grained adjustments" msgstr "Отображать приоритеты в виде уступчивости для более тонкой настройки" #: data/resources/ui/dialogs/settings_dialog.ui:305 msgid "Devices" msgstr "Устройства" #: data/resources/ui/dialogs/settings_dialog.ui:308 msgid "Drives" msgstr "Диски" #: data/resources/ui/dialogs/settings_dialog.ui:311 msgid "Show Virtual Drives" msgstr "Показывать виртуальные диски" #: data/resources/ui/dialogs/settings_dialog.ui:312 msgid "Virtual drives are for example ZFS volumes or mapped devices" msgstr "" "Виртуальные диски - это, например, тома ZFS или сопоставленные устройства" #: data/resources/ui/dialogs/settings_dialog.ui:322 msgid "Show Virtual Network Interfaces" msgstr "Показывать виртуальные сетевые интерфейсы" #: data/resources/ui/dialogs/settings_dialog.ui:323 msgid "Virtual network interfaces are for example bridges or VPN tunnels" msgstr "Виртуальные сетевые интерфейсы - это, например, мосты или VPN-туннели" #: data/resources/ui/pages/applications.ui:6 #: data/resources/ui/pages/applications.ui:26 #: src/ui/pages/applications/mod.rs:1563 msgid "Kill App" msgstr "Убить приложение" #: data/resources/ui/pages/applications.ui:10 #: data/resources/ui/pages/applications.ui:30 #: src/ui/pages/applications/mod.rs:1562 msgid "Halt App" msgstr "Остановить приложение" #: data/resources/ui/pages/applications.ui:14 #: data/resources/ui/pages/applications.ui:34 #: src/ui/pages/applications/mod.rs:1564 msgid "Continue App" msgstr "Продолжить приложение" #: data/resources/ui/pages/applications.ui:22 #: data/resources/ui/pages/applications.ui:98 #: src/ui/pages/applications/mod.rs:1561 msgid "End App" msgstr "Завершить приложение" #: data/resources/ui/pages/applications.ui:40 #: data/resources/ui/pages/processes.ui:62 msgid "Information" msgstr "Информация" #: data/resources/ui/pages/applications.ui:57 msgid "Search applications" msgstr "Поиск приложений" #: data/resources/ui/pages/applications.ui:87 #: data/resources/ui/pages/applications.ui:89 msgid "Show App Information" msgstr "Показать информацию о приложении" #: data/resources/ui/pages/battery.ui:36 msgid "Battery Health" msgstr "Здоровье батареи" #: data/resources/ui/pages/battery.ui:45 msgid "Design Capacity" msgstr "Проектная емкость" #: data/resources/ui/pages/battery.ui:54 msgid "Charge Cycles" msgstr "Циклы заряда" #: data/resources/ui/pages/battery.ui:63 msgid "Technology" msgstr "Технология" #: data/resources/ui/pages/battery.ui:72 data/resources/ui/pages/gpu.ui:81 #: data/resources/ui/pages/network.ui:58 data/resources/ui/pages/npu.ui:75 msgid "Manufacturer" msgstr "Производитель" #: data/resources/ui/pages/battery.ui:81 msgid "Model Name" msgstr "Название модели" #: data/resources/ui/pages/battery.ui:90 data/resources/ui/pages/drive.ui:66 msgid "Device" msgstr "Устройство" #: data/resources/ui/pages/cpu.ui:26 msgid "Show Usages of Logical CPUs" msgstr "Показывать использование логических процессоров" #: data/resources/ui/pages/cpu.ui:75 data/resources/ui/pages/gpu.ui:66 #: data/resources/ui/pages/npu.ui:60 msgid "Sensors" msgstr "Датчики" #: data/resources/ui/pages/cpu.ui:90 msgid "Max Frequency" msgstr "Максимальная частота" #: data/resources/ui/pages/cpu.ui:99 msgid "Logical Cores" msgstr "Логические ядра" #: data/resources/ui/pages/cpu.ui:108 msgid "Physical Cores" msgstr "Физические ядра" #: data/resources/ui/pages/cpu.ui:117 msgid "Sockets" msgstr "Сокеты" #: data/resources/ui/pages/cpu.ui:126 msgid "Uptime" msgstr "Время работы" #: data/resources/ui/pages/cpu.ui:135 msgid "Virtualization" msgstr "Виртуализация" #: data/resources/ui/pages/cpu.ui:144 msgid "Architecture" msgstr "Архитектура" #: data/resources/ui/pages/drive.ui:38 msgid "Total Read" msgstr "Всего прочитано" #: data/resources/ui/pages/drive.ui:47 msgid "Total Written" msgstr "Всего записано" #: data/resources/ui/pages/drive.ui:57 data/resources/ui/pages/memory.ui:72 msgid "Type" msgstr "Тип" #: data/resources/ui/pages/drive.ui:75 msgid "Capacity" msgstr "Емкость" #: data/resources/ui/pages/drive.ui:84 msgid "Writable" msgstr "Записываемый" #: data/resources/ui/pages/drive.ui:93 msgid "Removable" msgstr "Съемный" #. Translators: "Link" refers to something like "PCIe 4.0 ×16" #: data/resources/ui/pages/drive.ui:102 data/resources/ui/pages/gpu.ui:113 #: data/resources/ui/pages/network.ui:103 data/resources/ui/pages/npu.ui:107 msgid "Link" msgstr "Соединение" #: data/resources/ui/pages/gpu.ui:37 msgid "GPU Frequency" msgstr "Частота графического процессора" #: data/resources/ui/pages/gpu.ui:50 msgid "Video Memory Frequency" msgstr "Частота видеопамяти" #: data/resources/ui/pages/gpu.ui:55 data/resources/ui/pages/npu.ui:49 #: src/ui/pages/battery.rs:217 msgid "Power Usage" msgstr "Потребление энергии" #: data/resources/ui/pages/gpu.ui:90 data/resources/ui/pages/npu.ui:84 msgid "PCI Slot" msgstr "PCI-слот" #: data/resources/ui/pages/gpu.ui:99 data/resources/ui/pages/network.ui:67 #: data/resources/ui/pages/npu.ui:93 msgid "Driver Used" msgstr "Используемый драйвер" #: data/resources/ui/pages/gpu.ui:108 data/resources/ui/pages/npu.ui:102 msgid "Max Power Cap" msgstr "Максимальная мощность" #: data/resources/ui/pages/memory.ui:9 msgid "You need to authenticate to see memory properties" msgstr "Вам необходимо пройти аутентификацию, чтобы увидеть свойства памяти" #: data/resources/ui/pages/memory.ui:10 msgid "Authenticate" msgstr "Аутентификация" #: data/resources/ui/pages/memory.ui:45 msgid "Slots Used" msgstr "Использовано слотов" #: data/resources/ui/pages/memory.ui:54 msgid "Speed" msgstr "Скорость" #: data/resources/ui/pages/memory.ui:63 msgid "Form Factor" msgstr "Форм-фактор" #: data/resources/ui/pages/memory.ui:81 msgid "Type Detail" msgstr "Подробный тип" #: data/resources/ui/pages/network.ui:35 msgid "Total Received" msgstr "Всего получено" #: data/resources/ui/pages/network.ui:44 msgid "Total Sent" msgstr "Всего отправлено" #: data/resources/ui/pages/network.ui:76 msgid "Interface" msgstr "Интерфейс" #: data/resources/ui/pages/network.ui:85 msgid "Hardware Address" msgstr "Аппаратный адрес" #: data/resources/ui/pages/network.ui:94 msgid "Network Name" msgstr "Название сети" #: data/resources/ui/pages/network.ui:112 msgid "Link Speed" msgstr "Скорость соединения" #: data/resources/ui/pages/npu.ui:31 msgid "NPU Frequency" msgstr "Частота нейропроцессора" #: data/resources/ui/pages/npu.ui:44 msgid "Memory Frequency" msgstr "Частота памяти" #: data/resources/ui/pages/processes.ui:6 #: data/resources/ui/pages/processes.ui:42 src/ui/pages/processes/mod.rs:2126 msgid "Kill Process" msgstr "Убить процесс" #: data/resources/ui/pages/processes.ui:10 #: data/resources/ui/pages/processes.ui:46 src/ui/pages/processes/mod.rs:2125 msgid "Halt Process" msgstr "Остановить процесс" #: data/resources/ui/pages/processes.ui:14 #: data/resources/ui/pages/processes.ui:50 src/ui/pages/processes/mod.rs:2127 msgid "Continue Process" msgstr "Продолжить процесс" #: data/resources/ui/pages/processes.ui:22 #: data/resources/ui/pages/processes.ui:74 msgid "Kill Processes" msgstr "Убить процессы" #: data/resources/ui/pages/processes.ui:26 #: data/resources/ui/pages/processes.ui:78 msgid "Halt Processes" msgstr "Остановить процессы" #: data/resources/ui/pages/processes.ui:30 #: data/resources/ui/pages/processes.ui:82 msgid "Continue Processes" msgstr "Продолжить процессы" #: data/resources/ui/pages/processes.ui:38 #: data/resources/ui/pages/processes.ui:157 src/ui/pages/processes/mod.rs:523 #: src/ui/pages/processes/mod.rs:2124 msgid "End Process" msgstr "Завершить процесс" #: data/resources/ui/pages/processes.ui:70 src/ui/pages/processes/mod.rs:527 msgid "End Processes" msgstr "Завершить процессы" #: data/resources/ui/pages/processes.ui:103 msgid "Search processes" msgstr "Поиск процессов" #: data/resources/ui/pages/processes.ui:133 #: data/resources/ui/pages/processes.ui:135 msgid "Show Process Options" msgstr "Показать параметры процесса" #: data/resources/ui/pages/processes.ui:146 #: data/resources/ui/pages/processes.ui:148 msgid "Show Process Information" msgstr "Показать информацию о процессе" #: data/resources/ui/shortcuts.ui:6 msgctxt "shortcut window" msgid "General" msgstr "Общие" #: data/resources/ui/shortcuts.ui:9 msgctxt "shortcut window" msgid "Preferences" msgstr "Настройки" #: data/resources/ui/shortcuts.ui:15 msgctxt "shortcut window" msgid "Show Shortcuts" msgstr "Показать комбинации клавиш" #: data/resources/ui/shortcuts.ui:21 msgctxt "shortcut window" msgid "Quit" msgstr "Выйти" #: data/resources/ui/shortcuts.ui:29 msgctxt "shortcut window" msgid "Apps/Processes" msgstr "Приложения/Процессы" #: data/resources/ui/shortcuts.ui:32 msgctxt "shortcut window" msgid "Toggle Search Field" msgstr "Переключить поле поиска" #: data/resources/ui/shortcuts.ui:38 msgctxt "shortcut window" msgid "End App/Process" msgstr "Завершить приложение/процесс" #: data/resources/ui/shortcuts.ui:44 msgctxt "shortcut window" msgid "Kill App/Process" msgstr "Убить приложение/процесс" #: data/resources/ui/shortcuts.ui:50 msgctxt "shortcut window" msgid "Halt App/Process" msgstr "Остановить приложение/процесс" #: data/resources/ui/shortcuts.ui:56 msgctxt "shortcut window" msgid "Continue App/Process" msgstr "Продолжить приложение/процесс" #: data/resources/ui/shortcuts.ui:62 msgctxt "shortcut window" msgid "Show Information for App/Process" msgstr "Показать информацию о приложении/процессе" #: data/resources/ui/shortcuts.ui:68 msgctxt "shortcut window" msgid "Show Process Options" msgstr "Показать параметры процесса" #: data/resources/ui/window.ui:6 msgid "Preferences" msgstr "Настройки" #: data/resources/ui/window.ui:10 msgid "Keyboard Shortcuts" msgstr "Комбинации клавиш" #: data/resources/ui/window.ui:14 msgid "About Resources" msgstr "О приложении" #: data/resources/ui/window.ui:88 data/resources/ui/window.ui:128 msgid "Search" msgstr "Поиск" #: data/resources/ui/window.ui:90 data/resources/ui/window.ui:130 msgid "Toggle search field" msgstr "Переключить поле поиска" #: src/application.rs:274 msgid "The Nalux Team" msgstr "The Nalux Team" #: src/application.rs:282 msgid "Report Issues" msgstr "Сообщить о проблемах" #. Translator credits. Replace "translator-credits" with your name/username, and optionally an email or URL. #. One name per line, please do not remove previous names. #: src/application.rs:288 msgid "translator-credits" msgstr "" "Сергей Ворон \n" "Aleksandr Melman " #: src/application.rs:289 msgid "Icon by" msgstr "Значок от" #: src/ui/dialogs/app_dialog.rs:155 src/ui/dialogs/process_dialog.rs:133 #: src/ui/dialogs/process_dialog.rs:137 src/ui/dialogs/process_dialog.rs:146 #: src/ui/dialogs/process_dialog.rs:148 src/ui/dialogs/process_dialog.rs:171 #: src/ui/dialogs/process_dialog.rs:178 src/ui/dialogs/process_dialog.rs:185 #: src/ui/dialogs/process_dialog.rs:192 src/ui/pages/applications/mod.rs:948 #: src/ui/pages/applications/mod.rs:1074 src/ui/pages/battery.rs:205 #: src/ui/pages/battery.rs:225 src/ui/pages/battery.rs:231 #: src/ui/pages/battery.rs:234 src/ui/pages/battery.rs:265 #: src/ui/pages/battery.rs:289 src/ui/pages/battery.rs:291 #: src/ui/pages/battery.rs:301 src/ui/pages/cpu.rs:243 src/ui/pages/cpu.rs:258 #: src/ui/pages/cpu.rs:278 src/ui/pages/cpu.rs:284 src/ui/pages/cpu.rs:290 #: src/ui/pages/cpu.rs:296 src/ui/pages/cpu.rs:300 src/ui/pages/cpu.rs:303 #: src/ui/pages/cpu.rs:341 src/ui/pages/cpu.rs:448 src/ui/pages/drive.rs:319 #: src/ui/pages/drive.rs:350 src/ui/pages/drive.rs:352 #: src/ui/pages/drive.rs:381 src/ui/pages/drive.rs:383 #: src/ui/pages/drive.rs:399 src/ui/pages/drive.rs:400 #: src/ui/pages/drive.rs:407 src/ui/pages/drive.rs:417 #: src/ui/pages/drive.rs:427 src/ui/pages/drive.rs:433 src/ui/pages/gpu.rs:245 #: src/ui/pages/gpu.rs:252 src/ui/pages/gpu.rs:297 src/ui/pages/gpu.rs:322 #: src/ui/pages/gpu.rs:325 src/ui/pages/gpu.rs:336 src/ui/pages/gpu.rs:377 #: src/ui/pages/gpu.rs:384 src/ui/pages/gpu.rs:396 src/ui/pages/gpu.rs:403 #: src/ui/pages/gpu.rs:407 src/ui/pages/gpu.rs:437 src/ui/pages/gpu.rs:443 #: src/ui/pages/memory.rs:227 src/ui/pages/memory.rs:228 #: src/ui/pages/memory.rs:232 src/ui/pages/memory.rs:233 #: src/ui/pages/memory.rs:237 src/ui/pages/memory.rs:238 #: src/ui/pages/memory.rs:266 src/ui/pages/memory.rs:327 #: src/ui/pages/network.rs:252 src/ui/pages/network.rs:259 #: src/ui/pages/network.rs:266 src/ui/pages/network.rs:272 #: src/ui/pages/network.rs:275 src/ui/pages/network.rs:285 #: src/ui/pages/network.rs:292 src/ui/pages/network.rs:302 #: src/ui/pages/network.rs:370 src/ui/pages/network.rs:373 #: src/ui/pages/network.rs:375 src/ui/pages/network.rs:404 #: src/ui/pages/network.rs:407 src/ui/pages/network.rs:409 #: src/ui/pages/network.rs:417 src/ui/pages/network.rs:424 #: src/ui/pages/network.rs:434 src/ui/pages/processes/mod.rs:1224 #: src/ui/pages/processes/mod.rs:1291 src/ui/pages/processes/mod.rs:1358 #: src/ui/pages/processes/mod.rs:1425 src/ui/pages/processes/mod.rs:1911 #: src/ui/pages/processes/mod.rs:1913 src/utils/battery.rs:152 #: src/utils/drive.rs:137 src/utils/gpu/mod.rs:279 src/utils/gpu/mod.rs:291 #: src/utils/link/mod.rs:61 src/utils/npu/mod.rs:244 src/utils/npu/mod.rs:250 msgid "N/A" msgstr "Н/Д" #: src/ui/dialogs/process_options_dialog.rs:147 src/ui/pages/cpu.rs:257 #: src/ui/pages/cpu.rs:417 src/ui/pages/cpu.rs:421 msgid "CPU {}" msgstr "ЦП {}" #: src/ui/pages/applications/application_entry.rs:190 src/ui/pages/drive.rs:414 #: src/ui/pages/drive.rs:424 src/ui/pages/processes/process_entry.rs:211 msgid "No" msgstr "Нет" #: src/ui/pages/applications/application_entry.rs:191 #: src/ui/pages/processes/process_entry.rs:212 msgid "Yes (Flatpak)" msgstr "Да (Flatpak)" #: src/ui/pages/applications/application_entry.rs:192 #: src/ui/pages/processes/process_entry.rs:213 msgid "Yes (Snap)" msgstr "Да (Snap)" #: src/ui/pages/applications/mod.rs:660 msgid "Running Apps: {}" msgstr "Запущенные приложения: {}" #: src/ui/pages/applications/mod.rs:700 src/ui/pages/processes/mod.rs:862 msgid "Cancel" msgstr "Отменить" #: src/ui/pages/applications/mod.rs:746 msgid "App" msgstr "Приложение" #: src/ui/pages/applications/mod.rs:1539 src/ui/pages/processes/mod.rs:2073 msgid "End {}?" msgstr "Завершить {}?" #: src/ui/pages/applications/mod.rs:1540 src/ui/pages/processes/mod.rs:2074 msgid "Halt {}?" msgstr "Остановить {}?" #: src/ui/pages/applications/mod.rs:1541 src/ui/pages/processes/mod.rs:2075 msgid "Kill {}?" msgstr "Убить {}?" #: src/ui/pages/applications/mod.rs:1542 src/ui/pages/processes/mod.rs:2076 msgid "Continue {}?" msgstr "Продолжить {}?" #: src/ui/pages/applications/mod.rs:1548 src/ui/pages/processes/mod.rs:2111 msgid "Unsaved work might be lost." msgstr "Несохраненная работа может быть потеряна." #: src/ui/pages/applications/mod.rs:1550 msgid "" "Halting an app can come with serious risks such as losing data and security " "implications. Use with caution." msgstr "" "Остановка приложения может сопровождаться серьезными рисками, такими как " "потеря данных и последствия для безопасности. Используйте с осторожностью." #: src/ui/pages/applications/mod.rs:1553 msgid "" "Killing an app can come with serious risks such as losing data and security " "implications. Use with caution." msgstr "" "Закрытие приложения может сопровождаться серьезными рисками, такими как " "потеря данных и последствия для безопасности. Используйте с осторожностью." #: src/ui/pages/battery.rs:102 src/utils/battery.rs:258 msgid "Battery" msgstr "Батарея" #: src/ui/pages/battery.rs:210 msgid "Battery Charge" msgstr "Заряд батареи" #: src/ui/pages/battery.rs:279 src/ui/pages/cpu.rs:438 #: src/ui/pages/drive.rs:344 src/ui/pages/drive.rs:375 src/ui/pages/gpu.rs:429 #: src/ui/pages/network.rs:362 src/ui/pages/network.rs:396 msgid "Highest:" msgstr "Наибольшее:" #: src/ui/pages/cpu.rs:242 src/ui/pages/gpu.rs:212 msgid "Total Usage" msgstr "Общее использование" #: src/ui/pages/cpu.rs:271 src/ui/pages/gpu.rs:239 msgid "Temperature" msgstr "Температура" #: src/ui/pages/drive.rs:126 msgid "Drive" msgstr "Диск" #: src/ui/pages/drive.rs:236 msgid "Drive Activity" msgstr "Активность диска" #: src/ui/pages/drive.rs:243 msgid "Read Speed" msgstr "Скорость чтения" #: src/ui/pages/drive.rs:247 msgid "Write Speed" msgstr "Скорость записи" #: src/ui/pages/drive.rs:412 src/ui/pages/drive.rs:422 msgid "Yes" msgstr "Да" #. Translators: This is an abbreviation for "Read" and "Write". This is displayed in the sidebar so your #. translation should preferably be quite short or an abbreviation #: src/ui/pages/drive.rs:440 msgid "R: {} · W: {}" msgstr "Ч: {} · З: {}" #: src/ui/pages/gpu.rs:220 msgid "Video Encoder/Decoder Usage" msgstr "Использование видеокодера/декодера" #: src/ui/pages/gpu.rs:226 msgid "Video Encoder Usage" msgstr "Использование видеокодера" #: src/ui/pages/gpu.rs:231 msgid "Video Decoder Usage" msgstr "Использование видеодекодера" #: src/ui/pages/gpu.rs:236 msgid "Video Memory Usage" msgstr "Использование видеопамяти" #. Translators: This will be displayed in the sidebar, please try to keep your translation as short as (or even #. shorter than) 'Memory' #: src/ui/pages/gpu.rs:415 msgid "Memory: {}" msgstr "Память: {}" #: src/ui/pages/memory.rs:262 msgid "{} of {}" msgstr "{} из {}" #: src/ui/pages/memory.rs:265 msgid "{} MT/s" msgstr "{} МТ/с" #. Translators: This will be displayed in the sidebar, so your translation for "Swap" should #. preferably be quite short or an abbreviation #: src/ui/pages/memory.rs:346 msgid "{} / {} · Swap: {} %" msgstr "{} / {} · Подкачка: {} %" #: src/ui/pages/network.rs:127 src/utils/network.rs:135 msgid "Network Interface" msgstr "Сетевой интерфейс" #: src/ui/pages/network.rs:241 msgid "Receiving" msgstr "Получение" #: src/ui/pages/network.rs:245 msgid "Sending" msgstr "Отправка" #. Translators: This is an abbreviation for "Receive" and "Send". This is displayed in the sidebar so #. your translation should preferably be quite short or an abbreviation #: src/ui/pages/network.rs:445 msgid "R: {} · S: {}" msgstr "П: {} · О: {}" #: src/ui/pages/processes/mod.rs:813 msgid "Running Processes: {}" msgstr "Запущенные процессы: {}" #: src/ui/pages/processes/mod.rs:911 msgid "Process" msgstr "Процесс" #: src/ui/pages/processes/mod.rs:2083 msgid "End process?" msgid_plural "End {} processes?" msgstr[0] "Завершить процесс?" msgstr[1] "Завершить {} процесса?" msgstr[2] "Завершить {} процессов?" #: src/ui/pages/processes/mod.rs:2089 msgid "Halt process?" msgid_plural "Halt {} processes?" msgstr[0] "Остановить процесс?" msgstr[1] "Остановить {} процесса?" msgstr[2] "Остановить {} процессов?" #: src/ui/pages/processes/mod.rs:2095 src/ui/pages/processes/mod.rs:2101 msgid "Kill process?" msgid_plural "Kill {} processes?" msgstr[0] "Убить процесс?" msgstr[1] "Убить {} процесса?" msgstr[2] "Убить {} процессов?" #: src/ui/pages/processes/mod.rs:2113 msgid "" "Halting a process can come with serious risks such as losing data and " "security implications. Use with caution." msgstr "" "Остановка процесса может сопровождаться серьезными рисками, такими как " "потеря данных и последствия для безопасности. Используйте с осторожностью." #: src/ui/pages/processes/mod.rs:2116 msgid "" "Killing a process can come with serious risks such as losing data and " "security implications. Use with caution." msgstr "" "Убийство процесса может сопровождаться серьезными рисками, такими как потеря " "данных и последствия для безопасности. Используйте с осторожностью." #: src/ui/window.rs:466 msgid "GPU {}" msgstr "Видеоадаптер {}" #: src/ui/window.rs:496 msgid "NPU {}" msgstr "Нейропроцессор {}" #: src/ui/window.rs:498 msgid "NPU" msgstr "Нейропроцессор" #: src/ui/window.rs:1174 msgid "Successfully adjusted {}" msgstr "Успешно настроено {}" #: src/ui/window.rs:1175 msgid "There was a problem adjusting {}" msgstr "Не удалось настроить {}" #: src/ui/window.rs:1257 msgid "Successfully ended {}" msgstr "Успешно завершено {}" #: src/ui/window.rs:1258 msgid "Successfully halted {}" msgstr "Успешно остановлено {}" #: src/ui/window.rs:1259 msgid "Successfully killed {}" msgstr "Успешно убито {}" #: src/ui/window.rs:1260 msgid "Successfully continued {}" msgstr "Успешно продолжено {}" #: src/ui/window.rs:1267 msgid "Successfully ended the process" msgid_plural "Successfully ended {} processes" msgstr[0] "Успешно завершен процесс" msgstr[1] "Успешно завершено {} процесса" msgstr[2] "Успешно завершено {} процессов" #: src/ui/window.rs:1273 msgid "Successfully halted the process" msgid_plural "Successfully halted {} processes" msgstr[0] "Успешно остановлен процесс" msgstr[1] "Успешно остановлено {} процесса" msgstr[2] "Успешно остановлено {} процессов" #: src/ui/window.rs:1279 msgid "Successfully killed the process" msgid_plural "Successfully killed {} processes" msgstr[0] "Успешно убит процесс" msgstr[1] "Успешно убито {} процесса" msgstr[2] "Успешно убито {} процессов" #: src/ui/window.rs:1285 msgid "Successfully continued the process" msgid_plural "Successfully continued {} processes" msgstr[0] "Успешно продолжен процесс" msgstr[1] "Успешно продолжено {} процесса" msgstr[2] "Успешно продолжено {} процессов" #: src/ui/window.rs:1296 msgid "There was a problem ending a process" msgid_plural "There were problems ending {} processes" msgstr[0] "Не удалось завершить процесс" msgstr[1] "Не удалось завершить {} процесса" msgstr[2] "Не удалось завершить {} процессов" #: src/ui/window.rs:1302 msgid "There was a problem halting a process" msgid_plural "There were problems halting {} processes" msgstr[0] "Не удалось остановить процесс" msgstr[1] "Не удалось остановить {} процесса" msgstr[2] "Не удалось остановить {} процессов" #: src/ui/window.rs:1308 msgid "There was a problem killing a process" msgid_plural "There were problems killing {} processes" msgstr[0] "Не удалось убить процесс" msgstr[1] "Не удалось убить {} процесса" msgstr[2] "Не удалось убить {} процессов" #: src/ui/window.rs:1314 msgid "There was a problem continuing a process" msgid_plural "There were problems continuing {} processes" msgstr[0] "Не удалось продолжить процесс" msgstr[1] "Не удалось продолжить {} процесса" msgstr[2] "Не удалось продолжить {} процессов" #: src/ui/window.rs:1324 msgid "There was a problem ending {}" msgstr "Не удалось завершить {}" #: src/ui/window.rs:1325 msgid "There was a problem halting {}" msgstr "Не удалось остановить {}" #: src/ui/window.rs:1326 msgid "There was a problem killing {}" msgstr "Не удалось убить {}" #: src/ui/window.rs:1327 msgid "There was a problem continuing {}" msgstr "Не удалось продолжить {}" #: src/utils/app.rs:222 msgid "System Processes" msgstr "Системные процессы" #: src/utils/battery.rs:93 msgid "Charging" msgstr "Заряжается" #: src/utils/battery.rs:94 msgid "Discharging" msgstr "Разряжается" #: src/utils/battery.rs:95 msgid "Empty" msgstr "Пустая" #: src/utils/battery.rs:96 msgid "Full" msgstr "Полная" #: src/utils/battery.rs:97 msgid "Unknown" msgstr "Неизвестно" #: src/utils/battery.rs:143 msgid "Nickel-Metal Hydride" msgstr "Никель-металлогидридная" #: src/utils/battery.rs:144 msgid "Nickel-Cadmium" msgstr "Никель-кадмиевая" #: src/utils/battery.rs:145 msgid "Nickel-Zinc" msgstr "Никель-цинковая" #: src/utils/battery.rs:146 msgid "Lead-Acid" msgstr "Свинцово-кислотная" #: src/utils/battery.rs:147 msgid "Lithium-Ion" msgstr "Литий-ионная" #: src/utils/battery.rs:148 msgid "Lithium Iron Phosphate" msgstr "Литий-железо-фосфатная" #: src/utils/battery.rs:149 msgid "Lithium Polymer" msgstr "Литий-полимерная" #: src/utils/battery.rs:151 msgid "Rechargeable Alkaline Managanese" msgstr "Перезаряжаемая щелочно-марганцевая" #: src/utils/battery.rs:256 msgid "{} Battery" msgstr "Батарея {}" #: src/utils/units.rs:91 msgid "{} K" msgstr "{} K" #: src/utils/units.rs:93 msgid "{} °C" msgstr "{} °C" #: src/utils/units.rs:95 msgid "{} °F" msgstr "{} °F" #: src/utils/units.rs:113 src/utils/units.rs:127 src/utils/units.rs:147 #: src/utils/units.rs:161 msgid "{} B" msgstr "{} Б" #: src/utils/units.rs:114 src/utils/units.rs:128 msgid "{} kB" msgstr "{} КБ" #: src/utils/units.rs:115 src/utils/units.rs:129 msgid "{} MB" msgstr "{} МБ" #: src/utils/units.rs:116 src/utils/units.rs:130 msgid "{} GB" msgstr "{} ГБ" #: src/utils/units.rs:117 src/utils/units.rs:131 msgid "{} TB" msgstr "{} ТБ" #: src/utils/units.rs:118 src/utils/units.rs:132 msgid "{} PB" msgstr "{} ПБ" #: src/utils/units.rs:119 src/utils/units.rs:133 msgid "{} EB" msgstr "{} ЭБ" #: src/utils/units.rs:120 src/utils/units.rs:134 msgid "{} ZB" msgstr "{} ЗБ" #: src/utils/units.rs:121 src/utils/units.rs:135 msgid "{} YB" msgstr "{} ЙБ" #: src/utils/units.rs:122 src/utils/units.rs:136 msgid "{} RB" msgstr "{} РБ" #: src/utils/units.rs:123 src/utils/units.rs:137 msgid "{} QB" msgstr "{} КвБ" #: src/utils/units.rs:148 src/utils/units.rs:162 msgid "{} KiB" msgstr "{} КиБ" #: src/utils/units.rs:149 src/utils/units.rs:163 msgid "{} MiB" msgstr "{} МиБ" #: src/utils/units.rs:150 src/utils/units.rs:164 msgid "{} GiB" msgstr "{} ГиБ" #: src/utils/units.rs:151 src/utils/units.rs:165 msgid "{} TiB" msgstr "{} ТиБ" #: src/utils/units.rs:152 src/utils/units.rs:166 msgid "{} PiB" msgstr "{} ПиБ" #: src/utils/units.rs:153 src/utils/units.rs:167 msgid "{} EiB" msgstr "{} ЭиБ" #: src/utils/units.rs:154 src/utils/units.rs:168 msgid "{} ZiB" msgstr "{} ЗиБ" #: src/utils/units.rs:155 src/utils/units.rs:169 msgid "{} YiB" msgstr "{} ЙиБ" #: src/utils/units.rs:156 src/utils/units.rs:170 msgid "{} RiB" msgstr "{} РиБ" #: src/utils/units.rs:157 src/utils/units.rs:171 msgid "{} QiB" msgstr "{} КвиБ" #: src/utils/units.rs:198 src/utils/units.rs:215 msgid "{} B/s" msgstr "{} Б/с" #: src/utils/units.rs:199 msgid "{} kB/s" msgstr "{} кБ/с" #: src/utils/units.rs:200 msgid "{} MB/s" msgstr "{} МБ/с" #: src/utils/units.rs:201 msgid "{} GB/s" msgstr "{} ГБ/с" #: src/utils/units.rs:202 msgid "{} TB/s" msgstr "{} ТБ/с" #: src/utils/units.rs:203 msgid "{} PB/s" msgstr "{} ПБ/с" #: src/utils/units.rs:204 msgid "{} EB/s" msgstr "{} ЭБ/с" #: src/utils/units.rs:205 msgid "{} ZB/s" msgstr "{} ЗБ/с" #: src/utils/units.rs:206 msgid "{} YB/s" msgstr "{} ЙБ/с" #: src/utils/units.rs:207 msgid "{} RB/s" msgstr "{} РБ/с" #: src/utils/units.rs:208 msgid "{} QB/s" msgstr "{} КвБ/с" #: src/utils/units.rs:216 msgid "{} KiB/s" msgstr "{} КиБ/с" #: src/utils/units.rs:217 msgid "{} MiB/s" msgstr "{} МиБ/с" #: src/utils/units.rs:218 msgid "{} GiB/s" msgstr "{} ГиБ/с" #: src/utils/units.rs:219 msgid "{} TiB/s" msgstr "{} ТиБ/с" #: src/utils/units.rs:220 msgid "{} PiB/s" msgstr "{} ПиБ/с" #: src/utils/units.rs:221 msgid "{} EiB/s" msgstr "{} ЭиБ/с" #: src/utils/units.rs:222 msgid "{} ZiB/s" msgstr "{} ЗиБ/с" #: src/utils/units.rs:223 msgid "{} YiB/s" msgstr "{} ЙиБ/с" #: src/utils/units.rs:224 msgid "{} RiB/s" msgstr "{} РиБ/с" #: src/utils/units.rs:225 msgid "{} QiB/s" msgstr "{} КвиБ/с" #: src/utils/units.rs:239 src/utils/units.rs:256 msgid "{} b/s" msgstr "{} бит/с" #: src/utils/units.rs:240 msgid "{} kb/s" msgstr "{} кбит/с" #: src/utils/units.rs:241 msgid "{} Mb/s" msgstr "{} Мбит/с" #: src/utils/units.rs:242 msgid "{} Gb/s" msgstr "{} Гбит/с" #: src/utils/units.rs:243 msgid "{} Tb/s" msgstr "{} Тбит/с" #: src/utils/units.rs:244 msgid "{} Pb/s" msgstr "{} Пбит/с" #: src/utils/units.rs:245 msgid "{} Eb/s" msgstr "{} Эбит/с" #: src/utils/units.rs:246 msgid "{} Zb/s" msgstr "{} Збит/с" #: src/utils/units.rs:247 msgid "{} Yb/s" msgstr "{} Йбит/с" #: src/utils/units.rs:248 msgid "{} Rb/s" msgstr "{} Рбит/с" #: src/utils/units.rs:249 msgid "{} Qb/s" msgstr "{} Квбит/с" #: src/utils/units.rs:257 msgid "{} Kib/s" msgstr "{} Кибит/с" #: src/utils/units.rs:258 msgid "{} Mib/s" msgstr "{} Мибит/с" #: src/utils/units.rs:259 msgid "{} Gib/s" msgstr "{} Гибит/с" #: src/utils/units.rs:260 msgid "{} Tib/s" msgstr "{} Тибит/с" #: src/utils/units.rs:261 msgid "{} Pib/s" msgstr "{} Пибит/с" #: src/utils/units.rs:262 msgid "{} Eib/s" msgstr "{} Эибит/с" #: src/utils/units.rs:263 msgid "{} Zib/s" msgstr "{} Зибит/с" #: src/utils/units.rs:264 msgid "{} Yib/s" msgstr "{} Йибит/с" #: src/utils/units.rs:265 msgid "{} Rib/s" msgstr "{} Рибит/с" #: src/utils/units.rs:266 msgid "{} Qib/s" msgstr "{} Квибит/с" #: src/utils/units.rs:273 msgid "{} Hz" msgstr "{} Гц" #: src/utils/units.rs:274 msgid "{} kHz" msgstr "{} кГц" #: src/utils/units.rs:275 msgid "{} MHz" msgstr "{} МГц" #: src/utils/units.rs:276 msgid "{} GHz" msgstr "{} ГГц" #: src/utils/units.rs:277 msgid "{} THz" msgstr "{} ТГц" #: src/utils/units.rs:278 msgid "{} PHz" msgstr "{} ПГц" #: src/utils/units.rs:279 msgid "{} EHz" msgstr "{} ЭГц" #: src/utils/units.rs:280 msgid "{} ZHz" msgstr "{} ЗГц" #: src/utils/units.rs:281 msgid "{} YHz" msgstr "{} ЙГц" #: src/utils/units.rs:282 msgid "{} RHz" msgstr "{} РГц" #: src/utils/units.rs:283 msgid "{} QHz" msgstr "{} КвГц" #: src/utils/units.rs:290 msgid "{} W" msgstr "{} Вт" #: src/utils/units.rs:291 msgid "{} kW" msgstr "{} кВт" #: src/utils/units.rs:292 msgid "{} MW" msgstr "{} МВт" #: src/utils/units.rs:293 msgid "{} GW" msgstr "{} ГВт" #: src/utils/units.rs:294 msgid "{} TW" msgstr "{} ТВт" #: src/utils/units.rs:295 msgid "{} PW" msgstr "{} ПВт" #: src/utils/units.rs:296 msgid "{} EW" msgstr "{} ЭВт" #: src/utils/units.rs:297 msgid "{} ZW" msgstr "{} ЗВт" #: src/utils/units.rs:298 msgid "{} YW" msgstr "{} ЙВт" #: src/utils/units.rs:299 msgid "{} RW" msgstr "{} РВт" #: src/utils/units.rs:300 msgid "{} QW" msgstr "{} КвВт" #: src/utils/units.rs:309 src/utils/units.rs:323 msgid "{} Wh" msgstr "{} Вт⋅ч" #: src/utils/units.rs:310 src/utils/units.rs:324 msgid "{} kWh" msgstr "{} кВт⋅ч" #: src/utils/units.rs:311 src/utils/units.rs:325 msgid "{} MWh" msgstr "{} МВт⋅ч" #: src/utils/units.rs:312 src/utils/units.rs:326 msgid "{} GWh" msgstr "{} ГВт⋅ч" #: src/utils/units.rs:313 src/utils/units.rs:327 msgid "{} TWh" msgstr "{} ТВт⋅ч" #: src/utils/units.rs:314 src/utils/units.rs:328 msgid "{} PWh" msgstr "{} ПВт⋅ч" #: src/utils/units.rs:315 src/utils/units.rs:329 msgid "{} EWh" msgstr "{} ЭВт⋅ч" #: src/utils/units.rs:316 src/utils/units.rs:330 msgid "{} ZWh" msgstr "{} ЗВт⋅ч" #: src/utils/units.rs:317 src/utils/units.rs:331 msgid "{} YWh" msgstr "{} ЙВт⋅ч" #: src/utils/units.rs:318 src/utils/units.rs:332 msgid "{} RWh" msgstr "{} РВт⋅ч" #: src/utils/units.rs:319 src/utils/units.rs:333 msgid "{} QWh" msgstr "{} КвВт⋅ч" #: src/utils/drive.rs:129 src/utils/drive.rs:208 msgid "CD/DVD/Blu-ray Drive" msgstr "Привод CD/DVD/Blu-ray" #: src/utils/drive.rs:130 msgid "eMMC Storage" msgstr "eMMC накопитель" #: src/utils/drive.rs:131 msgid "Flash Storage" msgstr "Флеш-накопитель" #: src/utils/drive.rs:132 src/utils/drive.rs:209 msgid "Floppy Drive" msgstr "Дисковод" #: src/utils/drive.rs:133 msgid "Hard Disk Drive" msgstr "Жесткий диск" #: src/utils/drive.rs:134 msgid "Loop Device" msgstr "Петлевое устройство" #: src/utils/drive.rs:135 msgid "Mapped Device" msgstr "Сопоставленное устройство" #: src/utils/drive.rs:136 msgid "NVMe Drive" msgstr "NVMe накопитель" #: src/utils/drive.rs:138 msgid "Software Raid" msgstr "Программный RAID" #: src/utils/drive.rs:139 msgid "RAM Disk" msgstr "RAM-диск" #: src/utils/drive.rs:140 msgid "Solid State Drive" msgstr "Твердотельный накопитель" #: src/utils/drive.rs:141 msgid "ZFS Volume" msgstr "Том ZFS" #: src/utils/drive.rs:142 msgid "Compressed RAM Disk (zram)" msgstr "Сжатый RAM-диск (zram)" #: src/utils/drive.rs:210 msgid "{} Loop Device" msgstr "Петлевое устройство {}" #: src/utils/drive.rs:211 msgid "{} Mapped Device" msgstr "Сопоставленное устройство {}" #: src/utils/drive.rs:212 msgid "{} RAID" msgstr "RAID {}" #: src/utils/drive.rs:213 msgid "{} RAM Disk" msgstr "RAM-диск {}" #: src/utils/drive.rs:214 msgid "{} zram Device" msgstr "Устройство zram {}" #: src/utils/drive.rs:215 msgid "{} ZFS Volume" msgstr "Том ZFS {}" #: src/utils/drive.rs:216 msgid "{} Drive" msgstr "Диск {}" #: src/utils/network.rs:123 msgid "Bluetooth Tether" msgstr "Bluetooth точка доступа" #: src/utils/network.rs:124 msgid "Network Bridge" msgstr "Сетевой мост" #: src/utils/network.rs:125 msgid "Ethernet Connection" msgstr "Ethernet подключение" #: src/utils/network.rs:126 msgid "Docker Bridge" msgstr "Докерный мост" #: src/utils/network.rs:127 msgid "InfiniBand Connection" msgstr "InfiniBand подключение" #: src/utils/network.rs:128 msgid "Serial Line IP Connection" msgstr "Последовательное IP подключение" #: src/utils/network.rs:129 msgid "Virtual Ethernet Device" msgstr "Виртуальное Ethernet-устройство" #: src/utils/network.rs:130 msgid "VM Network Bridge" msgstr "Сетевой мост виртуальной машины" #: src/utils/network.rs:131 msgid "VPN Tunnel" msgstr "VPN-туннель" #: src/utils/network.rs:132 msgid "VPN Tunnel (WireGuard)" msgstr "VPN-туннель (WireGuard)" #: src/utils/network.rs:133 msgid "Wi-Fi Connection" msgstr "Wi-Fi подключение" #: src/utils/network.rs:134 msgid "WWAN Connection" msgstr "WWAN подключение" #~ msgid "Memory Usage" #~ msgstr "Использование памяти" #~ msgid "Show Search Fields on Launch" #~ msgstr "Показывать поля поиска при запуске" #~ msgid "VRAM: {}" #~ msgstr "VRAM: {}" #~ msgid "Very High" #~ msgstr "Очень высоко" #~ msgid "High" #~ msgstr "Высоко" #~ msgid "Normal" #~ msgstr "Нормально" #~ msgid "Low" #~ msgstr "Низко" #~ msgid "Very Low" #~ msgstr "Очень низко" #~ msgid "Applications" #~ msgstr "Приложения" #~ msgid "Application" #~ msgstr "Приложение" #~ msgid "End application" #~ msgstr "Завершить приложение" #~ msgid "Kill application" #~ msgstr "Убить приложение" #~ msgid "Continue application" #~ msgstr "Продолжить приложение" #~ msgid "Continue process" #~ msgstr "Продолжить процесс" #~ msgctxt "shortcut window" #~ msgid "End Application/Process" #~ msgstr "Завершить приложение/процесс" #~ msgctxt "shortcut window" #~ msgid "Kill Application/Process" #~ msgstr "Убить приложение/процесс" #~ msgctxt "shortcut window" #~ msgid "Halt Application/Process" #~ msgstr "Остановить приложение/процесс" #~ msgctxt "shortcut window" #~ msgid "Continue Application/Process" #~ msgstr "Продолжить приложение/процесс" #~ msgid "root" #~ msgstr "root" #~ msgid "Current Power Cap" #~ msgstr "Текущая мощность" #~ msgid "Window width" #~ msgstr "Ширина окна" #~ msgid "Window height" #~ msgstr "Высота окна" #~ msgid "Window maximized state" #~ msgstr "Окно развернуто" #~ msgid "Temperature unit" #~ msgstr "Единица измерения температуры" #~ msgid "Unit Prefix Base" #~ msgstr "База префиксов единиц измерения" #~ msgid "Show search field for Processes and Applications on launch" #~ msgstr "Отображение поля поиска для процессов и приложений при запуске" #~ msgid "Show virtual block devices such as LVM containers" #~ msgstr "Отображение виртуальных блочных устройств, таких как контейнеры LVM" #~ msgid "Show virtual network interfaces such as Docker interfaces" #~ msgstr "" #~ "Отображение виртуальных сетевых интерфейсов, таких как интерфейсы Docker" #~ msgid "Show usage details in the sidebar" #~ msgstr "Отображение информации об использовании в боковой панели" #~ msgid "Show device description in the sidebar" #~ msgstr "Отображение описания устройства в боковой панели" #~ msgid "Display network speeds in bits per second" #~ msgstr "Отображение скорости сети в битах в секунду" #~ msgid "Display memory usage in Applications view" #~ msgstr "Отображение использования памяти в разделе приложений" #~ msgid "Display CPU usage in Applications view" #~ msgstr "Отображение использования процессора в разделе приложений" #~ msgid "Display drive read speed in Applications view" #~ msgstr "Отображение скорости чтения с диска в разделе приложений" #~ msgid "Display drive read total in Applications view" #~ msgstr "Отображение общего объема чтения с диска в разделе приложений" #~ msgid "Display drive write speed in Applications view" #~ msgstr "Отображение скорости записи на диск в разделе приложений" #~ msgid "Display drive write total in Applications view" #~ msgstr "Отображение общего объема записи на диск в разделе приложений" #~ msgid "Display GPU usage in Applications view" #~ msgstr "" #~ "Отображение использования графического процессора в разделе приложений" #~ msgid "Display video encoder usage in Applications view" #~ msgstr "Отображение использования видеокодера в разделе приложений" #~ msgid "Display video decoder usage in Applications view" #~ msgstr "Отображение использования видеодекодера в разделе приложений" #~ msgid "Display GPU memory usage in Applications view" #~ msgstr "" #~ "Отображение использования памяти графического процессора в разделе " #~ "приложений" #~ msgid "Display process ID in Processes view" #~ msgstr "Отображение идентификатора процесса в разделе процессов" #~ msgid "Display user name in Processes view" #~ msgstr "Отображение имени пользователя в разделе процессов" #~ msgid "Display memory usage in Processes view" #~ msgstr "Отображение использования памяти в разделе процессов" #~ msgid "Display CPU usage in Processes view" #~ msgstr "Отображение использования процессора в разделе процессов" #~ msgid "Display drive read speed in Processes view" #~ msgstr "Отображение скорости чтения с диска в разделе процессов" #~ msgid "Display drive read total in Processes view" #~ msgstr "Отображение общего объема чтения с диска в разделе процессов" #~ msgid "Display drive write speed in Processes view" #~ msgstr "Отображение скорости записи на диск в разделе процессов" #~ msgid "Display drive write total in Processes view" #~ msgstr "Отображение общего объема записи на диск в разделе процессов" #~ msgid "Display GPU usage in Processes view" #~ msgstr "" #~ "Отображение использования графического процессора в разделе процессов" #~ msgid "Display video encoder usage in Processes view" #~ msgstr "Отображение использования видеокодера в разделе процессов" #~ msgid "Display video decoder usage in Processes view" #~ msgstr "Отображение использования видеодекодера в разделе процессов" #~ msgid "Display GPU memory usage in Processes view" #~ msgstr "" #~ "Отображение использования памяти графического процессора в разделе " #~ "процессов" #~ msgid "Display logical CPU graphs in Processor view" #~ msgstr "Отображение графиков логических процессоров в разделе процессоров" #~ msgid "Show grids in graphs" #~ msgstr "Показывать сетки на графиках" #~ msgid "Amount of data points that should be shown in a graph" #~ msgstr "Количество точек данных, которые должны быть показаны на графике" #~ msgid "GPU Usage" #~ msgstr "Использование ГП" #~ msgid "Monitor your system resources and processes" #~ msgstr "Контролируйте системные ресурсы и процессы" resources-1.9.1/po/sl.po000066400000000000000000001437751510634446000151540ustar00rootroot00000000000000# Slovenian translation for resources. # Copyright (C) 2025 resources's COPYRIGHT HOLDER # This file is distributed under the same license as the resources package. # Martin , 2025. # msgid "" msgstr "" "Project-Id-Version: resources main\n" "Report-Msgid-Bugs-To: https://github.com/nokyan/resources/issues/\n" "POT-Creation-Date: 2025-10-04 03:35+0000\n" "PO-Revision-Date: 2025-10-04 09:17+0200\n" "Last-Translator: Martin Srebotnjak \n" "Language-Team: Slovenian \n" "Language: sl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n%100==4 ? 3 : " "0);\n" "X-Generator: Poedit 2.2.1\n" #: data/net.nokyan.Resources.desktop.in.in:2 data/net.nokyan.Resources.metainfo.xml.in.in:4 #: data/resources/ui/window.ui:22 src/application.rs:272 msgid "Resources" msgstr "Viri" #. Translators: The summary should be 35 characters or less according to Flathub appstream guidelines #: data/net.nokyan.Resources.desktop.in.in:3 data/net.nokyan.Resources.metainfo.xml.in.in:5 msgid "Keep an eye on system resources" msgstr "Pozorno spremljajte sistemske vire" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/net.nokyan.Resources.desktop.in.in:9 msgid "System;Resources;Monitor;Processes;Usage;Task;Manager;CPU;RAM;Memory;GPU;" msgstr "Sistem;Viri;Sredstva;Monitor;Procesi;Raba;opravila;Upravitelj;CPE;RAM;Pomnilnik;GPE;" #: data/net.nokyan.Resources.metainfo.xml.in.in:17 msgid "" "Resources allows you to check the utilization of your system resources and control your " "running processes and apps. It’s designed to be user-friendly and feel right at home on a " "modern desktop by using GNOME’s libadwaita." msgstr "" "Viri vam omogočajo, da preverite izkoriščenost sistemskih virov in nadzirate tekoče " "procese in programe. Zasnovan je uporabniku prijazno in se počuti kot doma na sodobnem " "namizju z uporabo programa libadwaita v GNOME." #: data/net.nokyan.Resources.metainfo.xml.in.in:20 msgid "Resources supports monitoring the following components:" msgstr "Viri podpirajo nadzor naslednjih komponent:" #: data/net.nokyan.Resources.metainfo.xml.in.in:24 msgid "CPU" msgstr "CPE" #: data/net.nokyan.Resources.metainfo.xml.in.in:25 data/resources/ui/dialogs/app_dialog.ui:82 #: data/resources/ui/dialogs/process_dialog.ui:64 #: data/resources/ui/dialogs/settings_dialog.ui:128 #: data/resources/ui/dialogs/settings_dialog.ui:220 data/resources/ui/window.ui:176 #: data/resources/ui/window.ui:183 src/ui/pages/applications/mod.rs:803 #: src/ui/pages/memory.rs:106 src/ui/pages/memory.rs:192 src/ui/pages/processes/mod.rs:1079 msgid "Memory" msgstr "Pomnilnik" #: data/net.nokyan.Resources.metainfo.xml.in.in:26 #: data/resources/ui/dialogs/app_dialog.ui:140 #: data/resources/ui/dialogs/process_dialog.ui:118 #: data/resources/ui/dialogs/settings_dialog.ui:158 #: data/resources/ui/dialogs/settings_dialog.ui:250 src/ui/pages/applications/mod.rs:1181 #: src/ui/pages/gpu.rs:119 src/ui/pages/processes/mod.rs:1469 src/ui/window.rs:468 msgid "GPU" msgstr "GPE" #: data/net.nokyan.Resources.metainfo.xml.in.in:27 #: data/resources/ui/dialogs/settings_dialog.ui:319 msgid "Network Interfaces" msgstr "Omrežni vmesniki" #: data/net.nokyan.Resources.metainfo.xml.in.in:28 msgid "Storage Devices" msgstr "Naprave za shranjevanje" #: data/net.nokyan.Resources.metainfo.xml.in.in:29 msgid "Batteries" msgstr "Baterije" #: data/net.nokyan.Resources.metainfo.xml.in.in:51 msgid "Apps page in light theme" msgstr "Stran »Programi« v svetli temi" #: data/net.nokyan.Resources.metainfo.xml.in.in:55 msgid "Processes page in dark theme" msgstr "Stran »Procesi« v temni temi" #: data/net.nokyan.Resources.metainfo.xml.in.in:59 msgid "Processor page in light theme" msgstr "Stran »Procesor« v svetli temi" #: data/net.nokyan.Resources.metainfo.xml.in.in:63 msgid "Memory page in dark theme" msgstr "Stran pomnilnika v temni temi" #: data/net.nokyan.Resources.metainfo.xml.in.in:67 msgid "GPU page in light theme" msgstr "Stran GPE v svetli temi" #: data/net.nokyan.Resources.metainfo.xml.in.in:71 msgid "Drive page in dark theme" msgstr "Stran pogona v temni temi" #: data/net.nokyan.Resources.metainfo.xml.in.in:75 msgid "Network Interface page in light theme" msgstr "Stran »Omrežni vmesnik« v svetli temi" #: data/net.nokyan.Resources.metainfo.xml.in.in:79 msgid "Battery page in dark theme" msgstr "Stran baterije v temni temi" #: data/net.nokyan.Resources.policy.in.in:9 msgid "Control Process" msgstr "Nadzorni procesi" #: data/net.nokyan.Resources.policy.in.in:10 msgid "Authentication is required to control superuser’s or other users’ processes" msgstr "" "Preverjanje pristnosti je potrebno za nadzor nad procesi superuporabnika ali drugih " "uporabnikov" #: data/resources/ui/dialogs/app_dialog.ui:7 msgid "App Information" msgstr "Informacije o programu" #: data/resources/ui/dialogs/app_dialog.ui:70 data/resources/ui/dialogs/process_dialog.ui:48 #: data/resources/ui/pages/battery.ui:22 data/resources/ui/pages/cpu.ui:37 #: data/resources/ui/pages/cpu.ui:50 data/resources/ui/pages/drive.ui:22 #: data/resources/ui/pages/gpu.ui:22 data/resources/ui/pages/memory.ui:31 #: data/resources/ui/pages/network.ui:22 data/resources/ui/pages/npu.ui:22 msgid "Usage" msgstr "Raba" #: data/resources/ui/dialogs/app_dialog.ui:73 data/resources/ui/dialogs/process_dialog.ui:55 #: data/resources/ui/dialogs/settings_dialog.ui:133 #: data/resources/ui/dialogs/settings_dialog.ui:225 data/resources/ui/window.ui:145 #: data/resources/ui/window.ui:152 src/ui/pages/applications/mod.rs:862 #: src/ui/pages/cpu.rs:128 src/ui/pages/processes/mod.rs:1138 src/ui/window.rs:290 msgid "Processor" msgstr "Procesor" #: data/resources/ui/dialogs/app_dialog.ui:91 data/resources/ui/dialogs/process_dialog.ui:73 #: data/resources/ui/dialogs/settings_dialog.ui:178 #: data/resources/ui/dialogs/settings_dialog.ui:290 src/ui/pages/applications/mod.rs:1420 #: src/ui/pages/memory.rs:198 src/ui/pages/processes/mod.rs:1954 msgid "Swap" msgstr "Izmenjalna datoteka" #: data/resources/ui/dialogs/app_dialog.ui:100 data/resources/ui/dialogs/process_dialog.ui:78 #: data/resources/ui/dialogs/settings_dialog.ui:138 #: data/resources/ui/dialogs/settings_dialog.ui:230 src/ui/pages/applications/mod.rs:926 #: src/ui/pages/processes/mod.rs:1202 msgid "Drive Read" msgstr "Branj pogona" #: data/resources/ui/dialogs/app_dialog.ui:109 data/resources/ui/dialogs/process_dialog.ui:87 #: data/resources/ui/dialogs/settings_dialog.ui:143 #: data/resources/ui/dialogs/settings_dialog.ui:235 src/ui/pages/applications/mod.rs:991 #: src/ui/pages/processes/mod.rs:1269 msgid "Drive Read Total" msgstr "Skupaj branj pogona" #: data/resources/ui/dialogs/app_dialog.ui:118 data/resources/ui/dialogs/process_dialog.ui:96 #: data/resources/ui/dialogs/settings_dialog.ui:148 #: data/resources/ui/dialogs/settings_dialog.ui:240 src/ui/pages/applications/mod.rs:1052 #: src/ui/pages/processes/mod.rs:1336 msgid "Drive Write" msgstr "Pisanj po pogonu" #: data/resources/ui/dialogs/app_dialog.ui:127 #: data/resources/ui/dialogs/process_dialog.ui:105 #: data/resources/ui/dialogs/settings_dialog.ui:153 #: data/resources/ui/dialogs/settings_dialog.ui:245 src/ui/pages/applications/mod.rs:1119 #: src/ui/pages/processes/mod.rs:1403 msgid "Drive Write Total" msgstr "Skupaj pisanj po pogonu" #: data/resources/ui/dialogs/app_dialog.ui:149 #: data/resources/ui/dialogs/process_dialog.ui:127 #: data/resources/ui/dialogs/settings_dialog.ui:163 #: data/resources/ui/dialogs/settings_dialog.ui:255 src/ui/pages/applications/mod.rs:1361 #: src/ui/pages/processes/mod.rs:1650 msgid "Video Memory" msgstr "Video pomnilnik" #: data/resources/ui/dialogs/app_dialog.ui:158 #: data/resources/ui/dialogs/process_dialog.ui:136 #: data/resources/ui/dialogs/settings_dialog.ui:168 #: data/resources/ui/dialogs/settings_dialog.ui:260 src/ui/pages/applications/mod.rs:1240 #: src/ui/pages/processes/mod.rs:1528 msgid "Video Encoder" msgstr "Video kodirnik" #: data/resources/ui/dialogs/app_dialog.ui:167 #: data/resources/ui/dialogs/process_dialog.ui:145 #: data/resources/ui/dialogs/settings_dialog.ui:173 #: data/resources/ui/dialogs/settings_dialog.ui:265 src/ui/pages/applications/mod.rs:1301 #: src/ui/pages/processes/mod.rs:1589 msgid "Video Decoder" msgstr "Video dekodirnik" #: data/resources/ui/dialogs/app_dialog.ui:174 #: data/resources/ui/dialogs/process_dialog.ui:179 data/resources/ui/pages/battery.ui:33 #: data/resources/ui/pages/cpu.ui:83 data/resources/ui/pages/drive.ui:54 #: data/resources/ui/pages/gpu.ui:74 data/resources/ui/pages/memory.ui:42 #: data/resources/ui/pages/network.ui:51 data/resources/ui/pages/npu.ui:68 msgid "Properties" msgstr "Lastnosti" #: data/resources/ui/dialogs/app_dialog.ui:180 msgid "ID" msgstr "ID" #: data/resources/ui/dialogs/app_dialog.ui:190 #: data/resources/ui/dialogs/process_dialog.ui:195 msgid "Running Since" msgstr "Teče od" #: data/resources/ui/dialogs/app_dialog.ui:198 msgid "Running Processes" msgstr "Procesi v teku" #: data/resources/ui/dialogs/app_dialog.ui:207 #: data/resources/ui/dialogs/process_dialog.ui:231 msgid "Containerized" msgstr "V vsebniku" #: data/resources/ui/dialogs/process_dialog.ui:7 msgid "Process Information" msgstr "Informacije o procesu" #: data/resources/ui/dialogs/process_dialog.ui:154 #: data/resources/ui/dialogs/settings_dialog.ui:270 src/ui/pages/processes/mod.rs:1710 msgid "Total CPU Time" msgstr "Skupni čas CPE" #: data/resources/ui/dialogs/process_dialog.ui:163 #: data/resources/ui/dialogs/settings_dialog.ui:275 src/ui/pages/processes/mod.rs:1769 msgid "User CPU Time" msgstr "Skupni čas CPE uporabnika" #: data/resources/ui/dialogs/process_dialog.ui:172 #: data/resources/ui/dialogs/settings_dialog.ui:280 src/ui/pages/processes/mod.rs:1828 msgid "System CPU Time" msgstr "Sistemski čas CPE" #: data/resources/ui/dialogs/process_dialog.ui:186 #: data/resources/ui/dialogs/settings_dialog.ui:210 src/ui/pages/processes/mod.rs:972 msgid "Process ID" msgstr "ID procesa" #: data/resources/ui/dialogs/process_dialog.ui:204 msgid "Commandline" msgstr "Ukazna vrstica" #: data/resources/ui/dialogs/process_dialog.ui:213 #: data/resources/ui/dialogs/settings_dialog.ui:215 src/ui/pages/processes/mod.rs:1025 msgid "User" msgstr "Uporabnik" #: data/resources/ui/dialogs/process_dialog.ui:222 msgid "Control Group" msgstr "Primerjalna skupina" #: data/resources/ui/dialogs/process_options_dialog.ui:7 #: data/resources/ui/dialogs/process_options_dialog.ui:69 msgid "Process Options" msgstr "Možnosti procesa" #: data/resources/ui/dialogs/process_options_dialog.ui:29 msgid "Apply" msgstr "Uveljavi" #: data/resources/ui/dialogs/process_options_dialog.ui:72 msgid "Niceness" msgstr "Prijaznost" #: data/resources/ui/dialogs/process_options_dialog.ui:73 msgid "" "The priority of a process is given by its niceness. A lower niceness value correspond to a " "higher priority." msgstr "" "Prednost procesa je podana z njegovo prijaznostjo. Nižja vrednost prijaznosti ustreza " "višji prioriteti." #: data/resources/ui/dialogs/process_options_dialog.ui:87 #: data/resources/ui/dialogs/settings_dialog.ui:285 src/ui/pages/processes/mod.rs:1887 msgid "Priority" msgstr "Prioriteta" #: data/resources/ui/dialogs/process_options_dialog.ui:91 msgctxt "process priority" msgid "Very High" msgstr "Zelo visoka" #: data/resources/ui/dialogs/process_options_dialog.ui:92 msgctxt "process priority" msgid "High" msgstr "Visoka" #: data/resources/ui/dialogs/process_options_dialog.ui:93 msgctxt "process priority" msgid "Normal" msgstr "Navadna" #: data/resources/ui/dialogs/process_options_dialog.ui:94 msgctxt "process priority" msgid "Low" msgstr "Nizka" #: data/resources/ui/dialogs/process_options_dialog.ui:95 msgctxt "process priority" msgid "Very Low" msgstr "Zelo nizka" #: data/resources/ui/dialogs/process_options_dialog.ui:103 msgid "Processor Affinity" msgstr "Afiniteta procesorja" #: data/resources/ui/dialogs/process_options_dialog.ui:108 msgid "Toggle All" msgstr "Preklopi vse" #: data/resources/ui/dialogs/process_options_dialog.ui:111 msgid "Select which processor cores the process is allowed to run on" msgstr "Izberite, na katerih procesorskih jedrih se lahko izvaja proces" #: data/resources/ui/dialogs/settings_dialog.ui:7 msgid "General" msgstr "Splošno" #: data/resources/ui/dialogs/settings_dialog.ui:10 msgid "Units" msgstr "Enote" #: data/resources/ui/dialogs/settings_dialog.ui:13 msgid "Data Unit Prefix" msgstr "Predpona podatkovne enote" #: data/resources/ui/dialogs/settings_dialog.ui:17 msgid "Decimal" msgstr "Desetiško" #: data/resources/ui/dialogs/settings_dialog.ui:18 msgid "Binary" msgstr "Dvojiško" #: data/resources/ui/dialogs/settings_dialog.ui:26 msgid "Show Network Speeds in Bits per Second" msgstr "Pokaži hitrosti omrežja v bitih na sekundo" #: data/resources/ui/dialogs/settings_dialog.ui:31 msgid "Temperature Unit" msgstr "Enota temperature" #: data/resources/ui/dialogs/settings_dialog.ui:35 msgid "Celsius" msgstr "Celziji" #: data/resources/ui/dialogs/settings_dialog.ui:36 msgid "Kelvin" msgstr "Kelvini" #: data/resources/ui/dialogs/settings_dialog.ui:37 msgid "Fahrenheit" msgstr "Fahrenheiti" #: data/resources/ui/dialogs/settings_dialog.ui:47 msgid "User Interface" msgstr "Uporabniški vmesnik" #: data/resources/ui/dialogs/settings_dialog.ui:50 msgid "Refresh Speed" msgstr "Hitrost osveževanja" #: data/resources/ui/dialogs/settings_dialog.ui:51 msgid "Higher refresh speeds can lead to higher processor usage" msgstr "Višje hitrosti osveževanja lahko povzročijo večjo rabo procesorja" #: data/resources/ui/dialogs/settings_dialog.ui:55 msgctxt "UI refresh speed" msgid "Very Slow" msgstr "Zelo počasi" #: data/resources/ui/dialogs/settings_dialog.ui:56 msgctxt "UI refresh speed" msgid "Slow" msgstr "Počasi" #: data/resources/ui/dialogs/settings_dialog.ui:57 msgctxt "UI refresh speed" msgid "Normal" msgstr "Običajno" #: data/resources/ui/dialogs/settings_dialog.ui:58 msgctxt "UI refresh speed" msgid "Fast" msgstr "Hitro" #: data/resources/ui/dialogs/settings_dialog.ui:59 msgctxt "UI refresh speed" msgid "Very Fast" msgstr "Zelo hitro" #: data/resources/ui/dialogs/settings_dialog.ui:67 msgid "Show Graph Grids" msgstr "Pokaži mreže grafa" #: data/resources/ui/dialogs/settings_dialog.ui:72 msgid "Graph Data Points" msgstr "Podatkovne točke grafa" #: data/resources/ui/dialogs/settings_dialog.ui:86 msgid "Show Usage Details in Sidebar" msgstr "Pokaži podrobnosti uporabe v stranski vrstici" #: data/resources/ui/dialogs/settings_dialog.ui:87 msgid "If enabled, the usage along with other information will be displayed" msgstr "Če je omogočeno, bo prikazana uporaba skupaj z drugimi informacijami" #: data/resources/ui/dialogs/settings_dialog.ui:92 msgid "Show Device Descriptions in Sidebar" msgstr "Pokaži opise naprav v stranski vrstici" #: data/resources/ui/dialogs/settings_dialog.ui:93 msgid "If enabled, a device identifier like its name or device type will be displayed" msgstr "Če je omogočeno, bo prikazan identifikator naprave, kot je ime ali vrsta naprave" #: data/resources/ui/dialogs/settings_dialog.ui:98 msgid "Sidebar Meter Type" msgstr "Vrsta merilnika stranske vrstice" #: data/resources/ui/dialogs/settings_dialog.ui:102 msgid "Bar" msgstr "Vrstica" #: data/resources/ui/dialogs/settings_dialog.ui:103 msgid "Graph" msgstr "Graf" #: data/resources/ui/dialogs/settings_dialog.ui:111 msgid "Normalize Processor Usage" msgstr "Normaliziraj rabo procesorja" #: data/resources/ui/dialogs/settings_dialog.ui:112 msgid "If enabled, the total usage of all cores will be divided by the amount of cores" msgstr "Če je omogočeno, se skupna poraba vseh jeder deli s številom jeder" #: data/resources/ui/dialogs/settings_dialog.ui:122 data/resources/ui/window.ui:65 #: data/resources/ui/window.ui:72 src/ui/pages/applications/mod.rs:131 msgid "Apps" msgstr "Programi" #: data/resources/ui/dialogs/settings_dialog.ui:125 #: data/resources/ui/dialogs/settings_dialog.ui:207 msgid "Information Columns" msgstr "Stolpci z informacijami" #: data/resources/ui/dialogs/settings_dialog.ui:183 #: data/resources/ui/dialogs/settings_dialog.ui:295 src/ui/pages/applications/mod.rs:1479 #: src/ui/pages/processes/mod.rs:2013 msgid "Combined Memory" msgstr "Kombinirani pomnilnik" #: data/resources/ui/dialogs/settings_dialog.ui:193 data/resources/ui/window.ui:105 #: data/resources/ui/window.ui:112 src/ui/pages/processes/mod.rs:175 msgid "Processes" msgstr "Procesi" #: data/resources/ui/dialogs/settings_dialog.ui:196 data/resources/ui/pages/cpu.ui:22 #: data/resources/ui/pages/processes.ui:56 msgid "Options" msgstr "Možnosti" #: data/resources/ui/dialogs/settings_dialog.ui:199 msgid "Show Niceness Values" msgstr "Pokaži vrednosti prijaznosti" #: data/resources/ui/dialogs/settings_dialog.ui:200 msgid "Display priorities as niceness to allow for more fine-grained adjustments" msgstr "Prikaži prednost kot prijaznost, kar omogoča natančnejše prilagoditve" #: data/resources/ui/dialogs/settings_dialog.ui:305 msgid "Devices" msgstr "Naprave" #: data/resources/ui/dialogs/settings_dialog.ui:308 msgid "Drives" msgstr "Pogoni" #: data/resources/ui/dialogs/settings_dialog.ui:311 msgid "Show Virtual Drives" msgstr "Pokaži navidezne pogone" #: data/resources/ui/dialogs/settings_dialog.ui:312 msgid "Virtual drives are for example ZFS volumes or mapped devices" msgstr "Navidezni pogoni so npr. nosilci ZFS ali preslikane naprave" #: data/resources/ui/dialogs/settings_dialog.ui:322 msgid "Show Virtual Network Interfaces" msgstr "Pokaži virtualne omrežne vmesnike" #: data/resources/ui/dialogs/settings_dialog.ui:323 msgid "Virtual network interfaces are for example bridges or VPN tunnels" msgstr "Virtualni omrežni vmesniki so npr. mostovi ali predori VPN" #: data/resources/ui/pages/applications.ui:6 data/resources/ui/pages/applications.ui:26 #: src/ui/pages/applications/mod.rs:1563 msgid "Kill App" msgstr "Ubij program" #: data/resources/ui/pages/applications.ui:10 data/resources/ui/pages/applications.ui:30 #: src/ui/pages/applications/mod.rs:1562 msgid "Halt App" msgstr "Ustavi program" #: data/resources/ui/pages/applications.ui:14 data/resources/ui/pages/applications.ui:34 #: src/ui/pages/applications/mod.rs:1564 msgid "Continue App" msgstr "Nadaljuj program" #: data/resources/ui/pages/applications.ui:22 data/resources/ui/pages/applications.ui:98 #: src/ui/pages/applications/mod.rs:1561 msgid "End App" msgstr "Končaj program" #: data/resources/ui/pages/applications.ui:40 data/resources/ui/pages/processes.ui:62 msgid "Information" msgstr "Podrobnosti" #: data/resources/ui/pages/applications.ui:57 msgid "Search applications" msgstr "Poišči program" #: data/resources/ui/pages/applications.ui:87 data/resources/ui/pages/applications.ui:89 msgid "Show App Information" msgstr "Pokaži informacije o programu" #: data/resources/ui/pages/battery.ui:36 msgid "Battery Health" msgstr "Dolgoživost baterije" #: data/resources/ui/pages/battery.ui:45 msgid "Design Capacity" msgstr "Projektirana zmogljivost" #: data/resources/ui/pages/battery.ui:54 msgid "Charge Cycles" msgstr "Cikli polnjenja" #: data/resources/ui/pages/battery.ui:63 msgid "Technology" msgstr "Tehnologija" #: data/resources/ui/pages/battery.ui:72 data/resources/ui/pages/gpu.ui:81 #: data/resources/ui/pages/network.ui:58 data/resources/ui/pages/npu.ui:75 msgid "Manufacturer" msgstr "Proizvajalec" #: data/resources/ui/pages/battery.ui:81 msgid "Model Name" msgstr "Ime modela" #: data/resources/ui/pages/battery.ui:90 data/resources/ui/pages/drive.ui:66 msgid "Device" msgstr "Naprava" #: data/resources/ui/pages/cpu.ui:26 msgid "Show Usages of Logical CPUs" msgstr "Pokaži rabo logičnih CPE-jev" #: data/resources/ui/pages/cpu.ui:75 data/resources/ui/pages/gpu.ui:66 #: data/resources/ui/pages/npu.ui:60 msgid "Sensors" msgstr "Tipala" #: data/resources/ui/pages/cpu.ui:90 msgid "Max Frequency" msgstr "Največja frekvenca" #: data/resources/ui/pages/cpu.ui:99 msgid "Logical Cores" msgstr "Logična jedra" #: data/resources/ui/pages/cpu.ui:108 msgid "Physical Cores" msgstr "Fizična jedra" #: data/resources/ui/pages/cpu.ui:117 msgid "Sockets" msgstr "Vtičnice" #: data/resources/ui/pages/cpu.ui:126 msgid "Uptime" msgstr "Čas delovanja" #: data/resources/ui/pages/cpu.ui:135 msgid "Virtualization" msgstr "Virtualizacija" #: data/resources/ui/pages/cpu.ui:144 msgid "Architecture" msgstr "Arhitektura" #: data/resources/ui/pages/drive.ui:38 msgid "Total Read" msgstr "Skupaj prebrano" #: data/resources/ui/pages/drive.ui:47 msgid "Total Written" msgstr "Skupaj zapisano" #: data/resources/ui/pages/drive.ui:57 data/resources/ui/pages/memory.ui:72 msgid "Type" msgstr "Vrsta" #: data/resources/ui/pages/drive.ui:75 msgid "Capacity" msgstr "Kapaciteta" #: data/resources/ui/pages/drive.ui:84 msgid "Writable" msgstr "Zapisljivo" #: data/resources/ui/pages/drive.ui:93 msgid "Removable" msgstr "Odstranljivo" #. Translators: "Link" refers to something like "PCIe 4.0 ×16" #: data/resources/ui/pages/drive.ui:102 data/resources/ui/pages/gpu.ui:113 #: data/resources/ui/pages/network.ui:103 data/resources/ui/pages/npu.ui:107 msgid "Link" msgstr "Povezava" #: data/resources/ui/pages/gpu.ui:37 msgid "GPU Frequency" msgstr "Frekvenca GPE" #: data/resources/ui/pages/gpu.ui:50 msgid "Video Memory Frequency" msgstr "Frekvenca video pomnilnika" #: data/resources/ui/pages/gpu.ui:55 data/resources/ui/pages/npu.ui:49 #: src/ui/pages/battery.rs:217 msgid "Power Usage" msgstr "Poraba energije" #: data/resources/ui/pages/gpu.ui:90 data/resources/ui/pages/npu.ui:84 msgid "PCI Slot" msgstr "Reža PCI" #: data/resources/ui/pages/gpu.ui:99 data/resources/ui/pages/network.ui:67 #: data/resources/ui/pages/npu.ui:93 msgid "Driver Used" msgstr "Uporabljeni gonilnik" #: data/resources/ui/pages/gpu.ui:108 data/resources/ui/pages/npu.ui:102 msgid "Max Power Cap" msgstr "Zgornja meja največje moči" #: data/resources/ui/pages/memory.ui:9 msgid "You need to authenticate to see memory properties" msgstr "Če želite videti lastnosti pomnilnika, morate preveriti pristnost" #: data/resources/ui/pages/memory.ui:10 msgid "Authenticate" msgstr "Overi" #: data/resources/ui/pages/memory.ui:45 msgid "Slots Used" msgstr "Uporabljene reže" #: data/resources/ui/pages/memory.ui:54 msgid "Speed" msgstr "Hitrost" #: data/resources/ui/pages/memory.ui:63 msgid "Form Factor" msgstr "Oblika oz. mere" #: data/resources/ui/pages/memory.ui:81 msgid "Type Detail" msgstr "Podrobnosti o vrsti" #: data/resources/ui/pages/network.ui:35 msgid "Total Received" msgstr "Skupaj prejeto" #: data/resources/ui/pages/network.ui:44 msgid "Total Sent" msgstr "Skupaj poslano" #: data/resources/ui/pages/network.ui:76 msgid "Interface" msgstr "Vmesnik" #: data/resources/ui/pages/network.ui:85 msgid "Hardware Address" msgstr "Strojni naslov" #: data/resources/ui/pages/network.ui:94 msgid "Network Name" msgstr "Ime omrežja" #: data/resources/ui/pages/network.ui:112 msgid "Link Speed" msgstr "Hitrost povezave" #: data/resources/ui/pages/npu.ui:31 msgid "NPU Frequency" msgstr "Frekvenca NPE" #: data/resources/ui/pages/npu.ui:44 msgid "Memory Frequency" msgstr "Frekvenca pomnilnika" #: data/resources/ui/pages/processes.ui:6 data/resources/ui/pages/processes.ui:42 #: src/ui/pages/processes/mod.rs:2126 msgid "Kill Process" msgstr "Uniči proces" #: data/resources/ui/pages/processes.ui:10 data/resources/ui/pages/processes.ui:46 #: src/ui/pages/processes/mod.rs:2125 msgid "Halt Process" msgstr "Ustavi proces" #: data/resources/ui/pages/processes.ui:14 data/resources/ui/pages/processes.ui:50 #: src/ui/pages/processes/mod.rs:2127 msgid "Continue Process" msgstr "Nadaljuj proces" #: data/resources/ui/pages/processes.ui:22 data/resources/ui/pages/processes.ui:74 msgid "Kill Processes" msgstr "Ubij procese" #: data/resources/ui/pages/processes.ui:26 data/resources/ui/pages/processes.ui:78 msgid "Halt Processes" msgstr "Ustavi procese" #: data/resources/ui/pages/processes.ui:30 data/resources/ui/pages/processes.ui:82 msgid "Continue Processes" msgstr "Nadaljuj s procesi" #: data/resources/ui/pages/processes.ui:38 data/resources/ui/pages/processes.ui:157 #: src/ui/pages/processes/mod.rs:523 src/ui/pages/processes/mod.rs:2124 msgid "End Process" msgstr "Končaj proces" #: data/resources/ui/pages/processes.ui:70 src/ui/pages/processes/mod.rs:527 msgid "End Processes" msgstr "Končaj procesee" #: data/resources/ui/pages/processes.ui:103 msgid "Search processes" msgstr "Poišči proces" #: data/resources/ui/pages/processes.ui:133 data/resources/ui/pages/processes.ui:135 msgid "Show Process Options" msgstr "Pokaži možnosti procesa" #: data/resources/ui/pages/processes.ui:146 data/resources/ui/pages/processes.ui:148 msgid "Show Process Information" msgstr "Pokaži podatke o procesu" #: data/resources/ui/shortcuts.ui:6 msgctxt "shortcut window" msgid "General" msgstr "Splošno" #: data/resources/ui/shortcuts.ui:9 msgctxt "shortcut window" msgid "Preferences" msgstr "Nastavitve" #: data/resources/ui/shortcuts.ui:15 msgctxt "shortcut window" msgid "Show Shortcuts" msgstr "Pokaže tipkovne bližnjice‫" #: data/resources/ui/shortcuts.ui:21 msgctxt "shortcut window" msgid "Quit" msgstr "Konča program" #: data/resources/ui/shortcuts.ui:29 msgctxt "shortcut window" msgid "Apps/Processes" msgstr "Programi/procesi" #: data/resources/ui/shortcuts.ui:32 msgctxt "shortcut window" msgid "Toggle Search Field" msgstr "Preklopi iskalno polje" #: data/resources/ui/shortcuts.ui:38 msgctxt "shortcut window" msgid "End App/Process" msgstr "Končaj program/proces" #: data/resources/ui/shortcuts.ui:44 msgctxt "shortcut window" msgid "Kill App/Process" msgstr "Ubij program/proces" #: data/resources/ui/shortcuts.ui:50 msgctxt "shortcut window" msgid "Halt App/Process" msgstr "Zaustavi program/proces" #: data/resources/ui/shortcuts.ui:56 msgctxt "shortcut window" msgid "Continue App/Process" msgstr "Nadaljuj s programom/procesom" #: data/resources/ui/shortcuts.ui:62 msgctxt "shortcut window" msgid "Show Information for App/Process" msgstr "Pokaži informacije za program/proces" #: data/resources/ui/shortcuts.ui:68 msgctxt "shortcut window" msgid "Show Process Options" msgstr "Pokaži možnosti procesa" #: data/resources/ui/window.ui:6 msgid "Preferences" msgstr "Nastavitve" #: data/resources/ui/window.ui:10 msgid "Keyboard Shortcuts" msgstr "Tipkovne bližnjice‫" #: data/resources/ui/window.ui:14 msgid "About Resources" msgstr "O programu Viri" #: data/resources/ui/window.ui:88 data/resources/ui/window.ui:128 msgid "Search" msgstr "Išči" #: data/resources/ui/window.ui:90 data/resources/ui/window.ui:130 msgid "Toggle search field" msgstr "Preklopi iskalno polje" #: src/application.rs:274 msgid "The Nalux Team" msgstr "Ekipa Nalux" #: src/application.rs:282 msgid "Report Issues" msgstr "Poročaj o težavah" #. Translator credits. Replace "translator-credits" with your name/username, and optionally an email or URL. #. One name per line, please do not remove previous names. #: src/application.rs:288 msgid "translator-credits" msgstr "Martin Srebotnjak " #: src/application.rs:289 msgid "Icon by" msgstr "Avtor ikone" #: src/ui/dialogs/app_dialog.rs:155 src/ui/dialogs/process_dialog.rs:133 #: src/ui/dialogs/process_dialog.rs:137 src/ui/dialogs/process_dialog.rs:146 #: src/ui/dialogs/process_dialog.rs:148 src/ui/dialogs/process_dialog.rs:171 #: src/ui/dialogs/process_dialog.rs:178 src/ui/dialogs/process_dialog.rs:185 #: src/ui/dialogs/process_dialog.rs:192 src/ui/pages/applications/mod.rs:948 #: src/ui/pages/applications/mod.rs:1074 src/ui/pages/battery.rs:205 #: src/ui/pages/battery.rs:225 src/ui/pages/battery.rs:231 src/ui/pages/battery.rs:234 #: src/ui/pages/battery.rs:265 src/ui/pages/battery.rs:289 src/ui/pages/battery.rs:291 #: src/ui/pages/battery.rs:301 src/ui/pages/cpu.rs:243 src/ui/pages/cpu.rs:258 #: src/ui/pages/cpu.rs:278 src/ui/pages/cpu.rs:284 src/ui/pages/cpu.rs:290 #: src/ui/pages/cpu.rs:296 src/ui/pages/cpu.rs:300 src/ui/pages/cpu.rs:303 #: src/ui/pages/cpu.rs:341 src/ui/pages/cpu.rs:448 src/ui/pages/drive.rs:319 #: src/ui/pages/drive.rs:350 src/ui/pages/drive.rs:352 src/ui/pages/drive.rs:381 #: src/ui/pages/drive.rs:383 src/ui/pages/drive.rs:399 src/ui/pages/drive.rs:400 #: src/ui/pages/drive.rs:407 src/ui/pages/drive.rs:417 src/ui/pages/drive.rs:427 #: src/ui/pages/drive.rs:433 src/ui/pages/gpu.rs:245 src/ui/pages/gpu.rs:252 #: src/ui/pages/gpu.rs:297 src/ui/pages/gpu.rs:322 src/ui/pages/gpu.rs:325 #: src/ui/pages/gpu.rs:336 src/ui/pages/gpu.rs:377 src/ui/pages/gpu.rs:384 #: src/ui/pages/gpu.rs:396 src/ui/pages/gpu.rs:403 src/ui/pages/gpu.rs:407 #: src/ui/pages/gpu.rs:437 src/ui/pages/gpu.rs:443 src/ui/pages/memory.rs:227 #: src/ui/pages/memory.rs:228 src/ui/pages/memory.rs:232 src/ui/pages/memory.rs:233 #: src/ui/pages/memory.rs:237 src/ui/pages/memory.rs:238 src/ui/pages/memory.rs:266 #: src/ui/pages/memory.rs:327 src/ui/pages/network.rs:252 src/ui/pages/network.rs:259 #: src/ui/pages/network.rs:266 src/ui/pages/network.rs:272 src/ui/pages/network.rs:275 #: src/ui/pages/network.rs:285 src/ui/pages/network.rs:292 src/ui/pages/network.rs:302 #: src/ui/pages/network.rs:370 src/ui/pages/network.rs:373 src/ui/pages/network.rs:375 #: src/ui/pages/network.rs:404 src/ui/pages/network.rs:407 src/ui/pages/network.rs:409 #: src/ui/pages/network.rs:417 src/ui/pages/network.rs:424 src/ui/pages/network.rs:434 #: src/ui/pages/processes/mod.rs:1224 src/ui/pages/processes/mod.rs:1291 #: src/ui/pages/processes/mod.rs:1358 src/ui/pages/processes/mod.rs:1425 #: src/ui/pages/processes/mod.rs:1911 src/ui/pages/processes/mod.rs:1913 #: src/utils/battery.rs:152 src/utils/drive.rs:137 src/utils/gpu/mod.rs:279 #: src/utils/gpu/mod.rs:291 src/utils/link/mod.rs:61 src/utils/npu/mod.rs:244 #: src/utils/npu/mod.rs:250 msgid "N/A" msgstr "Ni na voljo" #: src/ui/dialogs/process_options_dialog.rs:147 src/ui/pages/cpu.rs:257 #: src/ui/pages/cpu.rs:417 src/ui/pages/cpu.rs:421 msgid "CPU {}" msgstr "CPE {}" #: src/ui/pages/applications/application_entry.rs:190 src/ui/pages/drive.rs:414 #: src/ui/pages/drive.rs:424 src/ui/pages/processes/process_entry.rs:211 msgid "No" msgstr "Ne" #: src/ui/pages/applications/application_entry.rs:191 #: src/ui/pages/processes/process_entry.rs:212 msgid "Yes (Flatpak)" msgstr "Da (Flatpak)" #: src/ui/pages/applications/application_entry.rs:192 #: src/ui/pages/processes/process_entry.rs:213 msgid "Yes (Snap)" msgstr "Da (Snap)" #: src/ui/pages/applications/mod.rs:660 msgid "Running Apps: {}" msgstr "Programi v teku: {}" #: src/ui/pages/applications/mod.rs:700 src/ui/pages/processes/mod.rs:862 msgid "Cancel" msgstr "Prekliči" #: src/ui/pages/applications/mod.rs:746 msgid "App" msgstr "Program" #: src/ui/pages/applications/mod.rs:1539 src/ui/pages/processes/mod.rs:2073 msgid "End {}?" msgstr "Ali želite končati {}?" #: src/ui/pages/applications/mod.rs:1540 src/ui/pages/processes/mod.rs:2074 msgid "Halt {}?" msgstr "Ali želite ustaviti {}?" #: src/ui/pages/applications/mod.rs:1541 src/ui/pages/processes/mod.rs:2075 msgid "Kill {}?" msgstr "Ali želite ubiti {}?" #: src/ui/pages/applications/mod.rs:1542 src/ui/pages/processes/mod.rs:2076 msgid "Continue {}?" msgstr "Ali želite nadaljevati z {}?" #: src/ui/pages/applications/mod.rs:1548 src/ui/pages/processes/mod.rs:2111 msgid "Unsaved work might be lost." msgstr "Neshranjeno delo je morda izgubljeno." #: src/ui/pages/applications/mod.rs:1550 msgid "" "Halting an app can come with serious risks such as losing data and security implications. " "Use with caution." msgstr "" "Zaustavitev progama lahko povzroči resna tveganja, kot so izguba podatkov in varnostne " "posledice. Uporabljajte previdno." #: src/ui/pages/applications/mod.rs:1553 msgid "" "Killing an app can come with serious risks such as losing data and security implications. " "Use with caution." msgstr "" "Ubijanje programa lahko prinese resna tveganja, kot so izguba podatkov in varnostne " "posledice. Uporabljajte previdno." #: src/ui/pages/battery.rs:102 src/utils/battery.rs:258 msgid "Battery" msgstr "Baterija" #: src/ui/pages/battery.rs:210 msgid "Battery Charge" msgstr "Napolnjenost baterije" #: src/ui/pages/battery.rs:279 src/ui/pages/cpu.rs:438 src/ui/pages/drive.rs:344 #: src/ui/pages/drive.rs:375 src/ui/pages/gpu.rs:429 src/ui/pages/network.rs:362 #: src/ui/pages/network.rs:396 msgid "Highest:" msgstr "Najvišja:" #: src/ui/pages/cpu.rs:242 src/ui/pages/gpu.rs:212 msgid "Total Usage" msgstr "Skupna uporaba" #: src/ui/pages/cpu.rs:271 src/ui/pages/gpu.rs:239 msgid "Temperature" msgstr "Temperatura" #: src/ui/pages/drive.rs:126 msgid "Drive" msgstr "Pogon" #: src/ui/pages/drive.rs:236 msgid "Drive Activity" msgstr "Dejavnost pogona" #: src/ui/pages/drive.rs:243 msgid "Read Speed" msgstr "Hitrost branja" #: src/ui/pages/drive.rs:247 msgid "Write Speed" msgstr "Hitrost pisanja" #: src/ui/pages/drive.rs:412 src/ui/pages/drive.rs:422 msgid "Yes" msgstr "Da" #. Translators: This is an abbreviation for "Read" and "Write". This is displayed in the sidebar so your #. translation should preferably be quite short or an abbreviation #: src/ui/pages/drive.rs:440 msgid "R: {} · W: {}" msgstr "B: {} · P: {}" #: src/ui/pages/gpu.rs:220 msgid "Video Encoder/Decoder Usage" msgstr "Uporaba kodirnika/dekodirnika videa" #: src/ui/pages/gpu.rs:226 msgid "Video Encoder Usage" msgstr "Uporaba kodirnika videa" #: src/ui/pages/gpu.rs:231 msgid "Video Decoder Usage" msgstr "Uporaba dekodirnika videa" #: src/ui/pages/gpu.rs:236 msgid "Video Memory Usage" msgstr "Uporaba videopomnilnika" #. Translators: This will be displayed in the sidebar, please try to keep your translation as short as (or even #. shorter than) 'Memory' #: src/ui/pages/gpu.rs:415 msgid "Memory: {}" msgstr "Pomnilnik: {}" #: src/ui/pages/memory.rs:262 msgid "{} of {}" msgstr "{} od {}" #: src/ui/pages/memory.rs:265 msgid "{} MT/s" msgstr "{} MT/s" #. Translators: This will be displayed in the sidebar, so your translation for "Swap" should #. preferably be quite short or an abbreviation #: src/ui/pages/memory.rs:346 msgid "{} / {} · Swap: {} %" msgstr "{} / {} · Izmenjava: {} %" #: src/ui/pages/network.rs:127 src/utils/network.rs:135 msgid "Network Interface" msgstr "Omrežni vmesnik" #: src/ui/pages/network.rs:241 msgid "Receiving" msgstr "Prejemanje" #: src/ui/pages/network.rs:245 msgid "Sending" msgstr "Pošiljanje" #. Translators: This is an abbreviation for "Receive" and "Send". This is displayed in the sidebar so #. your translation should preferably be quite short or an abbreviation #: src/ui/pages/network.rs:445 msgid "R: {} · S: {}" msgstr "Prej: {} · Posl: {}" #: src/ui/pages/processes/mod.rs:813 msgid "Running Processes: {}" msgstr "Tekoči procesi: {}" #: src/ui/pages/processes/mod.rs:911 msgid "Process" msgstr "Proces" #: src/ui/pages/processes/mod.rs:2083 msgid "End process?" msgid_plural "End {} processes?" msgstr[0] "Ali želite končati {} procesov?" msgstr[1] "Ali želite končati {} proces?" msgstr[2] "Ali želite končati {} procesa?" msgstr[3] "Ali želite končati {} procese?" #: src/ui/pages/processes/mod.rs:2089 msgid "Halt process?" msgid_plural "Halt {} processes?" msgstr[0] "Ali želite zaustaviti {} procesov?" msgstr[1] "Ali želite zaustaviti {} proces?" msgstr[2] "Ali želite zaustaviti {} procesa?" msgstr[3] "Ali želite zaustaviti {} procese?" #: src/ui/pages/processes/mod.rs:2095 src/ui/pages/processes/mod.rs:2101 msgid "Kill process?" msgid_plural "Kill {} processes?" msgstr[0] "Ali želite uničiti {} procesov?" msgstr[1] "Ali želite uničiti {} proces?" msgstr[2] "Ali želite uničiti {} procesa?" msgstr[3] "Ali želite uničiti {} procese?" #: src/ui/pages/processes/mod.rs:2113 msgid "" "Halting a process can come with serious risks such as losing data and security " "implications. Use with caution." msgstr "" "Zaustavitev procesa lahko prinese resna tveganja, kot so izguba podatkov in varnostne " "posledice. Uporabljajte previdno." #: src/ui/pages/processes/mod.rs:2116 msgid "" "Killing a process can come with serious risks such as losing data and security " "implications. Use with caution." msgstr "" "Uničevanje procesa lahko prinese resna tveganja, kot so izguba podatkov in varnostne " "posledice. Uporabljajte previdno." #: src/ui/window.rs:466 msgid "GPU {}" msgstr "GPE {}" #: src/ui/window.rs:496 msgid "NPU {}" msgstr "NPE {}" #: src/ui/window.rs:498 msgid "NPU" msgstr "NPE" #: src/ui/window.rs:1174 msgid "Successfully adjusted {}" msgstr "Uspešno prilagojeno: {}" #: src/ui/window.rs:1175 msgid "There was a problem adjusting {}" msgstr "Prišlo je do težave pri prilagajanju {}" #: src/ui/window.rs:1257 msgid "Successfully ended {}" msgstr "Uspešno končano: {}" #: src/ui/window.rs:1258 msgid "Successfully halted {}" msgstr "Uspešno ustavljeno: {}" #: src/ui/window.rs:1259 msgid "Successfully killed {}" msgstr "Uspešno ubito: {}" #: src/ui/window.rs:1260 msgid "Successfully continued {}" msgstr "Uspešno nadaljevanje: {}" #: src/ui/window.rs:1267 msgid "Successfully ended the process" msgid_plural "Successfully ended {} processes" msgstr[0] "Uspešno zaključenih {} procesov" msgstr[1] "Uspešno zaključen {} proces" msgstr[2] "Uspešno zaključena {} procesa" msgstr[3] "Uspešno zaključeni {} procesi" #: src/ui/window.rs:1273 msgid "Successfully halted the process" msgid_plural "Successfully halted {} processes" msgstr[0] "Uspešno ustavljenih {} procesov" msgstr[1] "Uspešno ustavljen {} proces" msgstr[2] "Uspešno ustavljena {} procesa" msgstr[3] "Uspešno ustavljeni {} procesi" #: src/ui/window.rs:1279 msgid "Successfully killed the process" msgid_plural "Successfully killed {} processes" msgstr[0] "Uspešno ubitih {} procesov" msgstr[1] "Uspešno ubit {} proces" msgstr[2] "Uspešno ubita {} procesa" msgstr[3] "Uspešno ubiti {} procesi" #: src/ui/window.rs:1285 msgid "Successfully continued the process" msgid_plural "Successfully continued {} processes" msgstr[0] "Uspešno nadaljevanje {} procesov" msgstr[1] "Uspešno nadaljevanje {} procesa" msgstr[2] "Uspešno nadaljevanje {} procesov" msgstr[3] "Uspešno nadaljevanje {} procesov" #: src/ui/window.rs:1296 msgid "There was a problem ending a process" msgid_plural "There were problems ending {} processes" msgstr[0] "Prišlo je do težave pri končanju {} procesov" msgstr[1] "Prišlo je do težave pri končanju {} procesa" msgstr[2] "Prišlo je do težave pri končanju {} procesov" msgstr[3] "Prišlo je do težave pri končanju {} procesov" #: src/ui/window.rs:1302 msgid "There was a problem halting a process" msgid_plural "There were problems halting {} processes" msgstr[0] "Prišlo je do težave pri zaustavitvi {} procesov" msgstr[1] "Prišlo je do težave pri zaustavitvi {} proces" msgstr[2] "Prišlo je do težave pri zaustavitvi {} procesov" msgstr[3] "Prišlo je do težave pri zaustavitvi {} procesov" #: src/ui/window.rs:1308 msgid "There was a problem killing a process" msgid_plural "There were problems killing {} processes" msgstr[0] "Prišlo je do težave pri uničenju {} procesov" msgstr[1] "Prišlo je do težave pri uničenju {} procesa" msgstr[2] "Prišlo je do težave pri uničenju {} procesov" msgstr[3] "Prišlo je do težave pri uničenju {} procesov" #: src/ui/window.rs:1314 msgid "There was a problem continuing a process" msgid_plural "There were problems continuing {} processes" msgstr[0] "Prišlo je do težav pri nadaljevanju {} procesov" msgstr[1] "Prišlo je do težav pri nadaljevanju {} procesa" msgstr[2] "Prišlo je do težav pri nadaljevanju {} procesov" msgstr[3] "Prišlo je do težav pri nadaljevanju {} procesov" #: src/ui/window.rs:1324 msgid "There was a problem ending {}" msgstr "Prišlo je do težave pri končanju {}" #: src/ui/window.rs:1325 msgid "There was a problem halting {}" msgstr "Prišlo je do težave pri zaustavitvi {}" #: src/ui/window.rs:1326 msgid "There was a problem killing {}" msgstr "Prišlo je do težave z ubijanjem {}" #: src/ui/window.rs:1327 msgid "There was a problem continuing {}" msgstr "Prišlo je do težave pri nadaljevanju {}" #: src/utils/app.rs:222 msgid "System Processes" msgstr "Sistemski procesi" #: src/utils/battery.rs:93 msgid "Charging" msgstr "Polnjenje" #: src/utils/battery.rs:94 msgid "Discharging" msgstr "Praznjenje" #: src/utils/battery.rs:95 msgid "Empty" msgstr "Prazno" #: src/utils/battery.rs:96 msgid "Full" msgstr "Polno" #: src/utils/battery.rs:97 msgid "Unknown" msgstr "Neznano" #: src/utils/battery.rs:143 msgid "Nickel-Metal Hydride" msgstr "Nikelj-kovinski hidrid" #: src/utils/battery.rs:144 msgid "Nickel-Cadmium" msgstr "Nikelj-kadmij" #: src/utils/battery.rs:145 msgid "Nickel-Zinc" msgstr "Nikelj-cink" #: src/utils/battery.rs:146 msgid "Lead-Acid" msgstr "Svinec-kislina" #: src/utils/battery.rs:147 msgid "Lithium-Ion" msgstr "Litij-ionski" #: src/utils/battery.rs:148 msgid "Lithium Iron Phosphate" msgstr "Litijev železov fosfat" #: src/utils/battery.rs:149 msgid "Lithium Polymer" msgstr "Litijev polimer" #: src/utils/battery.rs:151 msgid "Rechargeable Alkaline Managanese" msgstr "Alkalna manganova polnilna" #: src/utils/battery.rs:256 msgid "{} Battery" msgstr "Baterija {}" #: src/utils/units.rs:91 msgid "{} K" msgstr "{} K" #: src/utils/units.rs:93 msgid "{} °C" msgstr "{} °C" #: src/utils/units.rs:95 msgid "{} °F" msgstr "{} °F" #: src/utils/units.rs:113 src/utils/units.rs:127 src/utils/units.rs:147 #: src/utils/units.rs:161 msgid "{} B" msgstr "{} B" #: src/utils/units.rs:114 src/utils/units.rs:128 msgid "{} kB" msgstr "{} kB" #: src/utils/units.rs:115 src/utils/units.rs:129 msgid "{} MB" msgstr "{} MB" #: src/utils/units.rs:116 src/utils/units.rs:130 msgid "{} GB" msgstr "{} GB" #: src/utils/units.rs:117 src/utils/units.rs:131 msgid "{} TB" msgstr "{} TB" #: src/utils/units.rs:118 src/utils/units.rs:132 msgid "{} PB" msgstr "{} PB" #: src/utils/units.rs:119 src/utils/units.rs:133 msgid "{} EB" msgstr "{} EB" #: src/utils/units.rs:120 src/utils/units.rs:134 msgid "{} ZB" msgstr "{} ZB" #: src/utils/units.rs:121 src/utils/units.rs:135 msgid "{} YB" msgstr "{} YB" #: src/utils/units.rs:122 src/utils/units.rs:136 msgid "{} RB" msgstr "{} RB" #: src/utils/units.rs:123 src/utils/units.rs:137 msgid "{} QB" msgstr "{} QB" #: src/utils/units.rs:148 src/utils/units.rs:162 msgid "{} KiB" msgstr "{} KiB" #: src/utils/units.rs:149 src/utils/units.rs:163 msgid "{} MiB" msgstr "{} MiB" #: src/utils/units.rs:150 src/utils/units.rs:164 msgid "{} GiB" msgstr "{} GiB" #: src/utils/units.rs:151 src/utils/units.rs:165 msgid "{} TiB" msgstr "{} TiB" #: src/utils/units.rs:152 src/utils/units.rs:166 msgid "{} PiB" msgstr "{} PiB" #: src/utils/units.rs:153 src/utils/units.rs:167 msgid "{} EiB" msgstr "{} EiB" #: src/utils/units.rs:154 src/utils/units.rs:168 msgid "{} ZiB" msgstr "{} ZiB" #: src/utils/units.rs:155 src/utils/units.rs:169 msgid "{} YiB" msgstr "{} YiB" #: src/utils/units.rs:156 src/utils/units.rs:170 msgid "{} RiB" msgstr "{} RiB" #: src/utils/units.rs:157 src/utils/units.rs:171 msgid "{} QiB" msgstr "{} QiB" #: src/utils/units.rs:198 src/utils/units.rs:215 msgid "{} B/s" msgstr "{} B/s" #: src/utils/units.rs:199 msgid "{} kB/s" msgstr "{} kB/s" #: src/utils/units.rs:200 msgid "{} MB/s" msgstr "{} MB/s" #: src/utils/units.rs:201 msgid "{} GB/s" msgstr "{} GB/s" #: src/utils/units.rs:202 msgid "{} TB/s" msgstr "{} TB/s" #: src/utils/units.rs:203 msgid "{} PB/s" msgstr "{} PB/s" #: src/utils/units.rs:204 msgid "{} EB/s" msgstr "{} EB/s" #: src/utils/units.rs:205 msgid "{} ZB/s" msgstr "{} ZB/s" #: src/utils/units.rs:206 msgid "{} YB/s" msgstr "{} YB/s" #: src/utils/units.rs:207 msgid "{} RB/s" msgstr "{} RB/s" #: src/utils/units.rs:208 msgid "{} QB/s" msgstr "{} QB/s" #: src/utils/units.rs:216 msgid "{} KiB/s" msgstr "{} KiB/s" #: src/utils/units.rs:217 msgid "{} MiB/s" msgstr "{} MiB/s" #: src/utils/units.rs:218 msgid "{} GiB/s" msgstr "{} GiB/s" #: src/utils/units.rs:219 msgid "{} TiB/s" msgstr "{} TiB/s" #: src/utils/units.rs:220 msgid "{} PiB/s" msgstr "{} PiB/s" #: src/utils/units.rs:221 msgid "{} EiB/s" msgstr "{} EiB/s" #: src/utils/units.rs:222 msgid "{} ZiB/s" msgstr "{} ZiB/s" #: src/utils/units.rs:223 msgid "{} YiB/s" msgstr "{} YiB/s" #: src/utils/units.rs:224 msgid "{} RiB/s" msgstr "{} RiB/s" #: src/utils/units.rs:225 msgid "{} QiB/s" msgstr "{} QiB/s" #: src/utils/units.rs:239 src/utils/units.rs:256 msgid "{} b/s" msgstr "{} b/s" #: src/utils/units.rs:240 msgid "{} kb/s" msgstr "{} kb/s" #: src/utils/units.rs:241 msgid "{} Mb/s" msgstr "{} Mb/s" #: src/utils/units.rs:242 msgid "{} Gb/s" msgstr "{} Gb/s" #: src/utils/units.rs:243 msgid "{} Tb/s" msgstr "{} Tb/s" #: src/utils/units.rs:244 msgid "{} Pb/s" msgstr "{} Pb/s" #: src/utils/units.rs:245 msgid "{} Eb/s" msgstr "{} Eb/s" #: src/utils/units.rs:246 msgid "{} Zb/s" msgstr "{} Zb/s" #: src/utils/units.rs:247 msgid "{} Yb/s" msgstr "{} Yb/s" #: src/utils/units.rs:248 msgid "{} Rb/s" msgstr "{} Rb/s" #: src/utils/units.rs:249 msgid "{} Qb/s" msgstr "{} Qb/s" #: src/utils/units.rs:257 msgid "{} Kib/s" msgstr "{} Kib/s" #: src/utils/units.rs:258 msgid "{} Mib/s" msgstr "{} Mib/s" #: src/utils/units.rs:259 msgid "{} Gib/s" msgstr "{} Gib/s" #: src/utils/units.rs:260 msgid "{} Tib/s" msgstr "{} Tib/s" #: src/utils/units.rs:261 msgid "{} Pib/s" msgstr "{} Pib/s" #: src/utils/units.rs:262 msgid "{} Eib/s" msgstr "{} Eib/s" #: src/utils/units.rs:263 msgid "{} Zib/s" msgstr "{} Zib/s" #: src/utils/units.rs:264 msgid "{} Yib/s" msgstr "{} Yib/s" #: src/utils/units.rs:265 msgid "{} Rib/s" msgstr "{} Rib/s" #: src/utils/units.rs:266 msgid "{} Qib/s" msgstr "{} Qib/s" #: src/utils/units.rs:273 msgid "{} Hz" msgstr "{} Hz" #: src/utils/units.rs:274 msgid "{} kHz" msgstr "{} kHz" #: src/utils/units.rs:275 msgid "{} MHz" msgstr "{} MHz" #: src/utils/units.rs:276 msgid "{} GHz" msgstr "{} GHz" #: src/utils/units.rs:277 msgid "{} THz" msgstr "{} THz" #: src/utils/units.rs:278 msgid "{} PHz" msgstr "{} PHz" #: src/utils/units.rs:279 msgid "{} EHz" msgstr "{} EHz" #: src/utils/units.rs:280 msgid "{} ZHz" msgstr "{} ZHz" #: src/utils/units.rs:281 msgid "{} YHz" msgstr "{} YHz" #: src/utils/units.rs:282 msgid "{} RHz" msgstr "{} RHz" #: src/utils/units.rs:283 msgid "{} QHz" msgstr "{} QHz" #: src/utils/units.rs:290 msgid "{} W" msgstr "{} W" #: src/utils/units.rs:291 msgid "{} kW" msgstr "{} kW" #: src/utils/units.rs:292 msgid "{} MW" msgstr "{} MW" #: src/utils/units.rs:293 msgid "{} GW" msgstr "{} GW" #: src/utils/units.rs:294 msgid "{} TW" msgstr "{} TW" #: src/utils/units.rs:295 msgid "{} PW" msgstr "{} PW" #: src/utils/units.rs:296 msgid "{} EW" msgstr "{} EW" #: src/utils/units.rs:297 msgid "{} ZW" msgstr "{} ZW" #: src/utils/units.rs:298 msgid "{} YW" msgstr "{} YW" #: src/utils/units.rs:299 msgid "{} RW" msgstr "{} RW" #: src/utils/units.rs:300 msgid "{} QW" msgstr "{} QW" #: src/utils/units.rs:309 src/utils/units.rs:323 msgid "{} Wh" msgstr "{} Wh" #: src/utils/units.rs:310 src/utils/units.rs:324 msgid "{} kWh" msgstr "{} kWh" #: src/utils/units.rs:311 src/utils/units.rs:325 msgid "{} MWh" msgstr "{} MWh" #: src/utils/units.rs:312 src/utils/units.rs:326 msgid "{} GWh" msgstr "{} GWh" #: src/utils/units.rs:313 src/utils/units.rs:327 msgid "{} TWh" msgstr "{} TWh" #: src/utils/units.rs:314 src/utils/units.rs:328 msgid "{} PWh" msgstr "{} PWh" #: src/utils/units.rs:315 src/utils/units.rs:329 msgid "{} EWh" msgstr "{} EWh" #: src/utils/units.rs:316 src/utils/units.rs:330 msgid "{} ZWh" msgstr "{} ZWh" #: src/utils/units.rs:317 src/utils/units.rs:331 msgid "{} YWh" msgstr "{} YWh" #: src/utils/units.rs:318 src/utils/units.rs:332 msgid "{} RWh" msgstr "{} RWh" #: src/utils/units.rs:319 src/utils/units.rs:333 msgid "{} QWh" msgstr "{} QWh" #: src/utils/drive.rs:129 src/utils/drive.rs:208 msgid "CD/DVD/Blu-ray Drive" msgstr "Pogon CD/DVD/Blu-ray" #: src/utils/drive.rs:130 msgid "eMMC Storage" msgstr "Shramba eMMC" #: src/utils/drive.rs:131 msgid "Flash Storage" msgstr "Bliskovni pogon" #: src/utils/drive.rs:132 src/utils/drive.rs:209 msgid "Floppy Drive" msgstr "Disketni pogon" #: src/utils/drive.rs:133 msgid "Hard Disk Drive" msgstr "Pogon trdega diska" #: src/utils/drive.rs:134 msgid "Loop Device" msgstr "Zančna naprava" #: src/utils/drive.rs:135 msgid "Mapped Device" msgstr "Preslikana naprava" #: src/utils/drive.rs:136 msgid "NVMe Drive" msgstr "Pogon NVMe" #: src/utils/drive.rs:138 msgid "Software Raid" msgstr "Programsko diskovno polje" #: src/utils/drive.rs:139 msgid "RAM Disk" msgstr "Disk RAM" #: src/utils/drive.rs:140 msgid "Solid State Drive" msgstr "Negibljivi disk" #: src/utils/drive.rs:141 msgid "ZFS Volume" msgstr "Nosilec ZFS" #: src/utils/drive.rs:142 msgid "Compressed RAM Disk (zram)" msgstr "Stisnjeni disk RAM (zram)" #: src/utils/drive.rs:210 msgid "{} Loop Device" msgstr "Zančna naprava {}" #: src/utils/drive.rs:211 msgid "{} Mapped Device" msgstr "Preslikana naprava {}" #: src/utils/drive.rs:212 msgid "{} RAID" msgstr "{} RAID" #: src/utils/drive.rs:213 msgid "{} RAM Disk" msgstr "Disk RAM {}" #: src/utils/drive.rs:214 msgid "{} zram Device" msgstr "Naprava zram {}" #: src/utils/drive.rs:215 msgid "{} ZFS Volume" msgstr "Nosilec ZFS {}" #: src/utils/drive.rs:216 msgid "{} Drive" msgstr "Pogon {}" #: src/utils/network.rs:123 msgid "Bluetooth Tether" msgstr "Deljenje povezave Bluetooth" #: src/utils/network.rs:124 msgid "Network Bridge" msgstr "Omrežni most" #: src/utils/network.rs:125 msgid "Ethernet Connection" msgstr "Žična omrežna povezava" #: src/utils/network.rs:126 msgid "Docker Bridge" msgstr "Most priklopne postaje" #: src/utils/network.rs:127 msgid "InfiniBand Connection" msgstr "Povezava InfiniBand" #: src/utils/network.rs:128 msgid "Serial Line IP Connection" msgstr "Serijska linijska povezava IP" #: src/utils/network.rs:129 msgid "Virtual Ethernet Device" msgstr "Virtualna omrežna naprava" #: src/utils/network.rs:130 msgid "VM Network Bridge" msgstr "Omrežni most VM" #: src/utils/network.rs:131 msgid "VPN Tunnel" msgstr "Predor VPN" #: src/utils/network.rs:132 msgid "VPN Tunnel (WireGuard)" msgstr "Predor VPN (WireGuard)" #: src/utils/network.rs:133 msgid "Wi-Fi Connection" msgstr "Povezava Wi-Fi" #: src/utils/network.rs:134 msgid "WWAN Connection" msgstr "Povezava WWAN" resources-1.9.1/po/sv.po000066400000000000000000001407261510634446000151570ustar00rootroot00000000000000# Swedish translation for resources. # Copyright © 2025 resources's COPYRIGHT HOLDER # This file is distributed under the same license as the resources package. # Anders Jonsson , 2025. # msgid "" msgstr "" "Project-Id-Version: resources main\n" "Report-Msgid-Bugs-To: https://github.com/nokyan/resources/issues/\n" "POT-Creation-Date: 2025-10-04 03:35+0000\n" "PO-Revision-Date: 2025-10-04 14:07+0200\n" "Last-Translator: Anders Jonsson \n" "Language-Team: Swedish \n" "Language: sv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.7\n" #: data/net.nokyan.Resources.desktop.in.in:2 data/net.nokyan.Resources.metainfo.xml.in.in:4 #: data/resources/ui/window.ui:22 src/application.rs:272 msgid "Resources" msgstr "Resurser" #. Translators: The summary should be 35 characters or less according to Flathub appstream guidelines #: data/net.nokyan.Resources.desktop.in.in:3 data/net.nokyan.Resources.metainfo.xml.in.in:5 msgid "Keep an eye on system resources" msgstr "Håll ett öga på systemresurser" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/net.nokyan.Resources.desktop.in.in:9 msgid "System;Resources;Monitor;Processes;Usage;Task;Manager;CPU;RAM;Memory;GPU;" msgstr "System;Resurser;Övervaka;Processer;Användning;Uppgift;Hanterare;CPU;Processor;RAM;Minne;GPU;" #: data/net.nokyan.Resources.metainfo.xml.in.in:17 msgid "" "Resources allows you to check the utilization of your system resources and control your running " "processes and apps. It’s designed to be user-friendly and feel right at home on a modern desktop " "by using GNOME’s libadwaita." msgstr "" "Resurser låter dig kontrollera användandet av ditt system och styra dina körande processer och " "program. Det är designat för att vara användarvänligt och kännas som hemma på ett modernt " "skrivbord genom att använda GNOMEs libadwaita." #: data/net.nokyan.Resources.metainfo.xml.in.in:20 msgid "Resources supports monitoring the following components:" msgstr "Resurser stöder övervakning av följande komponenter:" #: data/net.nokyan.Resources.metainfo.xml.in.in:24 msgid "CPU" msgstr "Processor" #: data/net.nokyan.Resources.metainfo.xml.in.in:25 data/resources/ui/dialogs/app_dialog.ui:82 #: data/resources/ui/dialogs/process_dialog.ui:64 data/resources/ui/dialogs/settings_dialog.ui:128 #: data/resources/ui/dialogs/settings_dialog.ui:220 data/resources/ui/window.ui:176 #: data/resources/ui/window.ui:183 src/ui/pages/applications/mod.rs:803 src/ui/pages/memory.rs:106 #: src/ui/pages/memory.rs:192 src/ui/pages/processes/mod.rs:1079 msgid "Memory" msgstr "Minne" #: data/net.nokyan.Resources.metainfo.xml.in.in:26 data/resources/ui/dialogs/app_dialog.ui:140 #: data/resources/ui/dialogs/process_dialog.ui:118 data/resources/ui/dialogs/settings_dialog.ui:158 #: data/resources/ui/dialogs/settings_dialog.ui:250 src/ui/pages/applications/mod.rs:1181 #: src/ui/pages/gpu.rs:119 src/ui/pages/processes/mod.rs:1469 src/ui/window.rs:468 msgid "GPU" msgstr "GPU" #: data/net.nokyan.Resources.metainfo.xml.in.in:27 data/resources/ui/dialogs/settings_dialog.ui:319 msgid "Network Interfaces" msgstr "Nätverksgränssnitt" #: data/net.nokyan.Resources.metainfo.xml.in.in:28 msgid "Storage Devices" msgstr "Lagringsenheter" #: data/net.nokyan.Resources.metainfo.xml.in.in:29 msgid "Batteries" msgstr "Batterier" #: data/net.nokyan.Resources.metainfo.xml.in.in:51 msgid "Apps page in light theme" msgstr "Programsida i ljust tema" #: data/net.nokyan.Resources.metainfo.xml.in.in:55 msgid "Processes page in dark theme" msgstr "Processida i mörkt tema" #: data/net.nokyan.Resources.metainfo.xml.in.in:59 msgid "Processor page in light theme" msgstr "Processorsida i ljust tema" #: data/net.nokyan.Resources.metainfo.xml.in.in:63 msgid "Memory page in dark theme" msgstr "Minnessida i mörkt tema" #: data/net.nokyan.Resources.metainfo.xml.in.in:67 msgid "GPU page in light theme" msgstr "GPU-sida i ljust tema" #: data/net.nokyan.Resources.metainfo.xml.in.in:71 msgid "Drive page in dark theme" msgstr "Disksida i mörkt tema" #: data/net.nokyan.Resources.metainfo.xml.in.in:75 msgid "Network Interface page in light theme" msgstr "Nätverksgränssnittssida i ljust tema" #: data/net.nokyan.Resources.metainfo.xml.in.in:79 msgid "Battery page in dark theme" msgstr "Batterisida i mörkt tema" #: data/net.nokyan.Resources.policy.in.in:9 msgid "Control Process" msgstr "Styrprocess" #: data/net.nokyan.Resources.policy.in.in:10 msgid "Authentication is required to control superuser’s or other users’ processes" msgstr "Autentisering krävs för att styra superanvändarens eller andra användares processer" #: data/resources/ui/dialogs/app_dialog.ui:7 msgid "App Information" msgstr "Programinformation" #: data/resources/ui/dialogs/app_dialog.ui:70 data/resources/ui/dialogs/process_dialog.ui:48 #: data/resources/ui/pages/battery.ui:22 data/resources/ui/pages/cpu.ui:37 #: data/resources/ui/pages/cpu.ui:50 data/resources/ui/pages/drive.ui:22 #: data/resources/ui/pages/gpu.ui:22 data/resources/ui/pages/memory.ui:31 #: data/resources/ui/pages/network.ui:22 data/resources/ui/pages/npu.ui:22 msgid "Usage" msgstr "Användning" #: data/resources/ui/dialogs/app_dialog.ui:73 data/resources/ui/dialogs/process_dialog.ui:55 #: data/resources/ui/dialogs/settings_dialog.ui:133 data/resources/ui/dialogs/settings_dialog.ui:225 #: data/resources/ui/window.ui:145 data/resources/ui/window.ui:152 #: src/ui/pages/applications/mod.rs:862 src/ui/pages/cpu.rs:128 src/ui/pages/processes/mod.rs:1138 #: src/ui/window.rs:290 msgid "Processor" msgstr "Processor" #: data/resources/ui/dialogs/app_dialog.ui:91 data/resources/ui/dialogs/process_dialog.ui:73 #: data/resources/ui/dialogs/settings_dialog.ui:178 data/resources/ui/dialogs/settings_dialog.ui:290 #: src/ui/pages/applications/mod.rs:1420 src/ui/pages/memory.rs:198 #: src/ui/pages/processes/mod.rs:1954 msgid "Swap" msgstr "Växling" #: data/resources/ui/dialogs/app_dialog.ui:100 data/resources/ui/dialogs/process_dialog.ui:78 #: data/resources/ui/dialogs/settings_dialog.ui:138 data/resources/ui/dialogs/settings_dialog.ui:230 #: src/ui/pages/applications/mod.rs:926 src/ui/pages/processes/mod.rs:1202 msgid "Drive Read" msgstr "Lästa för enhet" #: data/resources/ui/dialogs/app_dialog.ui:109 data/resources/ui/dialogs/process_dialog.ui:87 #: data/resources/ui/dialogs/settings_dialog.ui:143 data/resources/ui/dialogs/settings_dialog.ui:235 #: src/ui/pages/applications/mod.rs:991 src/ui/pages/processes/mod.rs:1269 msgid "Drive Read Total" msgstr "Totalt lästa för enhet" #: data/resources/ui/dialogs/app_dialog.ui:118 data/resources/ui/dialogs/process_dialog.ui:96 #: data/resources/ui/dialogs/settings_dialog.ui:148 data/resources/ui/dialogs/settings_dialog.ui:240 #: src/ui/pages/applications/mod.rs:1052 src/ui/pages/processes/mod.rs:1336 msgid "Drive Write" msgstr "Skrivna för enhet" #: data/resources/ui/dialogs/app_dialog.ui:127 data/resources/ui/dialogs/process_dialog.ui:105 #: data/resources/ui/dialogs/settings_dialog.ui:153 data/resources/ui/dialogs/settings_dialog.ui:245 #: src/ui/pages/applications/mod.rs:1119 src/ui/pages/processes/mod.rs:1403 msgid "Drive Write Total" msgstr "Totalt skrivna för enhet" #: data/resources/ui/dialogs/app_dialog.ui:149 data/resources/ui/dialogs/process_dialog.ui:127 #: data/resources/ui/dialogs/settings_dialog.ui:163 data/resources/ui/dialogs/settings_dialog.ui:255 #: src/ui/pages/applications/mod.rs:1361 src/ui/pages/processes/mod.rs:1650 msgid "Video Memory" msgstr "Videominne" #: data/resources/ui/dialogs/app_dialog.ui:158 data/resources/ui/dialogs/process_dialog.ui:136 #: data/resources/ui/dialogs/settings_dialog.ui:168 data/resources/ui/dialogs/settings_dialog.ui:260 #: src/ui/pages/applications/mod.rs:1240 src/ui/pages/processes/mod.rs:1528 msgid "Video Encoder" msgstr "Videokodare" #: data/resources/ui/dialogs/app_dialog.ui:167 data/resources/ui/dialogs/process_dialog.ui:145 #: data/resources/ui/dialogs/settings_dialog.ui:173 data/resources/ui/dialogs/settings_dialog.ui:265 #: src/ui/pages/applications/mod.rs:1301 src/ui/pages/processes/mod.rs:1589 msgid "Video Decoder" msgstr "Videoavkodare" #: data/resources/ui/dialogs/app_dialog.ui:174 data/resources/ui/dialogs/process_dialog.ui:179 #: data/resources/ui/pages/battery.ui:33 data/resources/ui/pages/cpu.ui:83 #: data/resources/ui/pages/drive.ui:54 data/resources/ui/pages/gpu.ui:74 #: data/resources/ui/pages/memory.ui:42 data/resources/ui/pages/network.ui:51 #: data/resources/ui/pages/npu.ui:68 msgid "Properties" msgstr "Egenskaper" #: data/resources/ui/dialogs/app_dialog.ui:180 msgid "ID" msgstr "ID" #: data/resources/ui/dialogs/app_dialog.ui:190 data/resources/ui/dialogs/process_dialog.ui:195 msgid "Running Since" msgstr "Kör sedan" #: data/resources/ui/dialogs/app_dialog.ui:198 msgid "Running Processes" msgstr "Körande processer" #: data/resources/ui/dialogs/app_dialog.ui:207 data/resources/ui/dialogs/process_dialog.ui:231 msgid "Containerized" msgstr "I en behållare" #: data/resources/ui/dialogs/process_dialog.ui:7 msgid "Process Information" msgstr "Processinformation" #: data/resources/ui/dialogs/process_dialog.ui:154 data/resources/ui/dialogs/settings_dialog.ui:270 #: src/ui/pages/processes/mod.rs:1710 msgid "Total CPU Time" msgstr "Total processortid" #: data/resources/ui/dialogs/process_dialog.ui:163 data/resources/ui/dialogs/settings_dialog.ui:275 #: src/ui/pages/processes/mod.rs:1769 msgid "User CPU Time" msgstr "Processortid för användare" #: data/resources/ui/dialogs/process_dialog.ui:172 data/resources/ui/dialogs/settings_dialog.ui:280 #: src/ui/pages/processes/mod.rs:1828 msgid "System CPU Time" msgstr "Processortid för system" #: data/resources/ui/dialogs/process_dialog.ui:186 data/resources/ui/dialogs/settings_dialog.ui:210 #: src/ui/pages/processes/mod.rs:972 msgid "Process ID" msgstr "Process-ID" #: data/resources/ui/dialogs/process_dialog.ui:204 msgid "Commandline" msgstr "Kommandorad" #: data/resources/ui/dialogs/process_dialog.ui:213 data/resources/ui/dialogs/settings_dialog.ui:215 #: src/ui/pages/processes/mod.rs:1025 msgid "User" msgstr "Användare" #: data/resources/ui/dialogs/process_dialog.ui:222 msgid "Control Group" msgstr "Styrgrupp" #: data/resources/ui/dialogs/process_options_dialog.ui:7 #: data/resources/ui/dialogs/process_options_dialog.ui:69 msgid "Process Options" msgstr "Processalternativ" #: data/resources/ui/dialogs/process_options_dialog.ui:29 msgid "Apply" msgstr "Verkställ" #: data/resources/ui/dialogs/process_options_dialog.ui:72 msgid "Niceness" msgstr "Nice-värde" #: data/resources/ui/dialogs/process_options_dialog.ui:73 msgid "" "The priority of a process is given by its niceness. A lower niceness value correspond to a higher " "priority." msgstr "" "Prioriteten hos en process ges av dess nice-värde. Ett lägre nice-värde motsvarar en högre " "prioritet." #: data/resources/ui/dialogs/process_options_dialog.ui:87 #: data/resources/ui/dialogs/settings_dialog.ui:285 src/ui/pages/processes/mod.rs:1887 msgid "Priority" msgstr "Prioritet" #: data/resources/ui/dialogs/process_options_dialog.ui:91 msgctxt "process priority" msgid "Very High" msgstr "Mycket hög" #: data/resources/ui/dialogs/process_options_dialog.ui:92 msgctxt "process priority" msgid "High" msgstr "Hög" #: data/resources/ui/dialogs/process_options_dialog.ui:93 msgctxt "process priority" msgid "Normal" msgstr "Normal" #: data/resources/ui/dialogs/process_options_dialog.ui:94 msgctxt "process priority" msgid "Low" msgstr "Låg" #: data/resources/ui/dialogs/process_options_dialog.ui:95 msgctxt "process priority" msgid "Very Low" msgstr "Mycket låg" #: data/resources/ui/dialogs/process_options_dialog.ui:103 msgid "Processor Affinity" msgstr "Processoraffinitet" #: data/resources/ui/dialogs/process_options_dialog.ui:108 msgid "Toggle All" msgstr "Växla alla" #: data/resources/ui/dialogs/process_options_dialog.ui:111 msgid "Select which processor cores the process is allowed to run on" msgstr "Välj vilka processorkärnor som processen får köra på" #: data/resources/ui/dialogs/settings_dialog.ui:7 msgid "General" msgstr "Allmänt" #: data/resources/ui/dialogs/settings_dialog.ui:10 msgid "Units" msgstr "Enheter" #: data/resources/ui/dialogs/settings_dialog.ui:13 msgid "Data Unit Prefix" msgstr "Dataenhetsprefix" #: data/resources/ui/dialogs/settings_dialog.ui:17 msgid "Decimal" msgstr "Decimalt" #: data/resources/ui/dialogs/settings_dialog.ui:18 msgid "Binary" msgstr "Binärt" #: data/resources/ui/dialogs/settings_dialog.ui:26 msgid "Show Network Speeds in Bits per Second" msgstr "Visa nätverkshastigheter i bitar per sekund" #: data/resources/ui/dialogs/settings_dialog.ui:31 msgid "Temperature Unit" msgstr "Temperaturenhet" #: data/resources/ui/dialogs/settings_dialog.ui:35 msgid "Celsius" msgstr "Celsius" #: data/resources/ui/dialogs/settings_dialog.ui:36 msgid "Kelvin" msgstr "Kelvin" #: data/resources/ui/dialogs/settings_dialog.ui:37 msgid "Fahrenheit" msgstr "Fahrenheit" #: data/resources/ui/dialogs/settings_dialog.ui:47 msgid "User Interface" msgstr "Användargränssnitt" #: data/resources/ui/dialogs/settings_dialog.ui:50 msgid "Refresh Speed" msgstr "Uppdatera hastighet" #: data/resources/ui/dialogs/settings_dialog.ui:51 msgid "Higher refresh speeds can lead to higher processor usage" msgstr "Högre uppdateringshastigheter kan leda till högre processoranvändning" #: data/resources/ui/dialogs/settings_dialog.ui:55 msgctxt "UI refresh speed" msgid "Very Slow" msgstr "Väldigt långsam" #: data/resources/ui/dialogs/settings_dialog.ui:56 msgctxt "UI refresh speed" msgid "Slow" msgstr "Långsam" #: data/resources/ui/dialogs/settings_dialog.ui:57 msgctxt "UI refresh speed" msgid "Normal" msgstr "Normal" #: data/resources/ui/dialogs/settings_dialog.ui:58 msgctxt "UI refresh speed" msgid "Fast" msgstr "Snabb" #: data/resources/ui/dialogs/settings_dialog.ui:59 msgctxt "UI refresh speed" msgid "Very Fast" msgstr "Väldigt snabb" #: data/resources/ui/dialogs/settings_dialog.ui:67 msgid "Show Graph Grids" msgstr "Visa rutnät för diagram" #: data/resources/ui/dialogs/settings_dialog.ui:72 msgid "Graph Data Points" msgstr "Datapunkter i diagram" #: data/resources/ui/dialogs/settings_dialog.ui:86 msgid "Show Usage Details in Sidebar" msgstr "Visa användningsdetaljer i sidopanel" #: data/resources/ui/dialogs/settings_dialog.ui:87 msgid "If enabled, the usage along with other information will be displayed" msgstr "Om aktiverat kommer användningen visas tillsammans med annan information" #: data/resources/ui/dialogs/settings_dialog.ui:92 msgid "Show Device Descriptions in Sidebar" msgstr "Visa enhetsbeskrivningar i sidopanel" #: data/resources/ui/dialogs/settings_dialog.ui:93 msgid "If enabled, a device identifier like its name or device type will be displayed" msgstr "Om aktiverat kommer en enhetsidentifierare som dess namn eller enhetstyp att visas" #: data/resources/ui/dialogs/settings_dialog.ui:98 msgid "Sidebar Meter Type" msgstr "Mätartyp för sidopanel" #: data/resources/ui/dialogs/settings_dialog.ui:102 msgid "Bar" msgstr "Stolpe" #: data/resources/ui/dialogs/settings_dialog.ui:103 msgid "Graph" msgstr "Diagram" #: data/resources/ui/dialogs/settings_dialog.ui:111 msgid "Normalize Processor Usage" msgstr "Normalisera processoranvändning" #: data/resources/ui/dialogs/settings_dialog.ui:112 msgid "If enabled, the total usage of all cores will be divided by the amount of cores" msgstr "Om aktiverat kommer den totala användningen för alla kärnor delas med antalet kärnor" #: data/resources/ui/dialogs/settings_dialog.ui:122 data/resources/ui/window.ui:65 #: data/resources/ui/window.ui:72 src/ui/pages/applications/mod.rs:131 msgid "Apps" msgstr "Program" #: data/resources/ui/dialogs/settings_dialog.ui:125 data/resources/ui/dialogs/settings_dialog.ui:207 msgid "Information Columns" msgstr "Informationskolumner" #: data/resources/ui/dialogs/settings_dialog.ui:183 data/resources/ui/dialogs/settings_dialog.ui:295 #: src/ui/pages/applications/mod.rs:1479 src/ui/pages/processes/mod.rs:2013 msgid "Combined Memory" msgstr "Kombinerat minne" #: data/resources/ui/dialogs/settings_dialog.ui:193 data/resources/ui/window.ui:105 #: data/resources/ui/window.ui:112 src/ui/pages/processes/mod.rs:175 msgid "Processes" msgstr "Processer" #: data/resources/ui/dialogs/settings_dialog.ui:196 data/resources/ui/pages/cpu.ui:22 #: data/resources/ui/pages/processes.ui:56 msgid "Options" msgstr "Alternativ" #: data/resources/ui/dialogs/settings_dialog.ui:199 msgid "Show Niceness Values" msgstr "Visa nice-värden" #: data/resources/ui/dialogs/settings_dialog.ui:200 msgid "Display priorities as niceness to allow for more fine-grained adjustments" msgstr "Visa prioriteter som nice-värde för att tillåta mer finkornig justering" #: data/resources/ui/dialogs/settings_dialog.ui:305 msgid "Devices" msgstr "Enheter" #: data/resources/ui/dialogs/settings_dialog.ui:308 msgid "Drives" msgstr "Diskar" #: data/resources/ui/dialogs/settings_dialog.ui:311 msgid "Show Virtual Drives" msgstr "Visa virtuella diskar" #: data/resources/ui/dialogs/settings_dialog.ui:312 msgid "Virtual drives are for example ZFS volumes or mapped devices" msgstr "Virtuella diskar är exempelvis ZFS-volymer eller mappade enheter" #: data/resources/ui/dialogs/settings_dialog.ui:322 msgid "Show Virtual Network Interfaces" msgstr "Visa virtuella nätverksgränssnitt" #: data/resources/ui/dialogs/settings_dialog.ui:323 msgid "Virtual network interfaces are for example bridges or VPN tunnels" msgstr "Virtuella nätverksgränssnitt är exempelvis bryggor eller VPN-tunnlar" #: data/resources/ui/pages/applications.ui:6 data/resources/ui/pages/applications.ui:26 #: src/ui/pages/applications/mod.rs:1563 msgid "Kill App" msgstr "Döda program" #: data/resources/ui/pages/applications.ui:10 data/resources/ui/pages/applications.ui:30 #: src/ui/pages/applications/mod.rs:1562 msgid "Halt App" msgstr "Stoppa program" #: data/resources/ui/pages/applications.ui:14 data/resources/ui/pages/applications.ui:34 #: src/ui/pages/applications/mod.rs:1564 msgid "Continue App" msgstr "Fortsätt program" #: data/resources/ui/pages/applications.ui:22 data/resources/ui/pages/applications.ui:98 #: src/ui/pages/applications/mod.rs:1561 msgid "End App" msgstr "Avsluta program" #: data/resources/ui/pages/applications.ui:40 data/resources/ui/pages/processes.ui:62 msgid "Information" msgstr "Information" #: data/resources/ui/pages/applications.ui:57 msgid "Search applications" msgstr "Sök program" #: data/resources/ui/pages/applications.ui:87 data/resources/ui/pages/applications.ui:89 msgid "Show App Information" msgstr "Visa programinformation" #: data/resources/ui/pages/battery.ui:36 msgid "Battery Health" msgstr "Batterihälsa" #: data/resources/ui/pages/battery.ui:45 msgid "Design Capacity" msgstr "Designkapacitet" #: data/resources/ui/pages/battery.ui:54 msgid "Charge Cycles" msgstr "Laddningscykler" #: data/resources/ui/pages/battery.ui:63 msgid "Technology" msgstr "Teknologi" #: data/resources/ui/pages/battery.ui:72 data/resources/ui/pages/gpu.ui:81 #: data/resources/ui/pages/network.ui:58 data/resources/ui/pages/npu.ui:75 msgid "Manufacturer" msgstr "Tillverkare" #: data/resources/ui/pages/battery.ui:81 msgid "Model Name" msgstr "Modellnamn" #: data/resources/ui/pages/battery.ui:90 data/resources/ui/pages/drive.ui:66 msgid "Device" msgstr "Enhet" #: data/resources/ui/pages/cpu.ui:26 msgid "Show Usages of Logical CPUs" msgstr "Visa användning för logiska processorer" #: data/resources/ui/pages/cpu.ui:75 data/resources/ui/pages/gpu.ui:66 #: data/resources/ui/pages/npu.ui:60 msgid "Sensors" msgstr "Sensorer" #: data/resources/ui/pages/cpu.ui:90 msgid "Max Frequency" msgstr "Maxfrekvens" #: data/resources/ui/pages/cpu.ui:99 msgid "Logical Cores" msgstr "Logiska kärnor" #: data/resources/ui/pages/cpu.ui:108 msgid "Physical Cores" msgstr "Fysiska kärnor" #: data/resources/ui/pages/cpu.ui:117 msgid "Sockets" msgstr "Uttag" #: data/resources/ui/pages/cpu.ui:126 msgid "Uptime" msgstr "Upptid" #: data/resources/ui/pages/cpu.ui:135 msgid "Virtualization" msgstr "Virtualisering" #: data/resources/ui/pages/cpu.ui:144 msgid "Architecture" msgstr "Arkitektur" #: data/resources/ui/pages/drive.ui:38 msgid "Total Read" msgstr "Totalt läst" #: data/resources/ui/pages/drive.ui:47 msgid "Total Written" msgstr "Totalt skrivet" #: data/resources/ui/pages/drive.ui:57 data/resources/ui/pages/memory.ui:72 msgid "Type" msgstr "Typ" #: data/resources/ui/pages/drive.ui:75 msgid "Capacity" msgstr "Kapacitet" #: data/resources/ui/pages/drive.ui:84 msgid "Writable" msgstr "Skrivbar" #: data/resources/ui/pages/drive.ui:93 msgid "Removable" msgstr "Flyttbar" #. Translators: "Link" refers to something like "PCIe 4.0 ×16" #: data/resources/ui/pages/drive.ui:102 data/resources/ui/pages/gpu.ui:113 #: data/resources/ui/pages/network.ui:103 data/resources/ui/pages/npu.ui:107 msgid "Link" msgstr "Länk" #: data/resources/ui/pages/gpu.ui:37 msgid "GPU Frequency" msgstr "GPU-frekvens" #: data/resources/ui/pages/gpu.ui:50 msgid "Video Memory Frequency" msgstr "Videominnesfrekvens" #: data/resources/ui/pages/gpu.ui:55 data/resources/ui/pages/npu.ui:49 src/ui/pages/battery.rs:217 msgid "Power Usage" msgstr "Strömförbrukning" #: data/resources/ui/pages/gpu.ui:90 data/resources/ui/pages/npu.ui:84 msgid "PCI Slot" msgstr "PCI-fack" #: data/resources/ui/pages/gpu.ui:99 data/resources/ui/pages/network.ui:67 #: data/resources/ui/pages/npu.ui:93 msgid "Driver Used" msgstr "Drivrutin som används" #: data/resources/ui/pages/gpu.ui:108 data/resources/ui/pages/npu.ui:102 msgid "Max Power Cap" msgstr "Maximal strömgräns" #: data/resources/ui/pages/memory.ui:9 msgid "You need to authenticate to see memory properties" msgstr "Du måste autentisera dig för att se minnesegenskaper" #: data/resources/ui/pages/memory.ui:10 msgid "Authenticate" msgstr "Autentisera" #: data/resources/ui/pages/memory.ui:45 msgid "Slots Used" msgstr "Fack som används" #: data/resources/ui/pages/memory.ui:54 msgid "Speed" msgstr "Hastighet" #: data/resources/ui/pages/memory.ui:63 msgid "Form Factor" msgstr "Formfaktor" #: data/resources/ui/pages/memory.ui:81 msgid "Type Detail" msgstr "Typdetaljer" #: data/resources/ui/pages/network.ui:35 msgid "Total Received" msgstr "Totalt mottaget" #: data/resources/ui/pages/network.ui:44 msgid "Total Sent" msgstr "Totalt skickat" #: data/resources/ui/pages/network.ui:76 msgid "Interface" msgstr "Gränssnitt" #: data/resources/ui/pages/network.ui:85 msgid "Hardware Address" msgstr "Hårdvaruadress" #: data/resources/ui/pages/network.ui:94 msgid "Network Name" msgstr "Nätverksnamn" #: data/resources/ui/pages/network.ui:112 msgid "Link Speed" msgstr "Länkhastighet" #: data/resources/ui/pages/npu.ui:31 msgid "NPU Frequency" msgstr "NPU-frekvens" #: data/resources/ui/pages/npu.ui:44 msgid "Memory Frequency" msgstr "Minnesfrekvens" #: data/resources/ui/pages/processes.ui:6 data/resources/ui/pages/processes.ui:42 #: src/ui/pages/processes/mod.rs:2126 msgid "Kill Process" msgstr "Döda process" #: data/resources/ui/pages/processes.ui:10 data/resources/ui/pages/processes.ui:46 #: src/ui/pages/processes/mod.rs:2125 msgid "Halt Process" msgstr "Stoppa process" #: data/resources/ui/pages/processes.ui:14 data/resources/ui/pages/processes.ui:50 #: src/ui/pages/processes/mod.rs:2127 msgid "Continue Process" msgstr "Fortsätt process" #: data/resources/ui/pages/processes.ui:22 data/resources/ui/pages/processes.ui:74 msgid "Kill Processes" msgstr "Döda processer" #: data/resources/ui/pages/processes.ui:26 data/resources/ui/pages/processes.ui:78 msgid "Halt Processes" msgstr "Stoppa processer" #: data/resources/ui/pages/processes.ui:30 data/resources/ui/pages/processes.ui:82 msgid "Continue Processes" msgstr "Fortsätt processer" #: data/resources/ui/pages/processes.ui:38 data/resources/ui/pages/processes.ui:157 #: src/ui/pages/processes/mod.rs:523 src/ui/pages/processes/mod.rs:2124 msgid "End Process" msgstr "Avsluta process" #: data/resources/ui/pages/processes.ui:70 src/ui/pages/processes/mod.rs:527 msgid "End Processes" msgstr "Avsluta processer" #: data/resources/ui/pages/processes.ui:103 msgid "Search processes" msgstr "Sök processer" #: data/resources/ui/pages/processes.ui:133 data/resources/ui/pages/processes.ui:135 msgid "Show Process Options" msgstr "Visa processalternativ" #: data/resources/ui/pages/processes.ui:146 data/resources/ui/pages/processes.ui:148 msgid "Show Process Information" msgstr "Visa processinformation" #: data/resources/ui/shortcuts.ui:6 msgctxt "shortcut window" msgid "General" msgstr "Allmänt" #: data/resources/ui/shortcuts.ui:9 msgctxt "shortcut window" msgid "Preferences" msgstr "Inställningar" #: data/resources/ui/shortcuts.ui:15 msgctxt "shortcut window" msgid "Show Shortcuts" msgstr "Visa kortkommandon" #: data/resources/ui/shortcuts.ui:21 msgctxt "shortcut window" msgid "Quit" msgstr "Avsluta" #: data/resources/ui/shortcuts.ui:29 msgctxt "shortcut window" msgid "Apps/Processes" msgstr "Program/Processer" #: data/resources/ui/shortcuts.ui:32 msgctxt "shortcut window" msgid "Toggle Search Field" msgstr "Växla sökfält" #: data/resources/ui/shortcuts.ui:38 msgctxt "shortcut window" msgid "End App/Process" msgstr "Avsluta program/process" #: data/resources/ui/shortcuts.ui:44 msgctxt "shortcut window" msgid "Kill App/Process" msgstr "Döda program/process" #: data/resources/ui/shortcuts.ui:50 msgctxt "shortcut window" msgid "Halt App/Process" msgstr "Stoppa program/process" #: data/resources/ui/shortcuts.ui:56 msgctxt "shortcut window" msgid "Continue App/Process" msgstr "Fortsätt program/process" #: data/resources/ui/shortcuts.ui:62 msgctxt "shortcut window" msgid "Show Information for App/Process" msgstr "Visa information för app/process" #: data/resources/ui/shortcuts.ui:68 msgctxt "shortcut window" msgid "Show Process Options" msgstr "Visa processalternativ" #: data/resources/ui/window.ui:6 msgid "Preferences" msgstr "Inställningar" #: data/resources/ui/window.ui:10 msgid "Keyboard Shortcuts" msgstr "Tangentbordsgenvägar" #: data/resources/ui/window.ui:14 msgid "About Resources" msgstr "Om Resurser" #: data/resources/ui/window.ui:88 data/resources/ui/window.ui:128 msgid "Search" msgstr "Sök" #: data/resources/ui/window.ui:90 data/resources/ui/window.ui:130 msgid "Toggle search field" msgstr "Växla sökfält" #: src/application.rs:274 msgid "The Nalux Team" msgstr "Nalux-gruppen" #: src/application.rs:282 msgid "Report Issues" msgstr "Rapportera problem" #. Translator credits. Replace "translator-credits" with your name/username, and optionally an email or URL. #. One name per line, please do not remove previous names. #: src/application.rs:288 msgid "translator-credits" msgstr "" "Anders Jonsson \n" "\n" "Skicka synpunkter på översättningen till\n" "." #: src/application.rs:289 msgid "Icon by" msgstr "Ikon av" #: src/ui/dialogs/app_dialog.rs:155 src/ui/dialogs/process_dialog.rs:133 #: src/ui/dialogs/process_dialog.rs:137 src/ui/dialogs/process_dialog.rs:146 #: src/ui/dialogs/process_dialog.rs:148 src/ui/dialogs/process_dialog.rs:171 #: src/ui/dialogs/process_dialog.rs:178 src/ui/dialogs/process_dialog.rs:185 #: src/ui/dialogs/process_dialog.rs:192 src/ui/pages/applications/mod.rs:948 #: src/ui/pages/applications/mod.rs:1074 src/ui/pages/battery.rs:205 src/ui/pages/battery.rs:225 #: src/ui/pages/battery.rs:231 src/ui/pages/battery.rs:234 src/ui/pages/battery.rs:265 #: src/ui/pages/battery.rs:289 src/ui/pages/battery.rs:291 src/ui/pages/battery.rs:301 #: src/ui/pages/cpu.rs:243 src/ui/pages/cpu.rs:258 src/ui/pages/cpu.rs:278 src/ui/pages/cpu.rs:284 #: src/ui/pages/cpu.rs:290 src/ui/pages/cpu.rs:296 src/ui/pages/cpu.rs:300 src/ui/pages/cpu.rs:303 #: src/ui/pages/cpu.rs:341 src/ui/pages/cpu.rs:448 src/ui/pages/drive.rs:319 #: src/ui/pages/drive.rs:350 src/ui/pages/drive.rs:352 src/ui/pages/drive.rs:381 #: src/ui/pages/drive.rs:383 src/ui/pages/drive.rs:399 src/ui/pages/drive.rs:400 #: src/ui/pages/drive.rs:407 src/ui/pages/drive.rs:417 src/ui/pages/drive.rs:427 #: src/ui/pages/drive.rs:433 src/ui/pages/gpu.rs:245 src/ui/pages/gpu.rs:252 src/ui/pages/gpu.rs:297 #: src/ui/pages/gpu.rs:322 src/ui/pages/gpu.rs:325 src/ui/pages/gpu.rs:336 src/ui/pages/gpu.rs:377 #: src/ui/pages/gpu.rs:384 src/ui/pages/gpu.rs:396 src/ui/pages/gpu.rs:403 src/ui/pages/gpu.rs:407 #: src/ui/pages/gpu.rs:437 src/ui/pages/gpu.rs:443 src/ui/pages/memory.rs:227 #: src/ui/pages/memory.rs:228 src/ui/pages/memory.rs:232 src/ui/pages/memory.rs:233 #: src/ui/pages/memory.rs:237 src/ui/pages/memory.rs:238 src/ui/pages/memory.rs:266 #: src/ui/pages/memory.rs:327 src/ui/pages/network.rs:252 src/ui/pages/network.rs:259 #: src/ui/pages/network.rs:266 src/ui/pages/network.rs:272 src/ui/pages/network.rs:275 #: src/ui/pages/network.rs:285 src/ui/pages/network.rs:292 src/ui/pages/network.rs:302 #: src/ui/pages/network.rs:370 src/ui/pages/network.rs:373 src/ui/pages/network.rs:375 #: src/ui/pages/network.rs:404 src/ui/pages/network.rs:407 src/ui/pages/network.rs:409 #: src/ui/pages/network.rs:417 src/ui/pages/network.rs:424 src/ui/pages/network.rs:434 #: src/ui/pages/processes/mod.rs:1224 src/ui/pages/processes/mod.rs:1291 #: src/ui/pages/processes/mod.rs:1358 src/ui/pages/processes/mod.rs:1425 #: src/ui/pages/processes/mod.rs:1911 src/ui/pages/processes/mod.rs:1913 src/utils/battery.rs:152 #: src/utils/drive.rs:137 src/utils/gpu/mod.rs:279 src/utils/gpu/mod.rs:291 src/utils/link/mod.rs:61 #: src/utils/npu/mod.rs:244 src/utils/npu/mod.rs:250 msgid "N/A" msgstr "-" #: src/ui/dialogs/process_options_dialog.rs:147 src/ui/pages/cpu.rs:257 src/ui/pages/cpu.rs:417 #: src/ui/pages/cpu.rs:421 msgid "CPU {}" msgstr "Processor {}" #: src/ui/pages/applications/application_entry.rs:190 src/ui/pages/drive.rs:414 #: src/ui/pages/drive.rs:424 src/ui/pages/processes/process_entry.rs:211 msgid "No" msgstr "Nej" #: src/ui/pages/applications/application_entry.rs:191 src/ui/pages/processes/process_entry.rs:212 msgid "Yes (Flatpak)" msgstr "Ja (Flatpak)" #: src/ui/pages/applications/application_entry.rs:192 src/ui/pages/processes/process_entry.rs:213 msgid "Yes (Snap)" msgstr "Ja (Snap)" #: src/ui/pages/applications/mod.rs:660 msgid "Running Apps: {}" msgstr "Program som körs: {}" #: src/ui/pages/applications/mod.rs:700 src/ui/pages/processes/mod.rs:862 msgid "Cancel" msgstr "Avbryt" #: src/ui/pages/applications/mod.rs:746 msgid "App" msgstr "Program" #: src/ui/pages/applications/mod.rs:1539 src/ui/pages/processes/mod.rs:2073 msgid "End {}?" msgstr "Avsluta {}?" #: src/ui/pages/applications/mod.rs:1540 src/ui/pages/processes/mod.rs:2074 msgid "Halt {}?" msgstr "Stoppa {}?" #: src/ui/pages/applications/mod.rs:1541 src/ui/pages/processes/mod.rs:2075 msgid "Kill {}?" msgstr "Döda {}?" #: src/ui/pages/applications/mod.rs:1542 src/ui/pages/processes/mod.rs:2076 msgid "Continue {}?" msgstr "Fortsätt {}?" #: src/ui/pages/applications/mod.rs:1548 src/ui/pages/processes/mod.rs:2111 msgid "Unsaved work might be lost." msgstr "Osparat arbete kan gå förlorat." #: src/ui/pages/applications/mod.rs:1550 msgid "" "Halting an app can come with serious risks such as losing data and security implications. Use with " "caution." msgstr "" "Att stoppa ett program kan komma med allvarliga risker såsom att förlora data och " "säkerhetsföljder. Använd med varsamhet." #: src/ui/pages/applications/mod.rs:1553 msgid "" "Killing an app can come with serious risks such as losing data and security implications. Use with " "caution." msgstr "" "Att döda ett program kan komma med allvarliga risker såsom att förlora data och säkerhetsföljder. " "Använd med varsamhet." #: src/ui/pages/battery.rs:102 src/utils/battery.rs:258 msgid "Battery" msgstr "Batteri" #: src/ui/pages/battery.rs:210 msgid "Battery Charge" msgstr "Batteriladdning" #: src/ui/pages/battery.rs:279 src/ui/pages/cpu.rs:438 src/ui/pages/drive.rs:344 #: src/ui/pages/drive.rs:375 src/ui/pages/gpu.rs:429 src/ui/pages/network.rs:362 #: src/ui/pages/network.rs:396 msgid "Highest:" msgstr "Högsta:" #: src/ui/pages/cpu.rs:242 src/ui/pages/gpu.rs:212 msgid "Total Usage" msgstr "Total användning" #: src/ui/pages/cpu.rs:271 src/ui/pages/gpu.rs:239 msgid "Temperature" msgstr "Temperatur" #: src/ui/pages/drive.rs:126 msgid "Drive" msgstr "Disk" #: src/ui/pages/drive.rs:236 msgid "Drive Activity" msgstr "Diskaktivitet" #: src/ui/pages/drive.rs:243 msgid "Read Speed" msgstr "Läshastighet" #: src/ui/pages/drive.rs:247 msgid "Write Speed" msgstr "Skrivhastighet" #: src/ui/pages/drive.rs:412 src/ui/pages/drive.rs:422 msgid "Yes" msgstr "Ja" #. Translators: This is an abbreviation for "Read" and "Write". This is displayed in the sidebar so your #. translation should preferably be quite short or an abbreviation #: src/ui/pages/drive.rs:440 msgid "R: {} · W: {}" msgstr "L: {} · S: {}" #: src/ui/pages/gpu.rs:220 msgid "Video Encoder/Decoder Usage" msgstr "Användning av videokodare/avkodare" #: src/ui/pages/gpu.rs:226 msgid "Video Encoder Usage" msgstr "Användning av videokodare" #: src/ui/pages/gpu.rs:231 msgid "Video Decoder Usage" msgstr "Användning av videoavkodare" #: src/ui/pages/gpu.rs:236 msgid "Video Memory Usage" msgstr "Videominnesanvändning" #. Translators: This will be displayed in the sidebar, please try to keep your translation as short as (or even #. shorter than) 'Memory' #: src/ui/pages/gpu.rs:415 msgid "Memory: {}" msgstr "Minne: {}" #: src/ui/pages/memory.rs:262 msgid "{} of {}" msgstr "{} av {}" #: src/ui/pages/memory.rs:265 msgid "{} MT/s" msgstr "{} MT/s" #. Translators: This will be displayed in the sidebar, so your translation for "Swap" should #. preferably be quite short or an abbreviation #: src/ui/pages/memory.rs:346 msgid "{} / {} · Swap: {} %" msgstr "{} / {} · Växling: {} %" #: src/ui/pages/network.rs:127 src/utils/network.rs:135 msgid "Network Interface" msgstr "Nätverksgränssnitt" #: src/ui/pages/network.rs:241 msgid "Receiving" msgstr "Tar emot" #: src/ui/pages/network.rs:245 msgid "Sending" msgstr "Skickar" #. Translators: This is an abbreviation for "Receive" and "Send". This is displayed in the sidebar so #. your translation should preferably be quite short or an abbreviation #: src/ui/pages/network.rs:445 msgid "R: {} · S: {}" msgstr "T: {} · S: {}" #: src/ui/pages/processes/mod.rs:813 msgid "Running Processes: {}" msgstr "Körande processer: {}" #: src/ui/pages/processes/mod.rs:911 msgid "Process" msgstr "Process" #: src/ui/pages/processes/mod.rs:2083 msgid "End process?" msgid_plural "End {} processes?" msgstr[0] "Avsluta process?" msgstr[1] "Avsluta {} processer?" #: src/ui/pages/processes/mod.rs:2089 msgid "Halt process?" msgid_plural "Halt {} processes?" msgstr[0] "Stoppa process?" msgstr[1] "Stoppa {} processer?" #: src/ui/pages/processes/mod.rs:2095 src/ui/pages/processes/mod.rs:2101 msgid "Kill process?" msgid_plural "Kill {} processes?" msgstr[0] "Döda process?" msgstr[1] "Döda {} processer?" #: src/ui/pages/processes/mod.rs:2113 msgid "" "Halting a process can come with serious risks such as losing data and security implications. Use " "with caution." msgstr "" "Att stoppa en process kan komma med allvarliga risker såsom att förlora data och säkerhetsföljder. " "Använd med varsamhet." #: src/ui/pages/processes/mod.rs:2116 msgid "" "Killing a process can come with serious risks such as losing data and security implications. Use " "with caution." msgstr "" "Att döda en process kan komma med allvarliga risker såsom att förlora data och säkerhetsföljder. " "Använd med varsamhet." #: src/ui/window.rs:466 msgid "GPU {}" msgstr "GPU {}" #: src/ui/window.rs:496 msgid "NPU {}" msgstr "NPU {}" #: src/ui/window.rs:498 msgid "NPU" msgstr "NPU" #: src/ui/window.rs:1174 msgid "Successfully adjusted {}" msgstr "Justerade {}" #: src/ui/window.rs:1175 msgid "There was a problem adjusting {}" msgstr "Ett problem uppstod vid justering av {}" #: src/ui/window.rs:1257 msgid "Successfully ended {}" msgstr "Avslutade {}" #: src/ui/window.rs:1258 msgid "Successfully halted {}" msgstr "Stoppade {}" #: src/ui/window.rs:1259 msgid "Successfully killed {}" msgstr "Dödade {}" #: src/ui/window.rs:1260 msgid "Successfully continued {}" msgstr "Fortsatte {}" #: src/ui/window.rs:1267 msgid "Successfully ended the process" msgid_plural "Successfully ended {} processes" msgstr[0] "Avslutade processen" msgstr[1] "Avslutade {} processer" #: src/ui/window.rs:1273 msgid "Successfully halted the process" msgid_plural "Successfully halted {} processes" msgstr[0] "Stoppade processen" msgstr[1] "Stoppade {} processer" #: src/ui/window.rs:1279 msgid "Successfully killed the process" msgid_plural "Successfully killed {} processes" msgstr[0] "Dödade processen" msgstr[1] "Dödade {} processer" #: src/ui/window.rs:1285 msgid "Successfully continued the process" msgid_plural "Successfully continued {} processes" msgstr[0] "Fortsatte processen" msgstr[1] "Fortsatte {} processer" #: src/ui/window.rs:1296 msgid "There was a problem ending a process" msgid_plural "There were problems ending {} processes" msgstr[0] "Ett problem uppstod då en process skulle avslutas" msgstr[1] "Ett problem uppstod då {} processer skulle avslutas" #: src/ui/window.rs:1302 msgid "There was a problem halting a process" msgid_plural "There were problems halting {} processes" msgstr[0] "Ett problem uppstod då en process skulle stoppas" msgstr[1] "Ett problem uppstod då {} processer skulle stoppas" #: src/ui/window.rs:1308 msgid "There was a problem killing a process" msgid_plural "There were problems killing {} processes" msgstr[0] "Ett problem uppstod då en process skulle dödas" msgstr[1] "Ett problem uppstod då {} processer skulle dödas" #: src/ui/window.rs:1314 msgid "There was a problem continuing a process" msgid_plural "There were problems continuing {} processes" msgstr[0] "Ett problem uppstod då en process skulle fortsättas" msgstr[1] "Ett problem uppstod då {} processer skulle fortsättas" #: src/ui/window.rs:1324 msgid "There was a problem ending {}" msgstr "Ett problem uppstod då {} skulle avslutas" #: src/ui/window.rs:1325 msgid "There was a problem halting {}" msgstr "Ett problem uppstod då {} skulle stoppas" #: src/ui/window.rs:1326 msgid "There was a problem killing {}" msgstr "Ett problem uppstod då {} skulle dödas" #: src/ui/window.rs:1327 msgid "There was a problem continuing {}" msgstr "Ett problem uppstod då {} skulle fortsättas" #: src/utils/app.rs:222 msgid "System Processes" msgstr "Systemprocesser" #: src/utils/battery.rs:93 msgid "Charging" msgstr "Laddar" #: src/utils/battery.rs:94 msgid "Discharging" msgstr "Laddar ur" #: src/utils/battery.rs:95 msgid "Empty" msgstr "Tomt" #: src/utils/battery.rs:96 msgid "Full" msgstr "Fullt" #: src/utils/battery.rs:97 msgid "Unknown" msgstr "Okänt" #: src/utils/battery.rs:143 msgid "Nickel-Metal Hydride" msgstr "Nickelmetallhydrid" #: src/utils/battery.rs:144 msgid "Nickel-Cadmium" msgstr "Nickel-kadmium" #: src/utils/battery.rs:145 msgid "Nickel-Zinc" msgstr "Nickel-zink" #: src/utils/battery.rs:146 msgid "Lead-Acid" msgstr "Blysyra" #: src/utils/battery.rs:147 msgid "Lithium-Ion" msgstr "Litium-jon" #: src/utils/battery.rs:148 msgid "Lithium Iron Phosphate" msgstr "Litiumjärnfosfat" #: src/utils/battery.rs:149 msgid "Lithium Polymer" msgstr "Litiumpolymer" #: src/utils/battery.rs:151 msgid "Rechargeable Alkaline Managanese" msgstr "Uppladdningsbar alkalisk mangan" #: src/utils/battery.rs:256 msgid "{} Battery" msgstr "{} batteri" #: src/utils/units.rs:91 msgid "{} K" msgstr "{} K" #: src/utils/units.rs:93 msgid "{} °C" msgstr "{} °C" #: src/utils/units.rs:95 msgid "{} °F" msgstr "{} °F" #: src/utils/units.rs:113 src/utils/units.rs:127 src/utils/units.rs:147 src/utils/units.rs:161 msgid "{} B" msgstr "{} B" #: src/utils/units.rs:114 src/utils/units.rs:128 msgid "{} kB" msgstr "{} kB" #: src/utils/units.rs:115 src/utils/units.rs:129 msgid "{} MB" msgstr "{} MB" #: src/utils/units.rs:116 src/utils/units.rs:130 msgid "{} GB" msgstr "{} GB" #: src/utils/units.rs:117 src/utils/units.rs:131 msgid "{} TB" msgstr "{} TB" #: src/utils/units.rs:118 src/utils/units.rs:132 msgid "{} PB" msgstr "{} PB" #: src/utils/units.rs:119 src/utils/units.rs:133 msgid "{} EB" msgstr "{} EB" #: src/utils/units.rs:120 src/utils/units.rs:134 msgid "{} ZB" msgstr "{} ZB" #: src/utils/units.rs:121 src/utils/units.rs:135 msgid "{} YB" msgstr "{} YB" #: src/utils/units.rs:122 src/utils/units.rs:136 msgid "{} RB" msgstr "{} RB" #: src/utils/units.rs:123 src/utils/units.rs:137 msgid "{} QB" msgstr "{} QB" #: src/utils/units.rs:148 src/utils/units.rs:162 msgid "{} KiB" msgstr "{} KiB" #: src/utils/units.rs:149 src/utils/units.rs:163 msgid "{} MiB" msgstr "{} MiB" #: src/utils/units.rs:150 src/utils/units.rs:164 msgid "{} GiB" msgstr "{} GiB" #: src/utils/units.rs:151 src/utils/units.rs:165 msgid "{} TiB" msgstr "{} TiB" #: src/utils/units.rs:152 src/utils/units.rs:166 msgid "{} PiB" msgstr "{} PiB" #: src/utils/units.rs:153 src/utils/units.rs:167 msgid "{} EiB" msgstr "{} EiB" #: src/utils/units.rs:154 src/utils/units.rs:168 msgid "{} ZiB" msgstr "{} ZiB" #: src/utils/units.rs:155 src/utils/units.rs:169 msgid "{} YiB" msgstr "{} YiB" #: src/utils/units.rs:156 src/utils/units.rs:170 msgid "{} RiB" msgstr "{} RiB" #: src/utils/units.rs:157 src/utils/units.rs:171 msgid "{} QiB" msgstr "{} QiB" #: src/utils/units.rs:198 src/utils/units.rs:215 msgid "{} B/s" msgstr "{} B/s" #: src/utils/units.rs:199 msgid "{} kB/s" msgstr "{} kB/s" #: src/utils/units.rs:200 msgid "{} MB/s" msgstr "{} MB/s" #: src/utils/units.rs:201 msgid "{} GB/s" msgstr "{} GB/s" #: src/utils/units.rs:202 msgid "{} TB/s" msgstr "{} TB/s" #: src/utils/units.rs:203 msgid "{} PB/s" msgstr "{} PB/s" #: src/utils/units.rs:204 msgid "{} EB/s" msgstr "{} EB/s" #: src/utils/units.rs:205 msgid "{} ZB/s" msgstr "{} ZB/s" #: src/utils/units.rs:206 msgid "{} YB/s" msgstr "{} YB/s" #: src/utils/units.rs:207 msgid "{} RB/s" msgstr "{} RB/s" #: src/utils/units.rs:208 msgid "{} QB/s" msgstr "{} QB/s" #: src/utils/units.rs:216 msgid "{} KiB/s" msgstr "{} KiB/s" #: src/utils/units.rs:217 msgid "{} MiB/s" msgstr "{} MiB/s" #: src/utils/units.rs:218 msgid "{} GiB/s" msgstr "{} GiB/s" #: src/utils/units.rs:219 msgid "{} TiB/s" msgstr "{} TiB/s" #: src/utils/units.rs:220 msgid "{} PiB/s" msgstr "{} PiB/s" #: src/utils/units.rs:221 msgid "{} EiB/s" msgstr "{} EiB/s" #: src/utils/units.rs:222 msgid "{} ZiB/s" msgstr "{} ZiB/s" #: src/utils/units.rs:223 msgid "{} YiB/s" msgstr "{} YiB/s" #: src/utils/units.rs:224 msgid "{} RiB/s" msgstr "{} RiB/s" #: src/utils/units.rs:225 msgid "{} QiB/s" msgstr "{} QiB/s" #: src/utils/units.rs:239 src/utils/units.rs:256 msgid "{} b/s" msgstr "{} b/s" #: src/utils/units.rs:240 msgid "{} kb/s" msgstr "{} kb/s" #: src/utils/units.rs:241 msgid "{} Mb/s" msgstr "{} Mb/s" #: src/utils/units.rs:242 msgid "{} Gb/s" msgstr "{} Gb/s" #: src/utils/units.rs:243 msgid "{} Tb/s" msgstr "{} Tb/s" #: src/utils/units.rs:244 msgid "{} Pb/s" msgstr "{} Pb/s" #: src/utils/units.rs:245 msgid "{} Eb/s" msgstr "{} Eb/s" #: src/utils/units.rs:246 msgid "{} Zb/s" msgstr "{} Zb/s" #: src/utils/units.rs:247 msgid "{} Yb/s" msgstr "{} Yb/s" #: src/utils/units.rs:248 msgid "{} Rb/s" msgstr "{} Rb/s" #: src/utils/units.rs:249 msgid "{} Qb/s" msgstr "{} Qb/s" #: src/utils/units.rs:257 msgid "{} Kib/s" msgstr "{} Kib/s" #: src/utils/units.rs:258 msgid "{} Mib/s" msgstr "{} Mib/s" #: src/utils/units.rs:259 msgid "{} Gib/s" msgstr "{} Gib/s" #: src/utils/units.rs:260 msgid "{} Tib/s" msgstr "{} Tib/s" #: src/utils/units.rs:261 msgid "{} Pib/s" msgstr "{} Pib/s" #: src/utils/units.rs:262 msgid "{} Eib/s" msgstr "{} Eib/s" #: src/utils/units.rs:263 msgid "{} Zib/s" msgstr "{} Zib/s" #: src/utils/units.rs:264 msgid "{} Yib/s" msgstr "{} Yib/s" #: src/utils/units.rs:265 msgid "{} Rib/s" msgstr "{} Rib/s" #: src/utils/units.rs:266 msgid "{} Qib/s" msgstr "{} Qib/s" #: src/utils/units.rs:273 msgid "{} Hz" msgstr "{} Hz" #: src/utils/units.rs:274 msgid "{} kHz" msgstr "{} kHz" #: src/utils/units.rs:275 msgid "{} MHz" msgstr "{} MHz" #: src/utils/units.rs:276 msgid "{} GHz" msgstr "{} GHz" #: src/utils/units.rs:277 msgid "{} THz" msgstr "{} THz" #: src/utils/units.rs:278 msgid "{} PHz" msgstr "{} PHz" #: src/utils/units.rs:279 msgid "{} EHz" msgstr "{} EHz" #: src/utils/units.rs:280 msgid "{} ZHz" msgstr "{} ZHz" #: src/utils/units.rs:281 msgid "{} YHz" msgstr "{} YHz" #: src/utils/units.rs:282 msgid "{} RHz" msgstr "{} RHz" #: src/utils/units.rs:283 msgid "{} QHz" msgstr "{} QHz" #: src/utils/units.rs:290 msgid "{} W" msgstr "{} W" #: src/utils/units.rs:291 msgid "{} kW" msgstr "{} kW" #: src/utils/units.rs:292 msgid "{} MW" msgstr "{} MW" #: src/utils/units.rs:293 msgid "{} GW" msgstr "{} GW" #: src/utils/units.rs:294 msgid "{} TW" msgstr "{} TW" #: src/utils/units.rs:295 msgid "{} PW" msgstr "{} PW" #: src/utils/units.rs:296 msgid "{} EW" msgstr "{} EW" #: src/utils/units.rs:297 msgid "{} ZW" msgstr "{} ZW" #: src/utils/units.rs:298 msgid "{} YW" msgstr "{} YW" #: src/utils/units.rs:299 msgid "{} RW" msgstr "{} RW" #: src/utils/units.rs:300 msgid "{} QW" msgstr "{} QW" #: src/utils/units.rs:309 src/utils/units.rs:323 msgid "{} Wh" msgstr "{} Wh" #: src/utils/units.rs:310 src/utils/units.rs:324 msgid "{} kWh" msgstr "{} kWh" #: src/utils/units.rs:311 src/utils/units.rs:325 msgid "{} MWh" msgstr "{} MWh" #: src/utils/units.rs:312 src/utils/units.rs:326 msgid "{} GWh" msgstr "{} GWh" #: src/utils/units.rs:313 src/utils/units.rs:327 msgid "{} TWh" msgstr "{} TWh" #: src/utils/units.rs:314 src/utils/units.rs:328 msgid "{} PWh" msgstr "{} PWh" #: src/utils/units.rs:315 src/utils/units.rs:329 msgid "{} EWh" msgstr "{} EWh" #: src/utils/units.rs:316 src/utils/units.rs:330 msgid "{} ZWh" msgstr "{} ZWh" #: src/utils/units.rs:317 src/utils/units.rs:331 msgid "{} YWh" msgstr "{} YWh" #: src/utils/units.rs:318 src/utils/units.rs:332 msgid "{} RWh" msgstr "{} RWh" #: src/utils/units.rs:319 src/utils/units.rs:333 msgid "{} QWh" msgstr "{} QWh" #: src/utils/drive.rs:129 src/utils/drive.rs:208 msgid "CD/DVD/Blu-ray Drive" msgstr "CD/DVD/Blu-ray-enhet" #: src/utils/drive.rs:130 msgid "eMMC Storage" msgstr "eMMC-lagring" #: src/utils/drive.rs:131 msgid "Flash Storage" msgstr "Flash-lagring" #: src/utils/drive.rs:132 src/utils/drive.rs:209 msgid "Floppy Drive" msgstr "Diskett" #: src/utils/drive.rs:133 msgid "Hard Disk Drive" msgstr "Hårddisk" #: src/utils/drive.rs:134 msgid "Loop Device" msgstr "Loop-enhet" #: src/utils/drive.rs:135 msgid "Mapped Device" msgstr "Mappad enhet" #: src/utils/drive.rs:136 msgid "NVMe Drive" msgstr "NVMe-enhet" #: src/utils/drive.rs:138 msgid "Software Raid" msgstr "Programvaru-RAID" #: src/utils/drive.rs:139 msgid "RAM Disk" msgstr "RAM-disk" #: src/utils/drive.rs:140 msgid "Solid State Drive" msgstr "SSD-disk" #: src/utils/drive.rs:141 msgid "ZFS Volume" msgstr "ZFS-volym" #: src/utils/drive.rs:142 msgid "Compressed RAM Disk (zram)" msgstr "Komprimerad RAM-disk (zram)" #: src/utils/drive.rs:210 msgid "{} Loop Device" msgstr "{} loop-enhet" #: src/utils/drive.rs:211 msgid "{} Mapped Device" msgstr "{} mappad enhet" #: src/utils/drive.rs:212 msgid "{} RAID" msgstr "{} RAID" #: src/utils/drive.rs:213 msgid "{} RAM Disk" msgstr "{} RAM-disk" #: src/utils/drive.rs:214 msgid "{} zram Device" msgstr "{} zram-Enheter" #: src/utils/drive.rs:215 msgid "{} ZFS Volume" msgstr "{} ZFS-volym" #: src/utils/drive.rs:216 msgid "{} Drive" msgstr "{} disk" #: src/utils/network.rs:123 msgid "Bluetooth Tether" msgstr "Bluetooth-delning" #: src/utils/network.rs:124 msgid "Network Bridge" msgstr "Nätverksbrygga" #: src/utils/network.rs:125 msgid "Ethernet Connection" msgstr "Trådbunden anslutning" #: src/utils/network.rs:126 msgid "Docker Bridge" msgstr "Docker-brygga" #: src/utils/network.rs:127 msgid "InfiniBand Connection" msgstr "InfiniBand-anslutning" #: src/utils/network.rs:128 msgid "Serial Line IP Connection" msgstr "Seriell linje-IP-anslutning" #: src/utils/network.rs:129 msgid "Virtual Ethernet Device" msgstr "Virtuell Ethernet-enhet" #: src/utils/network.rs:130 msgid "VM Network Bridge" msgstr "VM-nätverksbrygga" #: src/utils/network.rs:131 msgid "VPN Tunnel" msgstr "VPN-tunnel" #: src/utils/network.rs:132 msgid "VPN Tunnel (WireGuard)" msgstr "VPN-tunnel (WireGuard)" #: src/utils/network.rs:133 msgid "Wi-Fi Connection" msgstr "Wi-Fi-anslutning" #: src/utils/network.rs:134 msgid "WWAN Connection" msgstr "WWAN-anslutning" resources-1.9.1/po/tr.po000066400000000000000000001416261510634446000151540ustar00rootroot00000000000000# Turkish translation for resources. # Copyright (C) 2023-2025 resources's COPYRIGHT HOLDER # This file is distributed under the same license as the resources package. # # Sabri Ünal , 2023-2025. # msgid "" msgstr "" "Project-Id-Version: resources\n" "Report-Msgid-Bugs-To: https://github.com/nokyan/resources/issues/\n" "POT-Creation-Date: 2025-10-07 15:38+0000\n" "PO-Revision-Date: 2025-10-07 13:35+0300\n" "Last-Translator: Sabri Ünal \n" "Language-Team: Turkish \n" "Language: tr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Poedit 3.7\n" #: data/net.nokyan.Resources.desktop.in.in:2 #: data/net.nokyan.Resources.metainfo.xml.in.in:4 #: data/resources/ui/window.ui:22 src/application.rs:272 msgid "Resources" msgstr "Kaynaklar" #. Translators: The summary should be 35 characters or less according to Flathub appstream guidelines #: data/net.nokyan.Resources.desktop.in.in:3 #: data/net.nokyan.Resources.metainfo.xml.in.in:5 msgid "Keep an eye on system resources" msgstr "Bir gözünüz hep sistem kaynaklarında olsun" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/net.nokyan.Resources.desktop.in.in:9 msgid "System;Resources;Monitor;Processes;Usage;Task;Manager;CPU;RAM;Memory;GPU;" msgstr "" "Sistem;Kaynaklar;Monitör;İzle;Süreçler;Kullanım;Görev;Yönetici;CPU;İşlemci;RAM;Bellek; " "GPU;Ekran Kartı;" #: data/net.nokyan.Resources.metainfo.xml.in.in:17 msgid "" "Resources allows you to check the utilization of your system resources and " "control your running processes and apps. It’s designed to be user-friendly " "and feel right at home on a modern desktop by using GNOME’s libadwaita." msgstr "" "Kaynaklar, sistem kaynaklarınızın kullanımını kontrol etmenizi ve çalışan " "süreçleri ve uygulamaları denetlemenizi sağlar. Kullanıcı dostu olacak " "şekilde ve GNOME libadwaita kullanılarak, sizi evinizde hissedecek şekilde " "tasarlanmıştır." #: data/net.nokyan.Resources.metainfo.xml.in.in:20 msgid "Resources supports monitoring the following components:" msgstr "Kaynaklar aşağıdaki bileşenlerin izlenmesini destekler:" #: data/net.nokyan.Resources.metainfo.xml.in.in:24 msgid "CPU" msgstr "İşlemci" #: data/net.nokyan.Resources.metainfo.xml.in.in:25 #: data/resources/ui/dialogs/app_dialog.ui:82 #: data/resources/ui/dialogs/process_dialog.ui:64 #: data/resources/ui/dialogs/settings_dialog.ui:128 #: data/resources/ui/dialogs/settings_dialog.ui:220 #: data/resources/ui/window.ui:176 data/resources/ui/window.ui:183 #: src/ui/pages/applications/mod.rs:803 src/ui/pages/memory.rs:106 #: src/ui/pages/memory.rs:192 src/ui/pages/processes/mod.rs:1080 msgid "Memory" msgstr "Bellek" #: data/net.nokyan.Resources.metainfo.xml.in.in:26 #: data/resources/ui/dialogs/app_dialog.ui:140 #: data/resources/ui/dialogs/process_dialog.ui:118 #: data/resources/ui/dialogs/settings_dialog.ui:158 #: data/resources/ui/dialogs/settings_dialog.ui:250 #: src/ui/pages/applications/mod.rs:1181 src/ui/pages/gpu.rs:119 #: src/ui/pages/processes/mod.rs:1470 src/ui/window.rs:468 msgid "GPU" msgstr "Ekran Kartı" #: data/net.nokyan.Resources.metainfo.xml.in.in:27 #: data/resources/ui/dialogs/settings_dialog.ui:324 msgid "Network Interfaces" msgstr "Ağ Arayüzleri" #: data/net.nokyan.Resources.metainfo.xml.in.in:28 msgid "Storage Devices" msgstr "Depolama Aygıtları" #: data/net.nokyan.Resources.metainfo.xml.in.in:29 msgid "Batteries" msgstr "Pil" #: data/net.nokyan.Resources.metainfo.xml.in.in:51 msgid "Apps page in light theme" msgstr "Uygulamalar sayfası açık temada" #: data/net.nokyan.Resources.metainfo.xml.in.in:55 msgid "Processes page in dark theme" msgstr "Süreçler sayfası koyu temada" #: data/net.nokyan.Resources.metainfo.xml.in.in:59 msgid "Processor page in light theme" msgstr "Süreçler sayfası açık semada" #: data/net.nokyan.Resources.metainfo.xml.in.in:63 msgid "Memory page in dark theme" msgstr "Bellekler sayfası koyu temada" #: data/net.nokyan.Resources.metainfo.xml.in.in:67 msgid "GPU page in light theme" msgstr "Ekran Kartı sayfası açık temada" #: data/net.nokyan.Resources.metainfo.xml.in.in:71 msgid "Drive page in dark theme" msgstr "Sürücü sayfası koyu temada" #: data/net.nokyan.Resources.metainfo.xml.in.in:75 msgid "Network Interface page in light theme" msgstr "Ağ Arayüzü sayfası açık temada" #: data/net.nokyan.Resources.metainfo.xml.in.in:79 msgid "Battery page in dark theme" msgstr "Pil sayfası koyu temada" #: data/net.nokyan.Resources.policy.in.in:9 msgid "Control Process" msgstr "Süreci Denetle" #: data/net.nokyan.Resources.policy.in.in:10 msgid "" "Authentication is required to control superuser’s or other users’ processes" msgstr "" "Süper kullanıcı ya da diğer kullanıcıların süreçlerini denetlemek için " "kimlik doğrulama gereklidir" #: data/resources/ui/dialogs/app_dialog.ui:7 msgid "App Information" msgstr "Uygulama Bilgileri" #: data/resources/ui/dialogs/app_dialog.ui:70 #: data/resources/ui/dialogs/process_dialog.ui:48 #: data/resources/ui/pages/battery.ui:22 data/resources/ui/pages/cpu.ui:37 #: data/resources/ui/pages/cpu.ui:50 data/resources/ui/pages/drive.ui:22 #: data/resources/ui/pages/gpu.ui:22 data/resources/ui/pages/memory.ui:31 #: data/resources/ui/pages/network.ui:22 data/resources/ui/pages/npu.ui:22 msgid "Usage" msgstr "Kullanım" #: data/resources/ui/dialogs/app_dialog.ui:73 #: data/resources/ui/dialogs/process_dialog.ui:55 #: data/resources/ui/dialogs/settings_dialog.ui:133 #: data/resources/ui/dialogs/settings_dialog.ui:225 #: data/resources/ui/window.ui:145 data/resources/ui/window.ui:152 #: src/ui/pages/applications/mod.rs:862 src/ui/pages/cpu.rs:128 #: src/ui/pages/processes/mod.rs:1139 src/ui/window.rs:290 msgid "Processor" msgstr "İşlemci" #: data/resources/ui/dialogs/app_dialog.ui:91 #: data/resources/ui/dialogs/process_dialog.ui:73 #: data/resources/ui/dialogs/settings_dialog.ui:178 #: data/resources/ui/dialogs/settings_dialog.ui:290 #: src/ui/pages/applications/mod.rs:1420 src/ui/pages/memory.rs:198 #: src/ui/pages/processes/mod.rs:1955 msgid "Swap" msgstr "Takas" #: data/resources/ui/dialogs/app_dialog.ui:100 #: data/resources/ui/dialogs/process_dialog.ui:78 #: data/resources/ui/dialogs/settings_dialog.ui:138 #: data/resources/ui/dialogs/settings_dialog.ui:230 #: src/ui/pages/applications/mod.rs:926 src/ui/pages/processes/mod.rs:1203 msgid "Drive Read" msgstr "Sürücü Okuma" #: data/resources/ui/dialogs/app_dialog.ui:109 #: data/resources/ui/dialogs/process_dialog.ui:87 #: data/resources/ui/dialogs/settings_dialog.ui:143 #: data/resources/ui/dialogs/settings_dialog.ui:235 #: src/ui/pages/applications/mod.rs:991 src/ui/pages/processes/mod.rs:1270 msgid "Drive Read Total" msgstr "Sürücü Okuma Toplamı" #: data/resources/ui/dialogs/app_dialog.ui:118 #: data/resources/ui/dialogs/process_dialog.ui:96 #: data/resources/ui/dialogs/settings_dialog.ui:148 #: data/resources/ui/dialogs/settings_dialog.ui:240 #: src/ui/pages/applications/mod.rs:1052 src/ui/pages/processes/mod.rs:1337 msgid "Drive Write" msgstr "Sürücü Yazma" #: data/resources/ui/dialogs/app_dialog.ui:127 #: data/resources/ui/dialogs/process_dialog.ui:105 #: data/resources/ui/dialogs/settings_dialog.ui:153 #: data/resources/ui/dialogs/settings_dialog.ui:245 #: src/ui/pages/applications/mod.rs:1119 src/ui/pages/processes/mod.rs:1404 msgid "Drive Write Total" msgstr "Sürücü Yazma Toplamı" #: data/resources/ui/dialogs/app_dialog.ui:149 #: data/resources/ui/dialogs/process_dialog.ui:127 #: data/resources/ui/dialogs/settings_dialog.ui:163 #: data/resources/ui/dialogs/settings_dialog.ui:255 #: src/ui/pages/applications/mod.rs:1361 src/ui/pages/processes/mod.rs:1651 msgid "Video Memory" msgstr "Video Belleği" #: data/resources/ui/dialogs/app_dialog.ui:158 #: data/resources/ui/dialogs/process_dialog.ui:136 #: data/resources/ui/dialogs/settings_dialog.ui:168 #: data/resources/ui/dialogs/settings_dialog.ui:260 #: src/ui/pages/applications/mod.rs:1240 src/ui/pages/processes/mod.rs:1529 msgid "Video Encoder" msgstr "Video Kodlayıcı" #: data/resources/ui/dialogs/app_dialog.ui:167 #: data/resources/ui/dialogs/process_dialog.ui:145 #: data/resources/ui/dialogs/settings_dialog.ui:173 #: data/resources/ui/dialogs/settings_dialog.ui:265 #: src/ui/pages/applications/mod.rs:1301 src/ui/pages/processes/mod.rs:1590 msgid "Video Decoder" msgstr "Video Kod Çözücü" #: data/resources/ui/dialogs/app_dialog.ui:174 #: data/resources/ui/dialogs/process_dialog.ui:179 #: data/resources/ui/pages/battery.ui:33 data/resources/ui/pages/cpu.ui:83 #: data/resources/ui/pages/drive.ui:54 data/resources/ui/pages/gpu.ui:74 #: data/resources/ui/pages/memory.ui:42 data/resources/ui/pages/network.ui:51 #: data/resources/ui/pages/npu.ui:68 msgid "Properties" msgstr "Özellikler" #: data/resources/ui/dialogs/app_dialog.ui:180 msgid "ID" msgstr "Kimlik" #: data/resources/ui/dialogs/app_dialog.ui:190 #: data/resources/ui/dialogs/process_dialog.ui:195 msgid "Running Since" msgstr "Çalışmaya Başlama" #: data/resources/ui/dialogs/app_dialog.ui:198 msgid "Running Processes" msgstr "Çalışan Süreçler" #: data/resources/ui/dialogs/app_dialog.ui:207 #: data/resources/ui/dialogs/process_dialog.ui:231 msgid "Containerized" msgstr "Konteynerli" #: data/resources/ui/dialogs/process_dialog.ui:7 msgid "Process Information" msgstr "Süreç Bilgileri" #: data/resources/ui/dialogs/process_dialog.ui:154 #: data/resources/ui/dialogs/settings_dialog.ui:270 #: src/ui/pages/processes/mod.rs:1711 msgid "Total CPU Time" msgstr "Toplam İşlemci Süresi" #: data/resources/ui/dialogs/process_dialog.ui:163 #: data/resources/ui/dialogs/settings_dialog.ui:275 #: src/ui/pages/processes/mod.rs:1770 msgid "User CPU Time" msgstr "Kullanıcı İşlemci Süresi" #: data/resources/ui/dialogs/process_dialog.ui:172 #: data/resources/ui/dialogs/settings_dialog.ui:280 #: src/ui/pages/processes/mod.rs:1829 msgid "System CPU Time" msgstr "Sistem İşlemci Süresi" #: data/resources/ui/dialogs/process_dialog.ui:186 #: data/resources/ui/dialogs/settings_dialog.ui:210 #: src/ui/pages/processes/mod.rs:973 msgid "Process ID" msgstr "Süreç Kimliği" #: data/resources/ui/dialogs/process_dialog.ui:204 #: data/resources/ui/dialogs/settings_dialog.ui:300 #: src/ui/pages/processes/mod.rs:2075 msgid "Commandline" msgstr "Komut Satırı" #: data/resources/ui/dialogs/process_dialog.ui:213 #: data/resources/ui/dialogs/settings_dialog.ui:215 #: src/ui/pages/processes/mod.rs:1026 msgid "User" msgstr "Kullanıcı" #: data/resources/ui/dialogs/process_dialog.ui:222 msgid "Control Group" msgstr "Denetim Grubu" #: data/resources/ui/dialogs/process_options_dialog.ui:7 #: data/resources/ui/dialogs/process_options_dialog.ui:69 msgid "Process Options" msgstr "Süreç Seçenekleri" #: data/resources/ui/dialogs/process_options_dialog.ui:29 msgid "Apply" msgstr "Uygula" #: data/resources/ui/dialogs/process_options_dialog.ui:72 msgid "Niceness" msgstr "Nicelik" #: data/resources/ui/dialogs/process_options_dialog.ui:73 msgid "" "The priority of a process is given by its niceness. A lower niceness value " "correspond to a higher priority." msgstr "" "Sürecin önceliği niceliğine göre verilir. Daha düşük nicelik değeri daha " "yüksek önceliğe karşılık gelir." #: data/resources/ui/dialogs/process_options_dialog.ui:87 #: data/resources/ui/dialogs/settings_dialog.ui:285 #: src/ui/pages/processes/mod.rs:1888 msgid "Priority" msgstr "Öncelik" #: data/resources/ui/dialogs/process_options_dialog.ui:91 msgctxt "process priority" msgid "Very High" msgstr "Çok Yüksek" #: data/resources/ui/dialogs/process_options_dialog.ui:92 msgctxt "process priority" msgid "High" msgstr "Yüksek" #: data/resources/ui/dialogs/process_options_dialog.ui:93 msgctxt "process priority" msgid "Normal" msgstr "Normal" #: data/resources/ui/dialogs/process_options_dialog.ui:94 msgctxt "process priority" msgid "Low" msgstr "Düşük" #: data/resources/ui/dialogs/process_options_dialog.ui:95 msgctxt "process priority" msgid "Very Low" msgstr "Çok Düşük" #: data/resources/ui/dialogs/process_options_dialog.ui:103 msgid "Processor Affinity" msgstr "İşlemci Yakınlığı" #: data/resources/ui/dialogs/process_options_dialog.ui:108 msgid "Toggle All" msgstr "Tümünü Genişlet" #: data/resources/ui/dialogs/process_options_dialog.ui:111 msgid "Select which processor cores the process is allowed to run on" msgstr "" "İşlemin hangi işlemci çekirdekleri üzerinde çalışmasına izin verileceğini " "seçin" #: data/resources/ui/dialogs/settings_dialog.ui:7 msgid "General" msgstr "Genel" #: data/resources/ui/dialogs/settings_dialog.ui:10 msgid "Units" msgstr "Birim" #: data/resources/ui/dialogs/settings_dialog.ui:13 msgid "Data Unit Prefix" msgstr "Veri Birimi Öneki" #: data/resources/ui/dialogs/settings_dialog.ui:17 msgid "Decimal" msgstr "Ondalık" #: data/resources/ui/dialogs/settings_dialog.ui:18 msgid "Binary" msgstr "İkili" #: data/resources/ui/dialogs/settings_dialog.ui:26 msgid "Show Network Speeds in Bits per Second" msgstr "Ağ Hızlarını Saniye Başına Bit Olarak Göster" #: data/resources/ui/dialogs/settings_dialog.ui:31 msgid "Temperature Unit" msgstr "Sıcaklık Birimi" #: data/resources/ui/dialogs/settings_dialog.ui:35 msgid "Celsius" msgstr "Santigrat" #: data/resources/ui/dialogs/settings_dialog.ui:36 msgid "Kelvin" msgstr "Kelvin" #: data/resources/ui/dialogs/settings_dialog.ui:37 msgid "Fahrenheit" msgstr "Fahrenhayt" #: data/resources/ui/dialogs/settings_dialog.ui:47 msgid "User Interface" msgstr "Kullanıcı Arayüzü" #: data/resources/ui/dialogs/settings_dialog.ui:50 msgid "Refresh Speed" msgstr "Yenileme Hızı" #: data/resources/ui/dialogs/settings_dialog.ui:51 msgid "Higher refresh speeds can lead to higher processor usage" msgstr "Yüksek yenileme hızları daha yüksek işlemci kullanımına yol açabilir" #: data/resources/ui/dialogs/settings_dialog.ui:55 msgctxt "UI refresh speed" msgid "Very Slow" msgstr "Çok Yavaş" #: data/resources/ui/dialogs/settings_dialog.ui:56 msgctxt "UI refresh speed" msgid "Slow" msgstr "Yavaş" #: data/resources/ui/dialogs/settings_dialog.ui:57 msgctxt "UI refresh speed" msgid "Normal" msgstr "Normal" #: data/resources/ui/dialogs/settings_dialog.ui:58 msgctxt "UI refresh speed" msgid "Fast" msgstr "Hızlı" #: data/resources/ui/dialogs/settings_dialog.ui:59 msgctxt "UI refresh speed" msgid "Very Fast" msgstr "Çok Hızlı" #: data/resources/ui/dialogs/settings_dialog.ui:67 msgid "Show Graph Grids" msgstr "Grafik Izgaralarını Göster" #: data/resources/ui/dialogs/settings_dialog.ui:72 msgid "Graph Data Points" msgstr "Grafik Veri Noktaları" #: data/resources/ui/dialogs/settings_dialog.ui:86 msgid "Show Usage Details in Sidebar" msgstr "Kullanım Ayrıntılarını Kenar Çubuğunda Göster" #: data/resources/ui/dialogs/settings_dialog.ui:87 msgid "If enabled, the usage along with other information will be displayed" msgstr "Etkinleştirilirse, diğer bilgilerle birlikte kullanım da görüntülenir" #: data/resources/ui/dialogs/settings_dialog.ui:92 msgid "Show Device Descriptions in Sidebar" msgstr "Cihaz Açıklamalarını Kenar Çubuğunda Göster" #: data/resources/ui/dialogs/settings_dialog.ui:93 msgid "" "If enabled, a device identifier like its name or device type will be " "displayed" msgstr "" "Etkinleştirilirse, adı ya da aygıt türü gibi bir aygıt tanımlayıcısı " "görüntülenir" #: data/resources/ui/dialogs/settings_dialog.ui:98 msgid "Sidebar Meter Type" msgstr "Kenar Çubuğu Sayaç Tipi" #: data/resources/ui/dialogs/settings_dialog.ui:102 msgid "Bar" msgstr "Çubuk" #: data/resources/ui/dialogs/settings_dialog.ui:103 msgid "Graph" msgstr "Grafik" #: data/resources/ui/dialogs/settings_dialog.ui:111 msgid "Normalize Processor Usage" msgstr "İşlemci Kullanımını Normalleştir" #: data/resources/ui/dialogs/settings_dialog.ui:112 msgid "" "If enabled, the total usage of all cores will be divided by the amount of " "cores" msgstr "" "Etkinleştirilirse, tüm çekirdeklerin toplam kullanımı çekirdek sayısına " "bölünür" #: data/resources/ui/dialogs/settings_dialog.ui:122 #: data/resources/ui/window.ui:65 data/resources/ui/window.ui:72 #: src/ui/pages/applications/mod.rs:131 msgid "Apps" msgstr "Uygulamalar" #: data/resources/ui/dialogs/settings_dialog.ui:125 #: data/resources/ui/dialogs/settings_dialog.ui:207 msgid "Information Columns" msgstr "Bilgi Sütunları" #: data/resources/ui/dialogs/settings_dialog.ui:183 #: data/resources/ui/dialogs/settings_dialog.ui:295 #: src/ui/pages/applications/mod.rs:1479 src/ui/pages/processes/mod.rs:2014 msgid "Combined Memory" msgstr "Birleşik Bellek" #: data/resources/ui/dialogs/settings_dialog.ui:193 #: data/resources/ui/window.ui:105 data/resources/ui/window.ui:112 #: src/ui/pages/processes/mod.rs:175 msgid "Processes" msgstr "Süreçler" #: data/resources/ui/dialogs/settings_dialog.ui:196 #: data/resources/ui/pages/cpu.ui:22 data/resources/ui/pages/processes.ui:56 msgid "Options" msgstr "Seçenekler" #: data/resources/ui/dialogs/settings_dialog.ui:199 msgid "Show Niceness Values" msgstr "Nitelik Değerlerini Göster" #: data/resources/ui/dialogs/settings_dialog.ui:200 msgid "" "Display priorities as niceness to allow for more fine-grained adjustments" msgstr "Daha ince ayarlara izin vermek için öncelikleri nitelik olarak göster" #: data/resources/ui/dialogs/settings_dialog.ui:310 msgid "Devices" msgstr "Aygıtlar" #: data/resources/ui/dialogs/settings_dialog.ui:313 msgid "Drives" msgstr "Sürücüler" #: data/resources/ui/dialogs/settings_dialog.ui:316 msgid "Show Virtual Drives" msgstr "Sanal Sürücüleri Göster" #: data/resources/ui/dialogs/settings_dialog.ui:317 msgid "Virtual drives are for example ZFS volumes or mapped devices" msgstr "Sanal sürücüler ZFS birimleri ya da eşlenmiş aygıtlardır" #: data/resources/ui/dialogs/settings_dialog.ui:327 msgid "Show Virtual Network Interfaces" msgstr "Sanal Ağ Arayüzlerini Göster" #: data/resources/ui/dialogs/settings_dialog.ui:328 msgid "Virtual network interfaces are for example bridges or VPN tunnels" msgstr "Sanal ağ arayüzleri örneğin köprüler ya da VPN tünelleridir" #: data/resources/ui/pages/applications.ui:6 #: data/resources/ui/pages/applications.ui:26 #: src/ui/pages/applications/mod.rs:1563 msgid "Kill App" msgstr "Uygulamayı Öldür" #: data/resources/ui/pages/applications.ui:10 #: data/resources/ui/pages/applications.ui:30 #: src/ui/pages/applications/mod.rs:1562 msgid "Halt App" msgstr "Uygulamayı Durdur" #: data/resources/ui/pages/applications.ui:14 #: data/resources/ui/pages/applications.ui:34 #: src/ui/pages/applications/mod.rs:1564 msgid "Continue App" msgstr "Uygulamayı Sürdür" #: data/resources/ui/pages/applications.ui:22 #: data/resources/ui/pages/applications.ui:98 #: src/ui/pages/applications/mod.rs:1561 msgid "End App" msgstr "Uygulamayı Sonlandır" #: data/resources/ui/pages/applications.ui:40 #: data/resources/ui/pages/processes.ui:62 msgid "Information" msgstr "Bilgi" # Düğme olduğu için #: data/resources/ui/pages/applications.ui:57 msgid "Search applications" msgstr "Uygulamaları ara" #: data/resources/ui/pages/applications.ui:87 #: data/resources/ui/pages/applications.ui:89 msgid "Show App Information" msgstr "Uygulama Bilgilerini Göster" #: data/resources/ui/pages/battery.ui:36 msgid "Battery Health" msgstr "Pil Sağlığı" #: data/resources/ui/pages/battery.ui:45 msgid "Design Capacity" msgstr "Tasarım Kapasitesi" #: data/resources/ui/pages/battery.ui:54 msgid "Charge Cycles" msgstr "Şarj Döngüsü" #: data/resources/ui/pages/battery.ui:63 msgid "Technology" msgstr "Teknoloji" #: data/resources/ui/pages/battery.ui:72 data/resources/ui/pages/gpu.ui:81 #: data/resources/ui/pages/network.ui:58 data/resources/ui/pages/npu.ui:75 msgid "Manufacturer" msgstr "Üretici" #: data/resources/ui/pages/battery.ui:81 msgid "Model Name" msgstr "Model Adı" #: data/resources/ui/pages/battery.ui:90 data/resources/ui/pages/drive.ui:66 msgid "Device" msgstr "Aygıt" #: data/resources/ui/pages/cpu.ui:26 msgid "Show Usages of Logical CPUs" msgstr "Mantıksal İşlemci Kullanımlarını Göster" #: data/resources/ui/pages/cpu.ui:75 data/resources/ui/pages/gpu.ui:66 #: data/resources/ui/pages/npu.ui:60 msgid "Sensors" msgstr "Algılayıcılar" #: data/resources/ui/pages/cpu.ui:90 msgid "Max Frequency" msgstr "Azami Frekans" #: data/resources/ui/pages/cpu.ui:99 msgid "Logical Cores" msgstr "Mantıksal Çekirdekler" #: data/resources/ui/pages/cpu.ui:108 msgid "Physical Cores" msgstr "Fiziksel Çekirdekler" #: data/resources/ui/pages/cpu.ui:117 msgid "Sockets" msgstr "Yuvalar" #: data/resources/ui/pages/cpu.ui:126 msgid "Uptime" msgstr "Çalışma Süresi" #: data/resources/ui/pages/cpu.ui:135 msgid "Virtualization" msgstr "Sanallaştırma" #: data/resources/ui/pages/cpu.ui:144 msgid "Architecture" msgstr "Mimari" #: data/resources/ui/pages/drive.ui:38 msgid "Total Read" msgstr "Toplam Okuma" #: data/resources/ui/pages/drive.ui:47 msgid "Total Written" msgstr "Toplam Yazma" #: data/resources/ui/pages/drive.ui:57 data/resources/ui/pages/memory.ui:72 msgid "Type" msgstr "Tür" #: data/resources/ui/pages/drive.ui:75 msgid "Capacity" msgstr "Kapasite" #: data/resources/ui/pages/drive.ui:84 msgid "Writable" msgstr "Yazılabilir" #: data/resources/ui/pages/drive.ui:93 msgid "Removable" msgstr "Kaldırılabilir" #. Translators: "Link" refers to something like "PCIe 4.0 ×16" #: data/resources/ui/pages/drive.ui:102 data/resources/ui/pages/gpu.ui:113 #: data/resources/ui/pages/network.ui:103 data/resources/ui/pages/npu.ui:107 msgid "Link" msgstr "Bağlantı" #: data/resources/ui/pages/gpu.ui:37 msgid "GPU Frequency" msgstr "Ekran Kartı Frekansı" #: data/resources/ui/pages/gpu.ui:50 msgid "Video Memory Frequency" msgstr "Video Bellek Frekansı" #: data/resources/ui/pages/gpu.ui:55 data/resources/ui/pages/npu.ui:49 #: src/ui/pages/battery.rs:217 msgid "Power Usage" msgstr "Güç Kullanımı" #: data/resources/ui/pages/gpu.ui:90 data/resources/ui/pages/npu.ui:84 msgid "PCI Slot" msgstr "PCI Yuvası" #: data/resources/ui/pages/gpu.ui:99 data/resources/ui/pages/network.ui:67 #: data/resources/ui/pages/npu.ui:93 msgid "Driver Used" msgstr "Kullanılan Sürücü" #: data/resources/ui/pages/gpu.ui:108 data/resources/ui/pages/npu.ui:102 msgid "Max Power Cap" msgstr "Azami Güç Kapasitesi" #: data/resources/ui/pages/memory.ui:9 msgid "You need to authenticate to see memory properties" msgstr "Bellek özelliklerini görmek için kimlik doğrulaması gerekir" #: data/resources/ui/pages/memory.ui:10 msgid "Authenticate" msgstr "Kimlik Doğrula" #: data/resources/ui/pages/memory.ui:45 msgid "Slots Used" msgstr "Kullanılan Yuvalar" #: data/resources/ui/pages/memory.ui:54 msgid "Speed" msgstr "Hız" #: data/resources/ui/pages/memory.ui:63 msgid "Form Factor" msgstr "Büyüme Katsayısı" #: data/resources/ui/pages/memory.ui:81 msgid "Type Detail" msgstr "Tür Ayrıntısı" #: data/resources/ui/pages/network.ui:35 msgid "Total Received" msgstr "Toplam Alınan" #: data/resources/ui/pages/network.ui:44 msgid "Total Sent" msgstr "Toplam Gönderilen" #: data/resources/ui/pages/network.ui:76 msgid "Interface" msgstr "Arayüz" #: data/resources/ui/pages/network.ui:85 msgid "Hardware Address" msgstr "Donanım Adresi" #: data/resources/ui/pages/network.ui:94 msgid "Network Name" msgstr "Ağ Adı" #: data/resources/ui/pages/network.ui:112 msgid "Link Speed" msgstr "Bağlantı Hızı" #: data/resources/ui/pages/npu.ui:31 msgid "NPU Frequency" msgstr "YZ Çekirdeği Frekansı" #: data/resources/ui/pages/npu.ui:44 msgid "Memory Frequency" msgstr "Bellek Frekansı" #: data/resources/ui/pages/processes.ui:6 #: data/resources/ui/pages/processes.ui:42 src/ui/pages/processes/mod.rs:2184 msgid "Kill Process" msgstr "Süreci Öldür" #: data/resources/ui/pages/processes.ui:10 #: data/resources/ui/pages/processes.ui:46 src/ui/pages/processes/mod.rs:2183 msgid "Halt Process" msgstr "Süreci Durdur" #: data/resources/ui/pages/processes.ui:14 #: data/resources/ui/pages/processes.ui:50 src/ui/pages/processes/mod.rs:2185 msgid "Continue Process" msgstr "Süreci Sürdür" #: data/resources/ui/pages/processes.ui:22 #: data/resources/ui/pages/processes.ui:74 msgid "Kill Processes" msgstr "Süreçleri Öldür" #: data/resources/ui/pages/processes.ui:26 #: data/resources/ui/pages/processes.ui:78 msgid "Halt Processes" msgstr "Süreçleri Durdur" #: data/resources/ui/pages/processes.ui:30 #: data/resources/ui/pages/processes.ui:82 msgid "Continue Processes" msgstr "Süreçleri Sürdür" #: data/resources/ui/pages/processes.ui:38 #: data/resources/ui/pages/processes.ui:157 src/ui/pages/processes/mod.rs:524 #: src/ui/pages/processes/mod.rs:2182 msgid "End Process" msgstr "Süreci Sonlandır" #: data/resources/ui/pages/processes.ui:70 src/ui/pages/processes/mod.rs:528 msgid "End Processes" msgstr "Süreçleri Sonlandır" #: data/resources/ui/pages/processes.ui:103 msgid "Search processes" msgstr "Süreç ara" #: data/resources/ui/pages/processes.ui:133 #: data/resources/ui/pages/processes.ui:135 msgid "Show Process Options" msgstr "Süreç Seçeneklerini Göster" #: data/resources/ui/pages/processes.ui:146 #: data/resources/ui/pages/processes.ui:148 msgid "Show Process Information" msgstr "Süreç Bilgilerini Göster" #: data/resources/ui/shortcuts.ui:6 msgctxt "shortcut window" msgid "General" msgstr "Genel" #: data/resources/ui/shortcuts.ui:9 msgctxt "shortcut window" msgid "Preferences" msgstr "Tercihler" #: data/resources/ui/shortcuts.ui:15 msgctxt "shortcut window" msgid "Show Shortcuts" msgstr "Kısayolları Göster" #: data/resources/ui/shortcuts.ui:21 msgctxt "shortcut window" msgid "Quit" msgstr "Çık" #: data/resources/ui/shortcuts.ui:29 msgctxt "shortcut window" msgid "Apps/Processes" msgstr "Uygulamalar/Süreçler" #: data/resources/ui/shortcuts.ui:32 msgctxt "shortcut window" msgid "Toggle Search Field" msgstr "Arama Alanını Aç/Kapat" #: data/resources/ui/shortcuts.ui:38 msgctxt "shortcut window" msgid "End App/Process" msgstr "Uygulamayı/Süreci Sonlandır" #: data/resources/ui/shortcuts.ui:44 msgctxt "shortcut window" msgid "Kill App/Process" msgstr "Uygulamayı/Süreci Öldür" #: data/resources/ui/shortcuts.ui:50 msgctxt "shortcut window" msgid "Halt App/Process" msgstr "Uygulamayı/Süreci Durdur" #: data/resources/ui/shortcuts.ui:56 msgctxt "shortcut window" msgid "Continue App/Process" msgstr "Uygulamayı/Süreci Sürdür" #: data/resources/ui/shortcuts.ui:62 msgctxt "shortcut window" msgid "Show Information for App/Process" msgstr "Uygulama/Süreç Bilgilerini Göster" #: data/resources/ui/shortcuts.ui:68 msgctxt "shortcut window" msgid "Show Process Options" msgstr "İşlem Seçeneklerini Göster" #: data/resources/ui/window.ui:6 msgid "Preferences" msgstr "Tercihler" #: data/resources/ui/window.ui:10 msgid "Keyboard Shortcuts" msgstr "Klavye Kısayolları" #: data/resources/ui/window.ui:14 msgid "About Resources" msgstr "Kaynaklar Hakkında" #: data/resources/ui/window.ui:88 data/resources/ui/window.ui:128 msgid "Search" msgstr "Ara" #: data/resources/ui/window.ui:90 data/resources/ui/window.ui:130 msgid "Toggle search field" msgstr "Arama alanını aç/kapat" #: src/application.rs:274 msgid "The Nalux Team" msgstr "Nalux Takımı" #: src/application.rs:282 msgid "Report Issues" msgstr "Hata Raporla" #. Translator credits. Replace "translator-credits" with your name/username, and optionally an email or URL. #. One name per line, please do not remove previous names. #: src/application.rs:288 msgid "translator-credits" msgstr "Sabri Ünal " #: src/application.rs:289 msgid "Icon by" msgstr "Simgeler" #: src/ui/dialogs/app_dialog.rs:155 src/ui/dialogs/process_dialog.rs:133 #: src/ui/dialogs/process_dialog.rs:137 src/ui/dialogs/process_dialog.rs:146 #: src/ui/dialogs/process_dialog.rs:148 src/ui/dialogs/process_dialog.rs:171 #: src/ui/dialogs/process_dialog.rs:178 src/ui/dialogs/process_dialog.rs:185 #: src/ui/dialogs/process_dialog.rs:192 src/ui/pages/applications/mod.rs:948 #: src/ui/pages/applications/mod.rs:1074 src/ui/pages/battery.rs:205 #: src/ui/pages/battery.rs:225 src/ui/pages/battery.rs:231 #: src/ui/pages/battery.rs:234 src/ui/pages/battery.rs:265 #: src/ui/pages/battery.rs:289 src/ui/pages/battery.rs:291 #: src/ui/pages/battery.rs:301 src/ui/pages/cpu.rs:243 src/ui/pages/cpu.rs:258 #: src/ui/pages/cpu.rs:278 src/ui/pages/cpu.rs:284 src/ui/pages/cpu.rs:290 #: src/ui/pages/cpu.rs:296 src/ui/pages/cpu.rs:300 src/ui/pages/cpu.rs:303 #: src/ui/pages/cpu.rs:341 src/ui/pages/cpu.rs:448 src/ui/pages/drive.rs:319 #: src/ui/pages/drive.rs:350 src/ui/pages/drive.rs:352 #: src/ui/pages/drive.rs:381 src/ui/pages/drive.rs:383 #: src/ui/pages/drive.rs:399 src/ui/pages/drive.rs:400 #: src/ui/pages/drive.rs:407 src/ui/pages/drive.rs:417 #: src/ui/pages/drive.rs:427 src/ui/pages/drive.rs:433 src/ui/pages/gpu.rs:245 #: src/ui/pages/gpu.rs:252 src/ui/pages/gpu.rs:297 src/ui/pages/gpu.rs:322 #: src/ui/pages/gpu.rs:325 src/ui/pages/gpu.rs:336 src/ui/pages/gpu.rs:377 #: src/ui/pages/gpu.rs:384 src/ui/pages/gpu.rs:396 src/ui/pages/gpu.rs:403 #: src/ui/pages/gpu.rs:407 src/ui/pages/gpu.rs:437 src/ui/pages/gpu.rs:443 #: src/ui/pages/memory.rs:227 src/ui/pages/memory.rs:228 #: src/ui/pages/memory.rs:232 src/ui/pages/memory.rs:233 #: src/ui/pages/memory.rs:237 src/ui/pages/memory.rs:238 #: src/ui/pages/memory.rs:266 src/ui/pages/memory.rs:327 #: src/ui/pages/network.rs:252 src/ui/pages/network.rs:259 #: src/ui/pages/network.rs:266 src/ui/pages/network.rs:272 #: src/ui/pages/network.rs:275 src/ui/pages/network.rs:285 #: src/ui/pages/network.rs:292 src/ui/pages/network.rs:302 #: src/ui/pages/network.rs:370 src/ui/pages/network.rs:373 #: src/ui/pages/network.rs:375 src/ui/pages/network.rs:404 #: src/ui/pages/network.rs:407 src/ui/pages/network.rs:409 #: src/ui/pages/network.rs:417 src/ui/pages/network.rs:424 #: src/ui/pages/network.rs:434 src/ui/pages/processes/mod.rs:1225 #: src/ui/pages/processes/mod.rs:1292 src/ui/pages/processes/mod.rs:1359 #: src/ui/pages/processes/mod.rs:1426 src/ui/pages/processes/mod.rs:1912 #: src/ui/pages/processes/mod.rs:1914 src/utils/battery.rs:152 #: src/utils/drive.rs:137 src/utils/gpu/mod.rs:279 src/utils/gpu/mod.rs:291 #: src/utils/link/mod.rs:61 src/utils/npu/mod.rs:244 src/utils/npu/mod.rs:250 msgid "N/A" msgstr "Bilinmiyor" #: src/ui/dialogs/process_options_dialog.rs:147 src/ui/pages/cpu.rs:257 #: src/ui/pages/cpu.rs:417 src/ui/pages/cpu.rs:421 msgid "CPU {}" msgstr "İşlemci {}" #: src/ui/pages/applications/application_entry.rs:190 src/ui/pages/drive.rs:414 #: src/ui/pages/drive.rs:424 src/ui/pages/processes/process_entry.rs:211 msgid "No" msgstr "Hayır" #: src/ui/pages/applications/application_entry.rs:191 #: src/ui/pages/processes/process_entry.rs:212 msgid "Yes (Flatpak)" msgstr "Evet (Flatpak)" #: src/ui/pages/applications/application_entry.rs:192 #: src/ui/pages/processes/process_entry.rs:213 msgid "Yes (Snap)" msgstr "Evet (Snap)" #: src/ui/pages/applications/mod.rs:660 msgid "Running Apps: {}" msgstr "Çalışan Uygulamalar: {}" #: src/ui/pages/applications/mod.rs:700 src/ui/pages/processes/mod.rs:863 msgid "Cancel" msgstr "İptal" #: src/ui/pages/applications/mod.rs:746 msgid "App" msgstr "Uygulama" #: src/ui/pages/applications/mod.rs:1539 src/ui/pages/processes/mod.rs:2131 msgid "End {}?" msgstr "{} sonlandırılsın mı?" #: src/ui/pages/applications/mod.rs:1540 src/ui/pages/processes/mod.rs:2132 msgid "Halt {}?" msgstr "{} durdurulsun mu?" #: src/ui/pages/applications/mod.rs:1541 src/ui/pages/processes/mod.rs:2133 msgid "Kill {}?" msgstr "{} öldürülsün mü?" #: src/ui/pages/applications/mod.rs:1542 src/ui/pages/processes/mod.rs:2134 msgid "Continue {}?" msgstr "{} sürdürülsün mü?" #: src/ui/pages/applications/mod.rs:1548 src/ui/pages/processes/mod.rs:2169 msgid "Unsaved work might be lost." msgstr "Kaydedilmemiş çalışmalar kaybolabilir." #: src/ui/pages/applications/mod.rs:1550 msgid "" "Halting an app can come with serious risks such as losing data and security " "implications. Use with caution." msgstr "" "Uygulamanın durdurulması, veri kaybı ve güvenlik etkileri gibi ciddi " "risklere neden olabilir. Dikkatli kullanın." #: src/ui/pages/applications/mod.rs:1553 msgid "" "Killing an app can come with serious risks such as losing data and security " "implications. Use with caution." msgstr "" "Uygulamayı öldürmek, veri kaybı ve güvenlik etkileri gibi ciddi risklere " "neden olabilir. Dikkatli kullanın." #: src/ui/pages/battery.rs:102 src/utils/battery.rs:258 msgid "Battery" msgstr "Pil" #: src/ui/pages/battery.rs:210 msgid "Battery Charge" msgstr "Pil Doluluk" #: src/ui/pages/battery.rs:279 src/ui/pages/cpu.rs:438 #: src/ui/pages/drive.rs:344 src/ui/pages/drive.rs:375 src/ui/pages/gpu.rs:429 #: src/ui/pages/network.rs:362 src/ui/pages/network.rs:396 msgid "Highest:" msgstr "En Yüksek:" #: src/ui/pages/cpu.rs:242 src/ui/pages/gpu.rs:212 msgid "Total Usage" msgstr "Toplam Kullanım" #: src/ui/pages/cpu.rs:271 src/ui/pages/gpu.rs:239 msgid "Temperature" msgstr "Sıcaklık" #: src/ui/pages/drive.rs:126 msgid "Drive" msgstr "Sürücü" #: src/ui/pages/drive.rs:236 msgid "Drive Activity" msgstr "Sürücü Etkinliği" #: src/ui/pages/drive.rs:243 msgid "Read Speed" msgstr "Okuma Hızı" #: src/ui/pages/drive.rs:247 msgid "Write Speed" msgstr "Yazma Hızı" #: src/ui/pages/drive.rs:412 src/ui/pages/drive.rs:422 msgid "Yes" msgstr "Evet" #. Translators: This is an abbreviation for "Read" and "Write". This is displayed in the sidebar so your #. translation should preferably be quite short or an abbreviation #: src/ui/pages/drive.rs:440 msgid "R: {} · W: {}" msgstr "O: {} · Y: {}" #: src/ui/pages/gpu.rs:220 msgid "Video Encoder/Decoder Usage" msgstr "Video Kodlayıcı/Kod Çözücü Kullanımı" #: src/ui/pages/gpu.rs:226 msgid "Video Encoder Usage" msgstr "Video Kodlayıcı Kullanımı" #: src/ui/pages/gpu.rs:231 msgid "Video Decoder Usage" msgstr "Video Kod Çözücü Kullanımı" #: src/ui/pages/gpu.rs:236 msgid "Video Memory Usage" msgstr "Video Bellek Kullanımı" #. Translators: This will be displayed in the sidebar, please try to keep your translation as short as (or even #. shorter than) 'Memory' #: src/ui/pages/gpu.rs:415 msgid "Memory: {}" msgstr "Bellek: {}" #: src/ui/pages/memory.rs:262 msgid "{} of {}" msgstr "{} / {}" #: src/ui/pages/memory.rs:265 msgid "{} MT/s" msgstr "{} MT/s" #. Translators: This will be displayed in the sidebar, so your translation for "Swap" should #. preferably be quite short or an abbreviation #: src/ui/pages/memory.rs:346 msgid "{} / {} · Swap: {} %" msgstr "{} / {} · Takas: {} %" #: src/ui/pages/network.rs:127 src/utils/network.rs:135 msgid "Network Interface" msgstr "Ağ Arayüzü" #: src/ui/pages/network.rs:241 msgid "Receiving" msgstr "Alınıyor" #: src/ui/pages/network.rs:245 msgid "Sending" msgstr "Gönderiliyor" #. Translators: This is an abbreviation for "Receive" and "Send". This is displayed in the sidebar so #. your translation should preferably be quite short or an abbreviation #: src/ui/pages/network.rs:445 msgid "R: {} · S: {}" msgstr "A: {} · G: {}" #: src/ui/pages/processes/mod.rs:814 msgid "Running Processes: {}" msgstr "Çalışan Süreçler: {}" #: src/ui/pages/processes/mod.rs:912 msgid "Process" msgstr "Süreç" #: src/ui/pages/processes/mod.rs:2141 msgid "End process?" msgid_plural "End {} processes?" msgstr[0] "{} süreç sonlandırılsın mı?" #: src/ui/pages/processes/mod.rs:2147 msgid "Halt process?" msgid_plural "Halt {} processes?" msgstr[0] "{} süreç duraklatılsın mı?" #: src/ui/pages/processes/mod.rs:2153 src/ui/pages/processes/mod.rs:2159 msgid "Kill process?" msgid_plural "Kill {} processes?" msgstr[0] "{} süreç öldürülsün mü?" #: src/ui/pages/processes/mod.rs:2171 msgid "" "Halting a process can come with serious risks such as losing data and " "security implications. Use with caution." msgstr "" "Sürecin durdurulması, veri kaybı ve güvenlik etkileri gibi ciddi risklere " "neden olabilir. Dikkatli kullanın." #: src/ui/pages/processes/mod.rs:2174 msgid "" "Killing a process can come with serious risks such as losing data and " "security implications. Use with caution." msgstr "" "Süreci öldürmek, veri kaybı ve güvenlik etkileri gibi ciddi risklere neden " "olabilir. Dikkatli kullanın." #: src/ui/window.rs:466 msgid "GPU {}" msgstr "Ekran Kartı {}" #: src/ui/window.rs:496 msgid "NPU {}" msgstr "YZ Çekirdeği {}" #: src/ui/window.rs:498 msgid "NPU" msgstr "YZ Çekirdeği" #: src/ui/window.rs:1174 msgid "Successfully adjusted {}" msgstr "{} başarıyla ayarlandı" #: src/ui/window.rs:1175 msgid "There was a problem adjusting {}" msgstr "{} ayarlanırken sorun oluştu" #: src/ui/window.rs:1257 msgid "Successfully ended {}" msgstr "{} sonlandırıldı" #: src/ui/window.rs:1258 msgid "Successfully halted {}" msgstr "{} durduruldu" #: src/ui/window.rs:1259 msgid "Successfully killed {}" msgstr "{} öldürüldü" #: src/ui/window.rs:1260 msgid "Successfully continued {}" msgstr "{} sürdürüldü" #: src/ui/window.rs:1267 msgid "Successfully ended the process" msgid_plural "Successfully ended {} processes" msgstr[0] "{} süreç sonlandırıldı" #: src/ui/window.rs:1273 msgid "Successfully halted the process" msgid_plural "Successfully halted {} processes" msgstr[0] "{} süreç durduruldu" #: src/ui/window.rs:1279 msgid "Successfully killed the process" msgid_plural "Successfully killed {} processes" msgstr[0] "{} süreç öldürüldü" #: src/ui/window.rs:1285 msgid "Successfully continued the process" msgid_plural "Successfully continued {} processes" msgstr[0] "{} süreç sürdürüldü" #: src/ui/window.rs:1296 msgid "There was a problem ending a process" msgid_plural "There were problems ending {} processes" msgstr[0] "Bir süreci sonlandırmakta sorun vardı" #: src/ui/window.rs:1302 msgid "There was a problem halting a process" msgid_plural "There were problems halting {} processes" msgstr[0] "Bir süreci durdurmakta sorun vardı" #: src/ui/window.rs:1308 msgid "There was a problem killing a process" msgid_plural "There were problems killing {} processes" msgstr[0] "Bir süreci öldürmekte sorun vardı" #: src/ui/window.rs:1314 msgid "There was a problem continuing a process" msgid_plural "There were problems continuing {} processes" msgstr[0] "Bir süreci sürdürmekte sorun vardı" #: src/ui/window.rs:1324 msgid "There was a problem ending {}" msgstr "{} sonlandırmakta sorun vardı" #: src/ui/window.rs:1325 msgid "There was a problem halting {}" msgstr "{} durdurmakta sorun vardı" #: src/ui/window.rs:1326 msgid "There was a problem killing {}" msgstr "{} sürdürmekte sorun vardı" #: src/ui/window.rs:1327 msgid "There was a problem continuing {}" msgstr "{} sürdürmekte sorun vardı" #: src/utils/app.rs:222 msgid "System Processes" msgstr "Sistem Süreçleri" #: src/utils/battery.rs:93 msgid "Charging" msgstr "Doluyor" #: src/utils/battery.rs:94 msgid "Discharging" msgstr "Boşalıyor" #: src/utils/battery.rs:95 msgid "Empty" msgstr "Boş" #: src/utils/battery.rs:96 msgid "Full" msgstr "Dolu" #: src/utils/battery.rs:97 msgid "Unknown" msgstr "Bilinmiyor" #: src/utils/battery.rs:143 msgid "Nickel-Metal Hydride" msgstr "Nikel Metal Hidrür" #: src/utils/battery.rs:144 msgid "Nickel-Cadmium" msgstr "Nikel Kadmiyum" #: src/utils/battery.rs:145 msgid "Nickel-Zinc" msgstr "Nikel Çinko" #: src/utils/battery.rs:146 msgid "Lead-Acid" msgstr "Kurşun Asit" #: src/utils/battery.rs:147 msgid "Lithium-Ion" msgstr "Lityum İyon" #: src/utils/battery.rs:148 msgid "Lithium Iron Phosphate" msgstr "Lityum Demir Fosfat" #: src/utils/battery.rs:149 msgid "Lithium Polymer" msgstr "Lityum Polimer" #: src/utils/battery.rs:151 msgid "Rechargeable Alkaline Managanese" msgstr "Şarj Edilebilir Alkalin Manganez" #: src/utils/battery.rs:256 msgid "{} Battery" msgstr "{} Pil" #: src/utils/units.rs:91 msgid "{} K" msgstr "{} K" #: src/utils/units.rs:93 msgid "{} °C" msgstr "{} °C" #: src/utils/units.rs:95 msgid "{} °F" msgstr "{} °F" #: src/utils/units.rs:113 src/utils/units.rs:127 src/utils/units.rs:147 #: src/utils/units.rs:161 msgid "{} B" msgstr "{} B" #: src/utils/units.rs:114 src/utils/units.rs:128 msgid "{} kB" msgstr "{} kB" #: src/utils/units.rs:115 src/utils/units.rs:129 msgid "{} MB" msgstr "{} MB" #: src/utils/units.rs:116 src/utils/units.rs:130 msgid "{} GB" msgstr "{} GB" #: src/utils/units.rs:117 src/utils/units.rs:131 msgid "{} TB" msgstr "{} TB" #: src/utils/units.rs:118 src/utils/units.rs:132 msgid "{} PB" msgstr "{} PB" #: src/utils/units.rs:119 src/utils/units.rs:133 msgid "{} EB" msgstr "{} EB" #: src/utils/units.rs:120 src/utils/units.rs:134 msgid "{} ZB" msgstr "{} ZB" #: src/utils/units.rs:121 src/utils/units.rs:135 msgid "{} YB" msgstr "{} YB" #: src/utils/units.rs:122 src/utils/units.rs:136 msgid "{} RB" msgstr "{} RB" #: src/utils/units.rs:123 src/utils/units.rs:137 msgid "{} QB" msgstr "{} QB" #: src/utils/units.rs:148 src/utils/units.rs:162 msgid "{} KiB" msgstr "{} KiB" #: src/utils/units.rs:149 src/utils/units.rs:163 msgid "{} MiB" msgstr "{} MiB" #: src/utils/units.rs:150 src/utils/units.rs:164 msgid "{} GiB" msgstr "{} GiB" #: src/utils/units.rs:151 src/utils/units.rs:165 msgid "{} TiB" msgstr "{} TiB" #: src/utils/units.rs:152 src/utils/units.rs:166 msgid "{} PiB" msgstr "{} PiB" #: src/utils/units.rs:153 src/utils/units.rs:167 msgid "{} EiB" msgstr "{} EiB" #: src/utils/units.rs:154 src/utils/units.rs:168 msgid "{} ZiB" msgstr "{} ZiB" #: src/utils/units.rs:155 src/utils/units.rs:169 msgid "{} YiB" msgstr "{} YiB" #: src/utils/units.rs:156 src/utils/units.rs:170 msgid "{} RiB" msgstr "{} RiB" #: src/utils/units.rs:157 src/utils/units.rs:171 msgid "{} QiB" msgstr "{} QiB" #: src/utils/units.rs:198 src/utils/units.rs:215 msgid "{} B/s" msgstr "{} B/s" #: src/utils/units.rs:199 msgid "{} kB/s" msgstr "{} kB/s" #: src/utils/units.rs:200 msgid "{} MB/s" msgstr "{} MB/s" #: src/utils/units.rs:201 msgid "{} GB/s" msgstr "{} GB/s" #: src/utils/units.rs:202 msgid "{} TB/s" msgstr "{} TB/s" #: src/utils/units.rs:203 msgid "{} PB/s" msgstr "{} PB/s" #: src/utils/units.rs:204 msgid "{} EB/s" msgstr "{} EB/s" #: src/utils/units.rs:205 msgid "{} ZB/s" msgstr "{} ZB/s" #: src/utils/units.rs:206 msgid "{} YB/s" msgstr "{} YB/s" #: src/utils/units.rs:207 msgid "{} RB/s" msgstr "{} RB/s" #: src/utils/units.rs:208 msgid "{} QB/s" msgstr "{} QB/s" #: src/utils/units.rs:216 msgid "{} KiB/s" msgstr "{} KiB/s" #: src/utils/units.rs:217 msgid "{} MiB/s" msgstr "{} MiB/s" #: src/utils/units.rs:218 msgid "{} GiB/s" msgstr "{} GiB/s" #: src/utils/units.rs:219 msgid "{} TiB/s" msgstr "{} TiB/s" #: src/utils/units.rs:220 msgid "{} PiB/s" msgstr "{} PiB/s" #: src/utils/units.rs:221 msgid "{} EiB/s" msgstr "{} EiB/s" #: src/utils/units.rs:222 msgid "{} ZiB/s" msgstr "{} ZiB/s" #: src/utils/units.rs:223 msgid "{} YiB/s" msgstr "{} YiB/s" #: src/utils/units.rs:224 msgid "{} RiB/s" msgstr "{} RiB/s" #: src/utils/units.rs:225 msgid "{} QiB/s" msgstr "{} QiB/s" #: src/utils/units.rs:239 src/utils/units.rs:256 msgid "{} b/s" msgstr "{} b/s" #: src/utils/units.rs:240 msgid "{} kb/s" msgstr "{} kb/s" #: src/utils/units.rs:241 msgid "{} Mb/s" msgstr "{} Mb/s" #: src/utils/units.rs:242 msgid "{} Gb/s" msgstr "{} Gb/s" #: src/utils/units.rs:243 msgid "{} Tb/s" msgstr "{} Tb/s" #: src/utils/units.rs:244 msgid "{} Pb/s" msgstr "{} Pb/s" #: src/utils/units.rs:245 msgid "{} Eb/s" msgstr "{} Eb/s" #: src/utils/units.rs:246 msgid "{} Zb/s" msgstr "{} Zb/s" #: src/utils/units.rs:247 msgid "{} Yb/s" msgstr "{} Yb/s" #: src/utils/units.rs:248 msgid "{} Rb/s" msgstr "{} Rb/s" #: src/utils/units.rs:249 msgid "{} Qb/s" msgstr "{} Qb/s" #: src/utils/units.rs:257 msgid "{} Kib/s" msgstr "{} Kib/s" #: src/utils/units.rs:258 msgid "{} Mib/s" msgstr "{} Mib/s" #: src/utils/units.rs:259 msgid "{} Gib/s" msgstr "{} Gib/s" #: src/utils/units.rs:260 msgid "{} Tib/s" msgstr "{} Tib/s" #: src/utils/units.rs:261 msgid "{} Pib/s" msgstr "{} Pib/s" #: src/utils/units.rs:262 msgid "{} Eib/s" msgstr "{} Eib/s" #: src/utils/units.rs:263 msgid "{} Zib/s" msgstr "{} Zib/s" #: src/utils/units.rs:264 msgid "{} Yib/s" msgstr "{} Yib/s" #: src/utils/units.rs:265 msgid "{} Rib/s" msgstr "{} Rib/s" #: src/utils/units.rs:266 msgid "{} Qib/s" msgstr "{} Qib/s" #: src/utils/units.rs:273 msgid "{} Hz" msgstr "{} Hz" #: src/utils/units.rs:274 msgid "{} kHz" msgstr "{} kHz" #: src/utils/units.rs:275 msgid "{} MHz" msgstr "{} MHz" #: src/utils/units.rs:276 msgid "{} GHz" msgstr "{} GHz" #: src/utils/units.rs:277 msgid "{} THz" msgstr "{} THz" #: src/utils/units.rs:278 msgid "{} PHz" msgstr "{} PHz" #: src/utils/units.rs:279 msgid "{} EHz" msgstr "{} EHz" #: src/utils/units.rs:280 msgid "{} ZHz" msgstr "{} ZHz" #: src/utils/units.rs:281 msgid "{} YHz" msgstr "{} YHz" #: src/utils/units.rs:282 msgid "{} RHz" msgstr "{} RHz" #: src/utils/units.rs:283 msgid "{} QHz" msgstr "{} QHz" #: src/utils/units.rs:290 msgid "{} W" msgstr "{} W" #: src/utils/units.rs:291 msgid "{} kW" msgstr "{} kW" #: src/utils/units.rs:292 msgid "{} MW" msgstr "{} MW" #: src/utils/units.rs:293 msgid "{} GW" msgstr "{} GW" #: src/utils/units.rs:294 msgid "{} TW" msgstr "{} TW" #: src/utils/units.rs:295 msgid "{} PW" msgstr "{} PW" #: src/utils/units.rs:296 msgid "{} EW" msgstr "{} EW" #: src/utils/units.rs:297 msgid "{} ZW" msgstr "{} ZW" #: src/utils/units.rs:298 msgid "{} YW" msgstr "{} YW" #: src/utils/units.rs:299 msgid "{} RW" msgstr "{} RW" #: src/utils/units.rs:300 msgid "{} QW" msgstr "{} QW" #: src/utils/units.rs:309 src/utils/units.rs:323 msgid "{} Wh" msgstr "{} Wh" #: src/utils/units.rs:310 src/utils/units.rs:324 msgid "{} kWh" msgstr "{} kWh" #: src/utils/units.rs:311 src/utils/units.rs:325 msgid "{} MWh" msgstr "{} MWh" #: src/utils/units.rs:312 src/utils/units.rs:326 msgid "{} GWh" msgstr "{} GWh" #: src/utils/units.rs:313 src/utils/units.rs:327 msgid "{} TWh" msgstr "{} TWh" #: src/utils/units.rs:314 src/utils/units.rs:328 msgid "{} PWh" msgstr "{} PWh" #: src/utils/units.rs:315 src/utils/units.rs:329 msgid "{} EWh" msgstr "{} EWh" #: src/utils/units.rs:316 src/utils/units.rs:330 msgid "{} ZWh" msgstr "{} ZWh" #: src/utils/units.rs:317 src/utils/units.rs:331 msgid "{} YWh" msgstr "{} YWh" #: src/utils/units.rs:318 src/utils/units.rs:332 msgid "{} RWh" msgstr "{} RWh" #: src/utils/units.rs:319 src/utils/units.rs:333 msgid "{} QWh" msgstr "{} QWh" #: src/utils/drive.rs:129 src/utils/drive.rs:208 msgid "CD/DVD/Blu-ray Drive" msgstr "CD/DVD/Blu-ray Sürücü" #: src/utils/drive.rs:130 msgid "eMMC Storage" msgstr "eMMC Depolama" #: src/utils/drive.rs:131 msgid "Flash Storage" msgstr "Flash Depolama" #: src/utils/drive.rs:132 src/utils/drive.rs:209 msgid "Floppy Drive" msgstr "Disket Sürücü" #: src/utils/drive.rs:133 msgid "Hard Disk Drive" msgstr "Sabit Disk Sürücüsü" #: src/utils/drive.rs:134 msgid "Loop Device" msgstr "Döngü Aygıtı" #: src/utils/drive.rs:135 msgid "Mapped Device" msgstr "Eşlenen Aygıt" #: src/utils/drive.rs:136 msgid "NVMe Drive" msgstr "NVMe Sürücü" #: src/utils/drive.rs:138 msgid "Software Raid" msgstr "Yazılım Raid" #: src/utils/drive.rs:139 msgid "RAM Disk" msgstr "RAM Disk" #: src/utils/drive.rs:140 msgid "Solid State Drive" msgstr "Katı Hal Sürücüsü" #: src/utils/drive.rs:141 msgid "ZFS Volume" msgstr "ZFS Birimi" #: src/utils/drive.rs:142 msgid "Compressed RAM Disk (zram)" msgstr "Sıkıştırılmış RAM Disk (zram)" #: src/utils/drive.rs:210 msgid "{} Loop Device" msgstr "{} Döngü Aygıtı" #: src/utils/drive.rs:211 msgid "{} Mapped Device" msgstr "{} Eşleşen Aygıt" #: src/utils/drive.rs:212 msgid "{} RAID" msgstr "{} RAID" #: src/utils/drive.rs:213 msgid "{} RAM Disk" msgstr "{} RAM Disk" #: src/utils/drive.rs:214 msgid "{} zram Device" msgstr "{} zram Aygıtı" #: src/utils/drive.rs:215 msgid "{} ZFS Volume" msgstr "{} ZFS Birimi" #: src/utils/drive.rs:216 msgid "{} Drive" msgstr "{} Sürücü" #: src/utils/network.rs:123 msgid "Bluetooth Tether" msgstr "Bluetooth Bağlantısı" #: src/utils/network.rs:124 msgid "Network Bridge" msgstr "Ağ Köprüsü" #: src/utils/network.rs:125 msgid "Ethernet Connection" msgstr "Kablolu Bağlantı" #: src/utils/network.rs:126 msgid "Docker Bridge" msgstr "Docker Köprüsü" #: src/utils/network.rs:127 msgid "InfiniBand Connection" msgstr "InfiniBand Bağlantısı" #: src/utils/network.rs:128 msgid "Serial Line IP Connection" msgstr "Seri Hat IP Bağlantısı" #: src/utils/network.rs:129 msgid "Virtual Ethernet Device" msgstr "Sanal Kablolu Ağ Aygıtı" #: src/utils/network.rs:130 msgid "VM Network Bridge" msgstr "VM Ağ Köprüsü" #: src/utils/network.rs:131 msgid "VPN Tunnel" msgstr "VPN Tüneli" #: src/utils/network.rs:132 msgid "VPN Tunnel (WireGuard)" msgstr "VPN Tüneli (WireGuard)" #: src/utils/network.rs:133 msgid "Wi-Fi Connection" msgstr "Kablosuz Bağlantı" #: src/utils/network.rs:134 msgid "WWAN Connection" msgstr "WWAN Bağlantısı" resources-1.9.1/po/uk.po000066400000000000000000001774611510634446000151540ustar00rootroot00000000000000# Ukrainian translation for resources. # # volkov , 2023-2024. # Yuri Chornoivan , 2025. msgid "" msgstr "" "Project-Id-Version: resources\n" "Report-Msgid-Bugs-To: https://github.com/nokyan/resources/issues/\n" "POT-Creation-Date: 2025-10-04 03:35+0000\n" "PO-Revision-Date: 2025-10-04 17:54+0300\n" "Last-Translator: Yuri Chornoivan \n" "Language-Team: Ukrainian \n" "Language: uk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n" "X-Generator: Lokalize 23.04.3\n" #: data/net.nokyan.Resources.desktop.in.in:2 #: data/net.nokyan.Resources.metainfo.xml.in.in:4 #: data/resources/ui/window.ui:22 src/application.rs:272 msgid "Resources" msgstr "Ресурси" #. Translators: The summary should be 35 characters or less according to Flathub appstream guidelines #: data/net.nokyan.Resources.desktop.in.in:3 #: data/net.nokyan.Resources.metainfo.xml.in.in:5 msgid "Keep an eye on system resources" msgstr "Слідкуйте за ресурсами системи" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/net.nokyan.Resources.desktop.in.in:9 msgid "" "System;Resources;Monitor;Processes;Usage;Task;Manager;CPU;RAM;Memory;GPU;" msgstr "" "System;Resources;Monitor;Processes;Usage;Task;Manager;CPU;RAM;Memory;GPU;сист" "ема;ресурси;монітор;процеси;менеджер;задачі;процесор;відеокарта;пам'ять;опера" "тива;завис;лаг;" #: data/net.nokyan.Resources.metainfo.xml.in.in:17 msgid "" "Resources allows you to check the utilization of your system resources and " "control your running processes and apps. It’s designed to be user-friendly " "and feel right at home on a modern desktop by using GNOME’s libadwaita." msgstr "" "'Ресурси' дозволяє вам перевірити утилізацію ресурсів вашої системи і " "контролювати запущені процеси та додатки. Цей додаток створено бути зручним " "для користувача і гарно виглядати на сучасних робочих столах, дякуючи " "бібліотеці libadwaita від GNOME." #: data/net.nokyan.Resources.metainfo.xml.in.in:20 msgid "Resources supports monitoring the following components:" msgstr "'Ресурси' підтримує моніторинг наступних компонентів:" #: data/net.nokyan.Resources.metainfo.xml.in.in:24 msgid "CPU" msgstr "Процесору" #: data/net.nokyan.Resources.metainfo.xml.in.in:25 #: data/resources/ui/dialogs/app_dialog.ui:82 #: data/resources/ui/dialogs/process_dialog.ui:64 #: data/resources/ui/dialogs/settings_dialog.ui:128 #: data/resources/ui/dialogs/settings_dialog.ui:220 #: data/resources/ui/window.ui:176 data/resources/ui/window.ui:183 #: src/ui/pages/applications/mod.rs:803 src/ui/pages/memory.rs:106 #: src/ui/pages/memory.rs:192 src/ui/pages/processes/mod.rs:1079 msgid "Memory" msgstr "Оперативна пам'ять" #: data/net.nokyan.Resources.metainfo.xml.in.in:26 #: data/resources/ui/dialogs/app_dialog.ui:140 #: data/resources/ui/dialogs/process_dialog.ui:118 #: data/resources/ui/dialogs/settings_dialog.ui:158 #: data/resources/ui/dialogs/settings_dialog.ui:250 #: src/ui/pages/applications/mod.rs:1181 src/ui/pages/gpu.rs:119 #: src/ui/pages/processes/mod.rs:1469 src/ui/window.rs:468 msgid "GPU" msgstr "Відеокарта" #: data/net.nokyan.Resources.metainfo.xml.in.in:27 #: data/resources/ui/dialogs/settings_dialog.ui:319 msgid "Network Interfaces" msgstr "Мережевих інтерфейсів" #: data/net.nokyan.Resources.metainfo.xml.in.in:28 msgid "Storage Devices" msgstr "Накопичувачів даних" #: data/net.nokyan.Resources.metainfo.xml.in.in:29 msgid "Batteries" msgstr "Акумулятори" #: data/net.nokyan.Resources.metainfo.xml.in.in:51 msgid "Apps page in light theme" msgstr "Сторінка додатків у світлому стилі" #: data/net.nokyan.Resources.metainfo.xml.in.in:55 msgid "Processes page in dark theme" msgstr "Сторінка процесів у темному стилі" #: data/net.nokyan.Resources.metainfo.xml.in.in:59 msgid "Processor page in light theme" msgstr "Сторінка процесору у світлому стилі" #: data/net.nokyan.Resources.metainfo.xml.in.in:63 msgid "Memory page in dark theme" msgstr "Сторінка оперативної пам'яті у темному стилі" #: data/net.nokyan.Resources.metainfo.xml.in.in:67 msgid "GPU page in light theme" msgstr "Сторінка відеокарти у світлому стилі" #: data/net.nokyan.Resources.metainfo.xml.in.in:71 msgid "Drive page in dark theme" msgstr "Сторінка диску у темному стилі" #: data/net.nokyan.Resources.metainfo.xml.in.in:75 msgid "Network Interface page in light theme" msgstr "Сторінка мережевого інтерфейсу у світлому стилі" #: data/net.nokyan.Resources.metainfo.xml.in.in:79 msgid "Battery page in dark theme" msgstr "Сторінка акумулятора у темному стилі" #: data/net.nokyan.Resources.policy.in.in:9 msgid "Control Process" msgstr "Керування процесом" #: data/net.nokyan.Resources.policy.in.in:10 msgid "" "Authentication is required to control superuser’s or other users’ processes" msgstr "" "Для керування процесами суперкористувача та інших користувачів слід пройти " "розпізнавання" #: data/resources/ui/dialogs/app_dialog.ui:7 msgid "App Information" msgstr "Інформація про додаток" #: data/resources/ui/dialogs/app_dialog.ui:70 #: data/resources/ui/dialogs/process_dialog.ui:48 #: data/resources/ui/pages/battery.ui:22 data/resources/ui/pages/cpu.ui:37 #: data/resources/ui/pages/cpu.ui:50 data/resources/ui/pages/drive.ui:22 #: data/resources/ui/pages/gpu.ui:22 data/resources/ui/pages/memory.ui:31 #: data/resources/ui/pages/network.ui:22 data/resources/ui/pages/npu.ui:22 msgid "Usage" msgstr "Використання" #: data/resources/ui/dialogs/app_dialog.ui:73 #: data/resources/ui/dialogs/process_dialog.ui:55 #: data/resources/ui/dialogs/settings_dialog.ui:133 #: data/resources/ui/dialogs/settings_dialog.ui:225 #: data/resources/ui/window.ui:145 data/resources/ui/window.ui:152 #: src/ui/pages/applications/mod.rs:862 src/ui/pages/cpu.rs:128 #: src/ui/pages/processes/mod.rs:1138 src/ui/window.rs:290 msgid "Processor" msgstr "Процесор" #: data/resources/ui/dialogs/app_dialog.ui:91 #: data/resources/ui/dialogs/process_dialog.ui:73 #: data/resources/ui/dialogs/settings_dialog.ui:178 #: data/resources/ui/dialogs/settings_dialog.ui:290 #: src/ui/pages/applications/mod.rs:1420 src/ui/pages/memory.rs:198 #: src/ui/pages/processes/mod.rs:1954 msgid "Swap" msgstr "Swap" #: data/resources/ui/dialogs/app_dialog.ui:100 #: data/resources/ui/dialogs/process_dialog.ui:78 #: data/resources/ui/dialogs/settings_dialog.ui:138 #: data/resources/ui/dialogs/settings_dialog.ui:230 #: src/ui/pages/applications/mod.rs:926 src/ui/pages/processes/mod.rs:1202 msgid "Drive Read" msgstr "Читання з диска" #: data/resources/ui/dialogs/app_dialog.ui:109 #: data/resources/ui/dialogs/process_dialog.ui:87 #: data/resources/ui/dialogs/settings_dialog.ui:143 #: data/resources/ui/dialogs/settings_dialog.ui:235 #: src/ui/pages/applications/mod.rs:991 src/ui/pages/processes/mod.rs:1269 msgid "Drive Read Total" msgstr "Читання з диска (загалом)" #: data/resources/ui/dialogs/app_dialog.ui:118 #: data/resources/ui/dialogs/process_dialog.ui:96 #: data/resources/ui/dialogs/settings_dialog.ui:148 #: data/resources/ui/dialogs/settings_dialog.ui:240 #: src/ui/pages/applications/mod.rs:1052 src/ui/pages/processes/mod.rs:1336 msgid "Drive Write" msgstr "Запис на диск" #: data/resources/ui/dialogs/app_dialog.ui:127 #: data/resources/ui/dialogs/process_dialog.ui:105 #: data/resources/ui/dialogs/settings_dialog.ui:153 #: data/resources/ui/dialogs/settings_dialog.ui:245 #: src/ui/pages/applications/mod.rs:1119 src/ui/pages/processes/mod.rs:1403 msgid "Drive Write Total" msgstr "Запис на диск (загалом)" #: data/resources/ui/dialogs/app_dialog.ui:149 #: data/resources/ui/dialogs/process_dialog.ui:127 #: data/resources/ui/dialogs/settings_dialog.ui:163 #: data/resources/ui/dialogs/settings_dialog.ui:255 #: src/ui/pages/applications/mod.rs:1361 src/ui/pages/processes/mod.rs:1650 msgid "Video Memory" msgstr "Відеопам'ять" #: data/resources/ui/dialogs/app_dialog.ui:158 #: data/resources/ui/dialogs/process_dialog.ui:136 #: data/resources/ui/dialogs/settings_dialog.ui:168 #: data/resources/ui/dialogs/settings_dialog.ui:260 #: src/ui/pages/applications/mod.rs:1240 src/ui/pages/processes/mod.rs:1528 msgid "Video Encoder" msgstr "Відео кодувальник" #: data/resources/ui/dialogs/app_dialog.ui:167 #: data/resources/ui/dialogs/process_dialog.ui:145 #: data/resources/ui/dialogs/settings_dialog.ui:173 #: data/resources/ui/dialogs/settings_dialog.ui:265 #: src/ui/pages/applications/mod.rs:1301 src/ui/pages/processes/mod.rs:1589 msgid "Video Decoder" msgstr "Відео декодувальник" #: data/resources/ui/dialogs/app_dialog.ui:174 #: data/resources/ui/dialogs/process_dialog.ui:179 #: data/resources/ui/pages/battery.ui:33 data/resources/ui/pages/cpu.ui:83 #: data/resources/ui/pages/drive.ui:54 data/resources/ui/pages/gpu.ui:74 #: data/resources/ui/pages/memory.ui:42 data/resources/ui/pages/network.ui:51 #: data/resources/ui/pages/npu.ui:68 msgid "Properties" msgstr "Властивості" #: data/resources/ui/dialogs/app_dialog.ui:180 msgid "ID" msgstr "Ідентифікатор" #: data/resources/ui/dialogs/app_dialog.ui:190 #: data/resources/ui/dialogs/process_dialog.ui:195 msgid "Running Since" msgstr "Запущено з" #: data/resources/ui/dialogs/app_dialog.ui:198 msgid "Running Processes" msgstr "Запущених процесів" #: data/resources/ui/dialogs/app_dialog.ui:207 #: data/resources/ui/dialogs/process_dialog.ui:231 msgid "Containerized" msgstr "Контейнірізовано" #: data/resources/ui/dialogs/process_dialog.ui:7 msgid "Process Information" msgstr "Інформація про процес" #: data/resources/ui/dialogs/process_dialog.ui:154 #: data/resources/ui/dialogs/settings_dialog.ui:270 #: src/ui/pages/processes/mod.rs:1710 msgid "Total CPU Time" msgstr "Загальне використання процесору" #: data/resources/ui/dialogs/process_dialog.ui:163 #: data/resources/ui/dialogs/settings_dialog.ui:275 #: src/ui/pages/processes/mod.rs:1769 msgid "User CPU Time" msgstr "Використання процесору користувачем" #: data/resources/ui/dialogs/process_dialog.ui:172 #: data/resources/ui/dialogs/settings_dialog.ui:280 #: src/ui/pages/processes/mod.rs:1828 msgid "System CPU Time" msgstr "Системне використання процессору" #: data/resources/ui/dialogs/process_dialog.ui:186 #: data/resources/ui/dialogs/settings_dialog.ui:210 #: src/ui/pages/processes/mod.rs:972 msgid "Process ID" msgstr "Ідентифікатор процесу" #: data/resources/ui/dialogs/process_dialog.ui:204 msgid "Commandline" msgstr "Аргументи командного рядку" #: data/resources/ui/dialogs/process_dialog.ui:213 #: data/resources/ui/dialogs/settings_dialog.ui:215 #: src/ui/pages/processes/mod.rs:1025 msgid "User" msgstr "Користувач" #: data/resources/ui/dialogs/process_dialog.ui:222 msgid "Control Group" msgstr "Група контролю" #: data/resources/ui/dialogs/process_options_dialog.ui:7 #: data/resources/ui/dialogs/process_options_dialog.ui:69 msgid "Process Options" msgstr "Налаштування процесу" #: data/resources/ui/dialogs/process_options_dialog.ui:29 msgid "Apply" msgstr "Прийняти" #: data/resources/ui/dialogs/process_options_dialog.ui:72 msgid "Niceness" msgstr "Пріоритет (niceness)" #: data/resources/ui/dialogs/process_options_dialog.ui:73 msgid "" "The priority of a process is given by its niceness. A lower niceness value " "correspond to a higher priority." msgstr "" "Пріоритет процесору у niceness значенні. Чим нижче значення - тим більший " "пріоритет." #: data/resources/ui/dialogs/process_options_dialog.ui:87 #: data/resources/ui/dialogs/settings_dialog.ui:285 #: src/ui/pages/processes/mod.rs:1887 msgid "Priority" msgstr "Пріорітет" #: data/resources/ui/dialogs/process_options_dialog.ui:91 msgctxt "process priority" msgid "Very High" msgstr "Дуже високий" #: data/resources/ui/dialogs/process_options_dialog.ui:92 msgctxt "process priority" msgid "High" msgstr "Високий" #: data/resources/ui/dialogs/process_options_dialog.ui:93 msgctxt "process priority" msgid "Normal" msgstr "Нормальний" #: data/resources/ui/dialogs/process_options_dialog.ui:94 msgctxt "process priority" msgid "Low" msgstr "Низький" #: data/resources/ui/dialogs/process_options_dialog.ui:95 msgctxt "process priority" msgid "Very Low" msgstr "Дуже низький" # Я так розумію, що мова йде про ось це: https://uk.wikipedia.org/wiki/%D0%A1%D0%BF%D0%BE%D1%80%D1%96%D0%B4%D0%BD%D0%B5%D0%BD%D1%96%D1%81%D1%82%D1%8C_%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D1%81%D0%BE%D1%80%D0%B0 але я ні на що не претендую. #: data/resources/ui/dialogs/process_options_dialog.ui:103 msgid "Processor Affinity" msgstr "Спорідненість процесора" #: data/resources/ui/dialogs/process_options_dialog.ui:108 msgid "Toggle All" msgstr "Перемикнути всі" #: data/resources/ui/dialogs/process_options_dialog.ui:111 msgid "Select which processor cores the process is allowed to run on" msgstr "Оберіть на яких ядрах процесору дозволено працювати процесу" #: data/resources/ui/dialogs/settings_dialog.ui:7 msgid "General" msgstr "Загальні" #: data/resources/ui/dialogs/settings_dialog.ui:10 msgid "Units" msgstr "Одиниці" #: data/resources/ui/dialogs/settings_dialog.ui:13 msgid "Data Unit Prefix" msgstr "Префікс одиниці даних" #: data/resources/ui/dialogs/settings_dialog.ui:17 msgid "Decimal" msgstr "Десяткова" #: data/resources/ui/dialogs/settings_dialog.ui:18 msgid "Binary" msgstr "Двійкова" #: data/resources/ui/dialogs/settings_dialog.ui:26 msgid "Show Network Speeds in Bits per Second" msgstr "Показувати швидкість мережі у бітах в секунду" #: data/resources/ui/dialogs/settings_dialog.ui:31 msgid "Temperature Unit" msgstr "Одиниця вимірювання температури" #: data/resources/ui/dialogs/settings_dialog.ui:35 msgid "Celsius" msgstr "Цельсій" #: data/resources/ui/dialogs/settings_dialog.ui:36 msgid "Kelvin" msgstr "Кельвін" #: data/resources/ui/dialogs/settings_dialog.ui:37 msgid "Fahrenheit" msgstr "Фаренгейт" #: data/resources/ui/dialogs/settings_dialog.ui:47 msgid "User Interface" msgstr "Інтерфейс користувача" #: data/resources/ui/dialogs/settings_dialog.ui:50 msgid "Refresh Speed" msgstr "Швидкість оновлення" #: data/resources/ui/dialogs/settings_dialog.ui:51 msgid "Higher refresh speeds can lead to higher processor usage" msgstr "" "Більша швидкість оновлення може призвести до збільшення навантаження " "процессору" #: data/resources/ui/dialogs/settings_dialog.ui:55 msgctxt "UI refresh speed" msgid "Very Slow" msgstr "Дуже повільна" #: data/resources/ui/dialogs/settings_dialog.ui:56 msgctxt "UI refresh speed" msgid "Slow" msgstr "Повільна" #: data/resources/ui/dialogs/settings_dialog.ui:57 msgctxt "UI refresh speed" msgid "Normal" msgstr "Нормальна" #: data/resources/ui/dialogs/settings_dialog.ui:58 msgctxt "UI refresh speed" msgid "Fast" msgstr "Швидка" #: data/resources/ui/dialogs/settings_dialog.ui:59 msgctxt "UI refresh speed" msgid "Very Fast" msgstr "Дуже швидка" #: data/resources/ui/dialogs/settings_dialog.ui:67 msgid "Show Graph Grids" msgstr "Показати ґратку графіку" #: data/resources/ui/dialogs/settings_dialog.ui:72 msgid "Graph Data Points" msgstr "Кількість точок даних графіку" #: data/resources/ui/dialogs/settings_dialog.ui:86 msgid "Show Usage Details in Sidebar" msgstr "Показати деталі використання у бічній панелі" #: data/resources/ui/dialogs/settings_dialog.ui:87 msgid "If enabled, the usage along with other information will be displayed" msgstr "" "Якщо активовано, використання (а також інша інформація) буде відображатися" #: data/resources/ui/dialogs/settings_dialog.ui:92 msgid "Show Device Descriptions in Sidebar" msgstr "Показати опис пристрою у бічній панелі" #: data/resources/ui/dialogs/settings_dialog.ui:93 msgid "" "If enabled, a device identifier like its name or device type will be " "displayed" msgstr "" "Якщо активовано, ідентифікатор пристрою (накшталт назви або типу) будуть " "відображатися" #: data/resources/ui/dialogs/settings_dialog.ui:98 msgid "Sidebar Meter Type" msgstr "Тип вимірювання у бічній панелі" #: data/resources/ui/dialogs/settings_dialog.ui:102 msgid "Bar" msgstr "Полоса" #: data/resources/ui/dialogs/settings_dialog.ui:103 msgid "Graph" msgstr "Графік" #: data/resources/ui/dialogs/settings_dialog.ui:111 msgid "Normalize Processor Usage" msgstr "Нормалізувати використання процесору" #: data/resources/ui/dialogs/settings_dialog.ui:112 msgid "" "If enabled, the total usage of all cores will be divided by the amount of " "cores" msgstr "" "Якщо активовано, загальне використання усіх ядер буде поділено на кількість " "ядер" #: data/resources/ui/dialogs/settings_dialog.ui:122 #: data/resources/ui/window.ui:65 data/resources/ui/window.ui:72 #: src/ui/pages/applications/mod.rs:131 msgid "Apps" msgstr "Додатки" #: data/resources/ui/dialogs/settings_dialog.ui:125 #: data/resources/ui/dialogs/settings_dialog.ui:207 msgid "Information Columns" msgstr "Колонки з інформацією" #: data/resources/ui/dialogs/settings_dialog.ui:183 #: data/resources/ui/dialogs/settings_dialog.ui:295 #: src/ui/pages/applications/mod.rs:1479 src/ui/pages/processes/mod.rs:2013 msgid "Combined Memory" msgstr "Поєднана пам'ять" #: data/resources/ui/dialogs/settings_dialog.ui:193 #: data/resources/ui/window.ui:105 data/resources/ui/window.ui:112 #: src/ui/pages/processes/mod.rs:175 msgid "Processes" msgstr "Процеси" #: data/resources/ui/dialogs/settings_dialog.ui:196 #: data/resources/ui/pages/cpu.ui:22 data/resources/ui/pages/processes.ui:56 msgid "Options" msgstr "Налаштування" #: data/resources/ui/dialogs/settings_dialog.ui:199 msgid "Show Niceness Values" msgstr "Показати значення пріоритету (niceness)" #: data/resources/ui/dialogs/settings_dialog.ui:200 msgid "" "Display priorities as niceness to allow for more fine-grained adjustments" msgstr "" "Показувати пріоритети у вигляді значення niceness для більш тонкого " "корегування" #: data/resources/ui/dialogs/settings_dialog.ui:305 msgid "Devices" msgstr "Пристрої" #: data/resources/ui/dialogs/settings_dialog.ui:308 msgid "Drives" msgstr "Накопичувачі" #: data/resources/ui/dialogs/settings_dialog.ui:311 msgid "Show Virtual Drives" msgstr "Показати віртуальні диски" #: data/resources/ui/dialogs/settings_dialog.ui:312 msgid "Virtual drives are for example ZFS volumes or mapped devices" msgstr "Віртуальні диски, наприклад, ZFS розділ" #: data/resources/ui/dialogs/settings_dialog.ui:322 msgid "Show Virtual Network Interfaces" msgstr "Показати віртуальні мережеві інтерфейси" #: data/resources/ui/dialogs/settings_dialog.ui:323 msgid "Virtual network interfaces are for example bridges or VPN tunnels" msgstr "Віртуальні мережеві інтерфейси, накшталт мостів або VPN тунелів" #: data/resources/ui/pages/applications.ui:6 #: data/resources/ui/pages/applications.ui:26 #: src/ui/pages/applications/mod.rs:1563 msgid "Kill App" msgstr "Знищити додаток" #: data/resources/ui/pages/applications.ui:10 #: data/resources/ui/pages/applications.ui:30 #: src/ui/pages/applications/mod.rs:1562 msgid "Halt App" msgstr "Зупинити додаток" #: data/resources/ui/pages/applications.ui:14 #: data/resources/ui/pages/applications.ui:34 #: src/ui/pages/applications/mod.rs:1564 msgid "Continue App" msgstr "Продовжити додаток" #: data/resources/ui/pages/applications.ui:22 #: data/resources/ui/pages/applications.ui:98 #: src/ui/pages/applications/mod.rs:1561 msgid "End App" msgstr "Завершити додаток" #: data/resources/ui/pages/applications.ui:40 #: data/resources/ui/pages/processes.ui:62 msgid "Information" msgstr "Інформація" #: data/resources/ui/pages/applications.ui:57 msgid "Search applications" msgstr "Шукати додатки" #: data/resources/ui/pages/applications.ui:87 #: data/resources/ui/pages/applications.ui:89 msgid "Show App Information" msgstr "Показати інформацію про додаток" #: data/resources/ui/pages/battery.ui:36 msgid "Battery Health" msgstr "Здоров'я акумулятора" #: data/resources/ui/pages/battery.ui:45 msgid "Design Capacity" msgstr "Ємність" #: data/resources/ui/pages/battery.ui:54 msgid "Charge Cycles" msgstr "Циклів заряджання" #: data/resources/ui/pages/battery.ui:63 msgid "Technology" msgstr "Технологія" #: data/resources/ui/pages/battery.ui:72 data/resources/ui/pages/gpu.ui:81 #: data/resources/ui/pages/network.ui:58 data/resources/ui/pages/npu.ui:75 msgid "Manufacturer" msgstr "Виробник" #: data/resources/ui/pages/battery.ui:81 msgid "Model Name" msgstr "Назва моделі" #: data/resources/ui/pages/battery.ui:90 data/resources/ui/pages/drive.ui:66 msgid "Device" msgstr "Пристрій" #: data/resources/ui/pages/cpu.ui:26 msgid "Show Usages of Logical CPUs" msgstr "Показати використання логічних процесорів" #: data/resources/ui/pages/cpu.ui:75 data/resources/ui/pages/gpu.ui:66 #: data/resources/ui/pages/npu.ui:60 msgid "Sensors" msgstr "Сенсори" #: data/resources/ui/pages/cpu.ui:90 msgid "Max Frequency" msgstr "Максимальна частота" #: data/resources/ui/pages/cpu.ui:99 msgid "Logical Cores" msgstr "Логічні ядра" #: data/resources/ui/pages/cpu.ui:108 msgid "Physical Cores" msgstr "Фізичні ядра" #: data/resources/ui/pages/cpu.ui:117 msgid "Sockets" msgstr "Сокетів" #: data/resources/ui/pages/cpu.ui:126 msgid "Uptime" msgstr "Тривалість роботи" #: data/resources/ui/pages/cpu.ui:135 msgid "Virtualization" msgstr "Віртуалізація" #: data/resources/ui/pages/cpu.ui:144 msgid "Architecture" msgstr "Архітектура" #: data/resources/ui/pages/drive.ui:38 msgid "Total Read" msgstr "Загально прочитано" #: data/resources/ui/pages/drive.ui:47 msgid "Total Written" msgstr "Загально записано" #: data/resources/ui/pages/drive.ui:57 data/resources/ui/pages/memory.ui:72 msgid "Type" msgstr "Тип" #: data/resources/ui/pages/drive.ui:75 msgid "Capacity" msgstr "Ємність" #: data/resources/ui/pages/drive.ui:84 msgid "Writable" msgstr "Можна записувати дані?" #: data/resources/ui/pages/drive.ui:93 msgid "Removable" msgstr "Можна витягнути?" #. Translators: "Link" refers to something like "PCIe 4.0 ×16" #: data/resources/ui/pages/drive.ui:102 data/resources/ui/pages/gpu.ui:113 #: data/resources/ui/pages/network.ui:103 data/resources/ui/pages/npu.ui:107 msgid "Link" msgstr "Сполучення" #: data/resources/ui/pages/gpu.ui:37 msgid "GPU Frequency" msgstr "Частота ядра" #: data/resources/ui/pages/gpu.ui:50 msgid "Video Memory Frequency" msgstr "Частота пам'яті" #: data/resources/ui/pages/gpu.ui:55 data/resources/ui/pages/npu.ui:49 #: src/ui/pages/battery.rs:217 msgid "Power Usage" msgstr "Споживання електроенергії" #: data/resources/ui/pages/gpu.ui:90 data/resources/ui/pages/npu.ui:84 msgid "PCI Slot" msgstr "Слот PCI" #: data/resources/ui/pages/gpu.ui:99 data/resources/ui/pages/network.ui:67 #: data/resources/ui/pages/npu.ui:93 msgid "Driver Used" msgstr "Драйвер" #: data/resources/ui/pages/gpu.ui:108 data/resources/ui/pages/npu.ui:102 msgid "Max Power Cap" msgstr "Максимальне обмеження споживання електроенергії" #: data/resources/ui/pages/memory.ui:9 msgid "You need to authenticate to see memory properties" msgstr "Вам потрібно автентифікуватися, щоб побачити подробиці пам'яті" #: data/resources/ui/pages/memory.ui:10 msgid "Authenticate" msgstr "Автентифікуватися" #: data/resources/ui/pages/memory.ui:45 msgid "Slots Used" msgstr "Зайнятих слотів" #: data/resources/ui/pages/memory.ui:54 msgid "Speed" msgstr "Швидкість" #: data/resources/ui/pages/memory.ui:63 msgid "Form Factor" msgstr "Форм-фактор" #: data/resources/ui/pages/memory.ui:81 msgid "Type Detail" msgstr "Подробиці типу" #: data/resources/ui/pages/network.ui:35 msgid "Total Received" msgstr "Загально отримано" #: data/resources/ui/pages/network.ui:44 msgid "Total Sent" msgstr "Загально відправлено" #: data/resources/ui/pages/network.ui:76 msgid "Interface" msgstr "Інтерфейс" #: data/resources/ui/pages/network.ui:85 msgid "Hardware Address" msgstr "Апаратна адреса" #: data/resources/ui/pages/network.ui:94 msgid "Network Name" msgstr "Назва мережі" #: data/resources/ui/pages/network.ui:112 msgid "Link Speed" msgstr "Швидкість запису" #: data/resources/ui/pages/npu.ui:31 msgid "NPU Frequency" msgstr "Частота мережевого процесору" #: data/resources/ui/pages/npu.ui:44 msgid "Memory Frequency" msgstr "Частота пам'яті" #: data/resources/ui/pages/processes.ui:6 #: data/resources/ui/pages/processes.ui:42 src/ui/pages/processes/mod.rs:2126 msgid "Kill Process" msgstr "Знищити процес" #: data/resources/ui/pages/processes.ui:10 #: data/resources/ui/pages/processes.ui:46 src/ui/pages/processes/mod.rs:2125 msgid "Halt Process" msgstr "Зупинити процес" #: data/resources/ui/pages/processes.ui:14 #: data/resources/ui/pages/processes.ui:50 src/ui/pages/processes/mod.rs:2127 msgid "Continue Process" msgstr "Продовжити процес" #: data/resources/ui/pages/processes.ui:22 #: data/resources/ui/pages/processes.ui:74 msgid "Kill Processes" msgstr "Знищити процеси" #: data/resources/ui/pages/processes.ui:26 #: data/resources/ui/pages/processes.ui:78 msgid "Halt Processes" msgstr "Зупинити процеси" #: data/resources/ui/pages/processes.ui:30 #: data/resources/ui/pages/processes.ui:82 msgid "Continue Processes" msgstr "Продовжити процеси" #: data/resources/ui/pages/processes.ui:38 #: data/resources/ui/pages/processes.ui:157 src/ui/pages/processes/mod.rs:523 #: src/ui/pages/processes/mod.rs:2124 msgid "End Process" msgstr "Завершити процес" #: data/resources/ui/pages/processes.ui:70 src/ui/pages/processes/mod.rs:527 msgid "End Processes" msgstr "Завершити процеси" #: data/resources/ui/pages/processes.ui:103 msgid "Search processes" msgstr "Шукати процеси" #: data/resources/ui/pages/processes.ui:133 #: data/resources/ui/pages/processes.ui:135 msgid "Show Process Options" msgstr "Показати налаштування процесу" #: data/resources/ui/pages/processes.ui:146 #: data/resources/ui/pages/processes.ui:148 msgid "Show Process Information" msgstr "Показати інформацію про процес" #: data/resources/ui/shortcuts.ui:6 msgctxt "shortcut window" msgid "General" msgstr "Загальні" #: data/resources/ui/shortcuts.ui:9 msgctxt "shortcut window" msgid "Preferences" msgstr "Налаштування" #: data/resources/ui/shortcuts.ui:15 msgctxt "shortcut window" msgid "Show Shortcuts" msgstr "Показати клавіатурні скорочення" #: data/resources/ui/shortcuts.ui:21 msgctxt "shortcut window" msgid "Quit" msgstr "Вийти" #: data/resources/ui/shortcuts.ui:29 #| msgid "Processes" msgctxt "shortcut window" msgid "Apps/Processes" msgstr "Програми/Процеси" #: data/resources/ui/shortcuts.ui:32 msgctxt "shortcut window" msgid "Toggle Search Field" msgstr "Перемкнути поле пошуку" #: data/resources/ui/shortcuts.ui:38 msgctxt "shortcut window" msgid "End App/Process" msgstr "Завершити додаток/процес" #: data/resources/ui/shortcuts.ui:44 msgctxt "shortcut window" msgid "Kill App/Process" msgstr "Знищити додаток/процес" #: data/resources/ui/shortcuts.ui:50 msgctxt "shortcut window" msgid "Halt App/Process" msgstr "Зупинити додаток/процес" #: data/resources/ui/shortcuts.ui:56 msgctxt "shortcut window" msgid "Continue App/Process" msgstr "Продовжити додаток/процес" #: data/resources/ui/shortcuts.ui:62 msgctxt "shortcut window" msgid "Show Information for App/Process" msgstr "Показати інформацію про додаток/процес" #: data/resources/ui/shortcuts.ui:68 msgctxt "shortcut window" msgid "Show Process Options" msgstr "Показати налаштування процесу" #: data/resources/ui/window.ui:6 msgid "Preferences" msgstr "Налаштування" #: data/resources/ui/window.ui:10 msgid "Keyboard Shortcuts" msgstr "Клавіатурні скорочення" #: data/resources/ui/window.ui:14 msgid "About Resources" msgstr "Про Ресурси" #: data/resources/ui/window.ui:88 data/resources/ui/window.ui:128 msgid "Search" msgstr "Шукати" #: data/resources/ui/window.ui:90 data/resources/ui/window.ui:130 msgid "Toggle search field" msgstr "Перемкнути поле пошуку" #: src/application.rs:274 msgid "The Nalux Team" msgstr "Команда Nalux" #: src/application.rs:282 msgid "Report Issues" msgstr "Повідомити про проблеми" #. Translator credits. Replace "translator-credits" with your name/username, and optionally an email or URL. #. One name per line, please do not remove previous names. #: src/application.rs:288 msgid "translator-credits" msgstr "volkov " #: src/application.rs:289 msgid "Icon by" msgstr "Піктограму зробив" #: src/ui/dialogs/app_dialog.rs:155 src/ui/dialogs/process_dialog.rs:133 #: src/ui/dialogs/process_dialog.rs:137 src/ui/dialogs/process_dialog.rs:146 #: src/ui/dialogs/process_dialog.rs:148 src/ui/dialogs/process_dialog.rs:171 #: src/ui/dialogs/process_dialog.rs:178 src/ui/dialogs/process_dialog.rs:185 #: src/ui/dialogs/process_dialog.rs:192 src/ui/pages/applications/mod.rs:948 #: src/ui/pages/applications/mod.rs:1074 src/ui/pages/battery.rs:205 #: src/ui/pages/battery.rs:225 src/ui/pages/battery.rs:231 #: src/ui/pages/battery.rs:234 src/ui/pages/battery.rs:265 #: src/ui/pages/battery.rs:289 src/ui/pages/battery.rs:291 #: src/ui/pages/battery.rs:301 src/ui/pages/cpu.rs:243 src/ui/pages/cpu.rs:258 #: src/ui/pages/cpu.rs:278 src/ui/pages/cpu.rs:284 src/ui/pages/cpu.rs:290 #: src/ui/pages/cpu.rs:296 src/ui/pages/cpu.rs:300 src/ui/pages/cpu.rs:303 #: src/ui/pages/cpu.rs:341 src/ui/pages/cpu.rs:448 src/ui/pages/drive.rs:319 #: src/ui/pages/drive.rs:350 src/ui/pages/drive.rs:352 #: src/ui/pages/drive.rs:381 src/ui/pages/drive.rs:383 #: src/ui/pages/drive.rs:399 src/ui/pages/drive.rs:400 #: src/ui/pages/drive.rs:407 src/ui/pages/drive.rs:417 #: src/ui/pages/drive.rs:427 src/ui/pages/drive.rs:433 src/ui/pages/gpu.rs:245 #: src/ui/pages/gpu.rs:252 src/ui/pages/gpu.rs:297 src/ui/pages/gpu.rs:322 #: src/ui/pages/gpu.rs:325 src/ui/pages/gpu.rs:336 src/ui/pages/gpu.rs:377 #: src/ui/pages/gpu.rs:384 src/ui/pages/gpu.rs:396 src/ui/pages/gpu.rs:403 #: src/ui/pages/gpu.rs:407 src/ui/pages/gpu.rs:437 src/ui/pages/gpu.rs:443 #: src/ui/pages/memory.rs:227 src/ui/pages/memory.rs:228 #: src/ui/pages/memory.rs:232 src/ui/pages/memory.rs:233 #: src/ui/pages/memory.rs:237 src/ui/pages/memory.rs:238 #: src/ui/pages/memory.rs:266 src/ui/pages/memory.rs:327 #: src/ui/pages/network.rs:252 src/ui/pages/network.rs:259 #: src/ui/pages/network.rs:266 src/ui/pages/network.rs:272 #: src/ui/pages/network.rs:275 src/ui/pages/network.rs:285 #: src/ui/pages/network.rs:292 src/ui/pages/network.rs:302 #: src/ui/pages/network.rs:370 src/ui/pages/network.rs:373 #: src/ui/pages/network.rs:375 src/ui/pages/network.rs:404 #: src/ui/pages/network.rs:407 src/ui/pages/network.rs:409 #: src/ui/pages/network.rs:417 src/ui/pages/network.rs:424 #: src/ui/pages/network.rs:434 src/ui/pages/processes/mod.rs:1224 #: src/ui/pages/processes/mod.rs:1291 src/ui/pages/processes/mod.rs:1358 #: src/ui/pages/processes/mod.rs:1425 src/ui/pages/processes/mod.rs:1911 #: src/ui/pages/processes/mod.rs:1913 src/utils/battery.rs:152 #: src/utils/drive.rs:137 src/utils/gpu/mod.rs:279 src/utils/gpu/mod.rs:291 #: src/utils/link/mod.rs:61 src/utils/npu/mod.rs:244 src/utils/npu/mod.rs:250 msgid "N/A" msgstr "Невідомо" #: src/ui/dialogs/process_options_dialog.rs:147 src/ui/pages/cpu.rs:257 #: src/ui/pages/cpu.rs:417 src/ui/pages/cpu.rs:421 msgid "CPU {}" msgstr "Процесор {}" #: src/ui/pages/applications/application_entry.rs:190 src/ui/pages/drive.rs:414 #: src/ui/pages/drive.rs:424 src/ui/pages/processes/process_entry.rs:211 msgid "No" msgstr "Ні" #: src/ui/pages/applications/application_entry.rs:191 #: src/ui/pages/processes/process_entry.rs:212 msgid "Yes (Flatpak)" msgstr "Так (Flatpak)" #: src/ui/pages/applications/application_entry.rs:192 #: src/ui/pages/processes/process_entry.rs:213 msgid "Yes (Snap)" msgstr "Так (Snap)" #: src/ui/pages/applications/mod.rs:660 msgid "Running Apps: {}" msgstr "Запущених додатків: {}" #: src/ui/pages/applications/mod.rs:700 src/ui/pages/processes/mod.rs:862 msgid "Cancel" msgstr "Скасувати" #: src/ui/pages/applications/mod.rs:746 msgid "App" msgstr "Додаток" #: src/ui/pages/applications/mod.rs:1539 src/ui/pages/processes/mod.rs:2073 msgid "End {}?" msgstr "Завершити {}?" #: src/ui/pages/applications/mod.rs:1540 src/ui/pages/processes/mod.rs:2074 msgid "Halt {}?" msgstr "Зупинити {}?" #: src/ui/pages/applications/mod.rs:1541 src/ui/pages/processes/mod.rs:2075 msgid "Kill {}?" msgstr "Знищити {}?" #: src/ui/pages/applications/mod.rs:1542 src/ui/pages/processes/mod.rs:2076 msgid "Continue {}?" msgstr "Продовжити {}?" #: src/ui/pages/applications/mod.rs:1548 src/ui/pages/processes/mod.rs:2111 msgid "Unsaved work might be lost." msgstr "Не збережена робота може бути втрачена." #: src/ui/pages/applications/mod.rs:1550 msgid "" "Halting an app can come with serious risks such as losing data and security " "implications. Use with caution." msgstr "" "Зупинка додатку може призвести до серйозних ризиків, такі як: втрата даних і " "проблеми з безпекою. Продовжуйте на свій власний ризик." #: src/ui/pages/applications/mod.rs:1553 msgid "" "Killing an app can come with serious risks such as losing data and security " "implications. Use with caution." msgstr "" "Знищення додатку може призвести до серйозних ризиків, такі як: втрата даних " "і проблеми з безпекою. Продовжуйте на свій власний ризик." #: src/ui/pages/battery.rs:102 src/utils/battery.rs:258 msgid "Battery" msgstr "Акумулятор" #: src/ui/pages/battery.rs:210 msgid "Battery Charge" msgstr "Заряд акумулятора" #: src/ui/pages/battery.rs:279 src/ui/pages/cpu.rs:438 #: src/ui/pages/drive.rs:344 src/ui/pages/drive.rs:375 src/ui/pages/gpu.rs:429 #: src/ui/pages/network.rs:362 src/ui/pages/network.rs:396 msgid "Highest:" msgstr "Пікове навантаження:" #: src/ui/pages/cpu.rs:242 src/ui/pages/gpu.rs:212 msgid "Total Usage" msgstr "Загальне використання" #: src/ui/pages/cpu.rs:271 src/ui/pages/gpu.rs:239 msgid "Temperature" msgstr "Температура" #: src/ui/pages/drive.rs:126 msgid "Drive" msgstr "Накопичувач" #: src/ui/pages/drive.rs:236 msgid "Drive Activity" msgstr "Активність диску" #: src/ui/pages/drive.rs:243 msgid "Read Speed" msgstr "Швидкість читання" #: src/ui/pages/drive.rs:247 msgid "Write Speed" msgstr "Швидкість запису" #: src/ui/pages/drive.rs:412 src/ui/pages/drive.rs:422 msgid "Yes" msgstr "Так" #. Translators: This is an abbreviation for "Read" and "Write". This is displayed in the sidebar so your #. translation should preferably be quite short or an abbreviation #: src/ui/pages/drive.rs:440 msgid "R: {} · W: {}" msgstr "Чит.: {} · Зап.: {}" #: src/ui/pages/gpu.rs:220 msgid "Video Encoder/Decoder Usage" msgstr "Використання відео кодувальника/декодувальника" #: src/ui/pages/gpu.rs:226 msgid "Video Encoder Usage" msgstr "Використання кодувальника" #: src/ui/pages/gpu.rs:231 msgid "Video Decoder Usage" msgstr "Використання декодувальника" #: src/ui/pages/gpu.rs:236 msgid "Video Memory Usage" msgstr "Використання відеопам'яті" #. Translators: This will be displayed in the sidebar, please try to keep your translation as short as (or even #. shorter than) 'Memory' #: src/ui/pages/gpu.rs:415 msgid "Memory: {}" msgstr "Пам'ять: {}" #: src/ui/pages/memory.rs:262 msgid "{} of {}" msgstr "{} із {}" #: src/ui/pages/memory.rs:265 msgid "{} MT/s" msgstr "{} МТ/с" #. Translators: This will be displayed in the sidebar, so your translation for "Swap" should #. preferably be quite short or an abbreviation #: src/ui/pages/memory.rs:346 msgid "{} / {} · Swap: {} %" msgstr "{} / {} · Swap: {} %" #: src/ui/pages/network.rs:127 src/utils/network.rs:135 msgid "Network Interface" msgstr "Мережевий інтерфейс" #: src/ui/pages/network.rs:241 msgid "Receiving" msgstr "Отримується" #: src/ui/pages/network.rs:245 msgid "Sending" msgstr "Відправляється" #. Translators: This is an abbreviation for "Receive" and "Send". This is displayed in the sidebar so #. your translation should preferably be quite short or an abbreviation #: src/ui/pages/network.rs:445 msgid "R: {} · S: {}" msgstr "Отрим.: {} · Надсил.: {}" #: src/ui/pages/processes/mod.rs:813 msgid "Running Processes: {}" msgstr "Запущених процесів: {}" #: src/ui/pages/processes/mod.rs:911 msgid "Process" msgstr "Назва процесу" #: src/ui/pages/processes/mod.rs:2083 msgid "End process?" msgid_plural "End {} processes?" msgstr[0] "Завершити {} процес?" msgstr[1] "Завершити {} процеси?" msgstr[2] "Завершити {} процесів?" #: src/ui/pages/processes/mod.rs:2089 msgid "Halt process?" msgid_plural "Halt {} processes?" msgstr[0] "Зупинити {} процес?" msgstr[1] "Зупинити {} процеси?" msgstr[2] "Зупинити {} процесів?" #: src/ui/pages/processes/mod.rs:2095 src/ui/pages/processes/mod.rs:2101 msgid "Kill process?" msgid_plural "Kill {} processes?" msgstr[0] "Знищити {} процес?" msgstr[1] "Знищити {} процеси?" msgstr[2] "Знищити {} процесів?" #: src/ui/pages/processes/mod.rs:2113 msgid "" "Halting a process can come with serious risks such as losing data and " "security implications. Use with caution." msgstr "" "Зупинка процесу може призвести до серйозних ризиків, такі як: втрата даних і " "проблеми з безпекою. Продовжуйте на свій власний ризик." #: src/ui/pages/processes/mod.rs:2116 msgid "" "Killing a process can come with serious risks such as losing data and " "security implications. Use with caution." msgstr "" "Знищення процесу може призвести до серйозних ризиків, такі як: втрата даних " "і проблеми з безпекою. Продовжуйте на свій власний ризик." #: src/ui/window.rs:466 msgid "GPU {}" msgstr "Відеокарта {}" #: src/ui/window.rs:496 msgid "NPU {}" msgstr "Мережевий процесор {}" #: src/ui/window.rs:498 msgid "NPU" msgstr "Мережевий процесор" #: src/ui/window.rs:1174 msgid "Successfully adjusted {}" msgstr "Успішно відкориговано {}" #: src/ui/window.rs:1175 msgid "There was a problem adjusting {}" msgstr "Виникли проблема при коригуванні {}" #: src/ui/window.rs:1257 msgid "Successfully ended {}" msgstr "Успішно завершено {}" #: src/ui/window.rs:1258 msgid "Successfully halted {}" msgstr "Успішно зупинено {}" #: src/ui/window.rs:1259 msgid "Successfully killed {}" msgstr "Успішно знищено {}" #: src/ui/window.rs:1260 msgid "Successfully continued {}" msgstr "Успішно продовжено {}" #: src/ui/window.rs:1267 msgid "Successfully ended the process" msgid_plural "Successfully ended {} processes" msgstr[0] "Успішно завершено {} процес" msgstr[1] "Успішно завершено {} процеси" msgstr[2] "Успішно завершено {} процесів" #: src/ui/window.rs:1273 msgid "Successfully halted the process" msgid_plural "Successfully halted {} processes" msgstr[0] "Успішно зупинено {} процес" msgstr[1] "Успішно зупинено {} процеси" msgstr[2] "Успішно зупинено {} процесів" #: src/ui/window.rs:1279 msgid "Successfully killed the process" msgid_plural "Successfully killed {} processes" msgstr[0] "Успішно знищено {} процес" msgstr[1] "Успішно знищено {} процеси" msgstr[2] "Успішно знищено {} процесів" #: src/ui/window.rs:1285 msgid "Successfully continued the process" msgid_plural "Successfully continued {} processes" msgstr[0] "Успішно продовжено {} процес" msgstr[1] "Успішно продовжено {} процеси" msgstr[2] "Успішно продовжено {} процесів" #: src/ui/window.rs:1296 msgid "There was a problem ending a process" msgid_plural "There were problems ending {} processes" msgstr[0] "" "Виникли проблеми при завершені {} \n" "процесу" msgstr[1] "Виникли проблеми при завершені {} процесів" msgstr[2] "Виникли проблеми при завершені {} процесів" #: src/ui/window.rs:1302 msgid "There was a problem halting a process" msgid_plural "There were problems halting {} processes" msgstr[0] "Виникли проблеми при зупинці {} процесу" msgstr[1] "Виникли проблеми при зупинці {} процесів" msgstr[2] "Виникли проблеми при зупинці {} процесів" #: src/ui/window.rs:1308 msgid "There was a problem killing a process" msgid_plural "There were problems killing {} processes" msgstr[0] "Виникли проблеми при знищенні {} процесу" msgstr[1] "Виникли проблеми при знищенні {} процесів" msgstr[2] "Виникли проблеми при знищенні {} процесів" #: src/ui/window.rs:1314 msgid "There was a problem continuing a process" msgid_plural "There were problems continuing {} processes" msgstr[0] "Виникли проблеми при продовженні {} процесу" msgstr[1] "Виникли проблеми при продовженні {} процесів" msgstr[2] "Виникли проблеми при продовженні {} процесів" #: src/ui/window.rs:1324 msgid "There was a problem ending {}" msgstr "Виникли проблема при продовженні {}" #: src/ui/window.rs:1325 msgid "There was a problem halting {}" msgstr "Виникли проблема при зупинці {}" #: src/ui/window.rs:1326 msgid "There was a problem killing {}" msgstr "Сталася проблема при знищенні {}" #: src/ui/window.rs:1327 msgid "There was a problem continuing {}" msgstr "Сталася проблема при продовженні {}" #: src/utils/app.rs:222 msgid "System Processes" msgstr "Системні процеси" #: src/utils/battery.rs:93 msgid "Charging" msgstr "Заряджається" #: src/utils/battery.rs:94 msgid "Discharging" msgstr "Розряджається" #: src/utils/battery.rs:95 msgid "Empty" msgstr "Порожня" #: src/utils/battery.rs:96 msgid "Full" msgstr "Повна" #: src/utils/battery.rs:97 msgid "Unknown" msgstr "Невідомо" #: src/utils/battery.rs:143 msgid "Nickel-Metal Hydride" msgstr "Нікель-металевий гідрид" #: src/utils/battery.rs:144 msgid "Nickel-Cadmium" msgstr "Нікель-кадмій" #: src/utils/battery.rs:145 msgid "Nickel-Zinc" msgstr "Нікель-цинк" #: src/utils/battery.rs:146 msgid "Lead-Acid" msgstr "Свинець" #: src/utils/battery.rs:147 msgid "Lithium-Ion" msgstr "Літій-іон" #: src/utils/battery.rs:148 msgid "Lithium Iron Phosphate" msgstr "Літієвий залізний фосфат" #: src/utils/battery.rs:149 msgid "Lithium Polymer" msgstr "Літій полімер" #: src/utils/battery.rs:151 msgid "Rechargeable Alkaline Managanese" msgstr "Акумуляторний лужний марганець" #: src/utils/battery.rs:256 msgid "{} Battery" msgstr "{} акумулятор" #: src/utils/units.rs:91 msgid "{} K" msgstr "{} K" #: src/utils/units.rs:93 msgid "{} °C" msgstr "{} °C" #: src/utils/units.rs:95 msgid "{} °F" msgstr "{} °F" #: src/utils/units.rs:113 src/utils/units.rs:127 src/utils/units.rs:147 #: src/utils/units.rs:161 msgid "{} B" msgstr "{} Б" #: src/utils/units.rs:114 src/utils/units.rs:128 msgid "{} kB" msgstr "{} кБ" #: src/utils/units.rs:115 src/utils/units.rs:129 msgid "{} MB" msgstr "{} МБ" #: src/utils/units.rs:116 src/utils/units.rs:130 msgid "{} GB" msgstr "{} ГБ" #: src/utils/units.rs:117 src/utils/units.rs:131 msgid "{} TB" msgstr "{} ТБ" #: src/utils/units.rs:118 src/utils/units.rs:132 msgid "{} PB" msgstr "{} ПБ" #: src/utils/units.rs:119 src/utils/units.rs:133 msgid "{} EB" msgstr "{} ЕБ" #: src/utils/units.rs:120 src/utils/units.rs:134 msgid "{} ZB" msgstr "{} ЗБ" #: src/utils/units.rs:121 src/utils/units.rs:135 msgid "{} YB" msgstr "{} ЙБ" #: src/utils/units.rs:122 src/utils/units.rs:136 msgid "{} RB" msgstr "{} РБ" #: src/utils/units.rs:123 src/utils/units.rs:137 msgid "{} QB" msgstr "{} КБ" #: src/utils/units.rs:148 src/utils/units.rs:162 msgid "{} KiB" msgstr "{} КіБ" #: src/utils/units.rs:149 src/utils/units.rs:163 msgid "{} MiB" msgstr "{} МіБ" #: src/utils/units.rs:150 src/utils/units.rs:164 msgid "{} GiB" msgstr "{} ГіБ" #: src/utils/units.rs:151 src/utils/units.rs:165 msgid "{} TiB" msgstr "{} ТіБ" #: src/utils/units.rs:152 src/utils/units.rs:166 msgid "{} PiB" msgstr "{} ПіБ" #: src/utils/units.rs:153 src/utils/units.rs:167 msgid "{} EiB" msgstr "{} ЕіБ" #: src/utils/units.rs:154 src/utils/units.rs:168 msgid "{} ZiB" msgstr "{} ЗіБ" #: src/utils/units.rs:155 src/utils/units.rs:169 msgid "{} YiB" msgstr "{} ЙіБ" #: src/utils/units.rs:156 src/utils/units.rs:170 msgid "{} RiB" msgstr "{} РіБ" #: src/utils/units.rs:157 src/utils/units.rs:171 msgid "{} QiB" msgstr "{} КіБ" #: src/utils/units.rs:198 src/utils/units.rs:215 msgid "{} B/s" msgstr "{} Б/с" #: src/utils/units.rs:199 msgid "{} kB/s" msgstr "{} кБ/с" #: src/utils/units.rs:200 msgid "{} MB/s" msgstr "{} МБ/с" #: src/utils/units.rs:201 msgid "{} GB/s" msgstr "{} ГБ/с" #: src/utils/units.rs:202 msgid "{} TB/s" msgstr "{} ТБ/с" #: src/utils/units.rs:203 msgid "{} PB/s" msgstr "{} ПБ/с" #: src/utils/units.rs:204 msgid "{} EB/s" msgstr "{} ЕБ/с" #: src/utils/units.rs:205 msgid "{} ZB/s" msgstr "{} ЗБ/с" #: src/utils/units.rs:206 msgid "{} YB/s" msgstr "{} ЙБ/с" #: src/utils/units.rs:207 msgid "{} RB/s" msgstr "{} РБ/с" #: src/utils/units.rs:208 msgid "{} QB/s" msgstr "{} КБ/с" #: src/utils/units.rs:216 msgid "{} KiB/s" msgstr "{} КіБ/с" #: src/utils/units.rs:217 msgid "{} MiB/s" msgstr "{} МіБ/с" #: src/utils/units.rs:218 msgid "{} GiB/s" msgstr "{} ГіБ/с" #: src/utils/units.rs:219 msgid "{} TiB/s" msgstr "{} ТіБ/с" #: src/utils/units.rs:220 msgid "{} PiB/s" msgstr "{} ПіБ/с" #: src/utils/units.rs:221 msgid "{} EiB/s" msgstr "{} ЕіБ/с" #: src/utils/units.rs:222 msgid "{} ZiB/s" msgstr "{} ЗіБ/с" #: src/utils/units.rs:223 msgid "{} YiB/s" msgstr "{} ЙіБ/с" #: src/utils/units.rs:224 msgid "{} RiB/s" msgstr "{} РіБ/с" #: src/utils/units.rs:225 msgid "{} QiB/s" msgstr "{} КіБ/с" #: src/utils/units.rs:239 src/utils/units.rs:256 msgid "{} b/s" msgstr "{} б/с" #: src/utils/units.rs:240 msgid "{} kb/s" msgstr "{} кб/с" #: src/utils/units.rs:241 msgid "{} Mb/s" msgstr "{} Мб/с" #: src/utils/units.rs:242 msgid "{} Gb/s" msgstr "{} Гб/с" #: src/utils/units.rs:243 msgid "{} Tb/s" msgstr "{} Тб/с" #: src/utils/units.rs:244 msgid "{} Pb/s" msgstr "{} Пб/с" #: src/utils/units.rs:245 msgid "{} Eb/s" msgstr "{} Еб/с" #: src/utils/units.rs:246 msgid "{} Zb/s" msgstr "{} Зб/с" #: src/utils/units.rs:247 msgid "{} Yb/s" msgstr "{} Йб/с" #: src/utils/units.rs:248 msgid "{} Rb/s" msgstr "{} Рб/с" #: src/utils/units.rs:249 msgid "{} Qb/s" msgstr "{} Кб/с" #: src/utils/units.rs:257 msgid "{} Kib/s" msgstr "{} КіБ/с" #: src/utils/units.rs:258 msgid "{} Mib/s" msgstr "{} МіБ/с" #: src/utils/units.rs:259 msgid "{} Gib/s" msgstr "{} ГіБ/с" #: src/utils/units.rs:260 msgid "{} Tib/s" msgstr "{} ТіБ/с" #: src/utils/units.rs:261 msgid "{} Pib/s" msgstr "{} ПіБ/с" #: src/utils/units.rs:262 msgid "{} Eib/s" msgstr "{} ЕіБ/с" #: src/utils/units.rs:263 msgid "{} Zib/s" msgstr "{} ЗіБ/с" #: src/utils/units.rs:264 msgid "{} Yib/s" msgstr "{} ЙіБ/с" #: src/utils/units.rs:265 msgid "{} Rib/s" msgstr "{} РіБ/с" #: src/utils/units.rs:266 msgid "{} Qib/s" msgstr "{} КіБ/с" #: src/utils/units.rs:273 msgid "{} Hz" msgstr "{} Гц" #: src/utils/units.rs:274 msgid "{} kHz" msgstr "{} кГц" #: src/utils/units.rs:275 msgid "{} MHz" msgstr "{} МГц" #: src/utils/units.rs:276 msgid "{} GHz" msgstr "{} ГГц" #: src/utils/units.rs:277 msgid "{} THz" msgstr "{} ТГц" #: src/utils/units.rs:278 msgid "{} PHz" msgstr "{} ПГц" #: src/utils/units.rs:279 msgid "{} EHz" msgstr "{} ЕГц" #: src/utils/units.rs:280 msgid "{} ZHz" msgstr "{} ЗГц" #: src/utils/units.rs:281 msgid "{} YHz" msgstr "{} ЙГц" #: src/utils/units.rs:282 msgid "{} RHz" msgstr "{} РГц" #: src/utils/units.rs:283 msgid "{} QHz" msgstr "{} ЙГц" #: src/utils/units.rs:290 msgid "{} W" msgstr "{} Вт" #: src/utils/units.rs:291 msgid "{} kW" msgstr "{} кВт" #: src/utils/units.rs:292 msgid "{} MW" msgstr "{} МВт" #: src/utils/units.rs:293 msgid "{} GW" msgstr "{} ГВт" #: src/utils/units.rs:294 msgid "{} TW" msgstr "{} ТВт" #: src/utils/units.rs:295 msgid "{} PW" msgstr "{} ПВт" #: src/utils/units.rs:296 msgid "{} EW" msgstr "{} ЕВт" #: src/utils/units.rs:297 msgid "{} ZW" msgstr "{} ЗВт" #: src/utils/units.rs:298 msgid "{} YW" msgstr "{} ЙВт" #: src/utils/units.rs:299 msgid "{} RW" msgstr "{} РВт" #: src/utils/units.rs:300 msgid "{} QW" msgstr "{} КВт" #: src/utils/units.rs:309 src/utils/units.rs:323 msgid "{} Wh" msgstr "{} Вт/год" #: src/utils/units.rs:310 src/utils/units.rs:324 msgid "{} kWh" msgstr "{} кВт/год" #: src/utils/units.rs:311 src/utils/units.rs:325 msgid "{} MWh" msgstr "{} МВт/год" #: src/utils/units.rs:312 src/utils/units.rs:326 msgid "{} GWh" msgstr "{} ГВт/год" #: src/utils/units.rs:313 src/utils/units.rs:327 msgid "{} TWh" msgstr "{} ТВт/год" #: src/utils/units.rs:314 src/utils/units.rs:328 msgid "{} PWh" msgstr "{} ПВт/год" #: src/utils/units.rs:315 src/utils/units.rs:329 msgid "{} EWh" msgstr "{} ЕВт/год" #: src/utils/units.rs:316 src/utils/units.rs:330 msgid "{} ZWh" msgstr "{} ЗВт/год" #: src/utils/units.rs:317 src/utils/units.rs:331 msgid "{} YWh" msgstr "{} ЙВт/год" #: src/utils/units.rs:318 src/utils/units.rs:332 msgid "{} RWh" msgstr "{} РВт/год" #: src/utils/units.rs:319 src/utils/units.rs:333 msgid "{} QWh" msgstr "{} КВт/год" #: src/utils/drive.rs:129 src/utils/drive.rs:208 msgid "CD/DVD/Blu-ray Drive" msgstr "CD/DVD/Blu-ray дисковод" #: src/utils/drive.rs:130 msgid "eMMC Storage" msgstr "eMMC накопичувач" #: src/utils/drive.rs:131 msgid "Flash Storage" msgstr "Флеш накопичувач" #: src/utils/drive.rs:132 src/utils/drive.rs:209 msgid "Floppy Drive" msgstr "Флопі дискета" #: src/utils/drive.rs:133 msgid "Hard Disk Drive" msgstr "Жорсткий диск" #: src/utils/drive.rs:134 msgid "Loop Device" msgstr "Loop-пристрій" #: src/utils/drive.rs:135 msgid "Mapped Device" msgstr "Приєднаний пристрій" #: src/utils/drive.rs:136 msgid "NVMe Drive" msgstr "NVMe" #: src/utils/drive.rs:138 msgid "Software Raid" msgstr "Програмний Raid" #: src/utils/drive.rs:139 msgid "RAM Disk" msgstr "RAM-диск" #: src/utils/drive.rs:140 msgid "Solid State Drive" msgstr "ССД" #: src/utils/drive.rs:141 msgid "ZFS Volume" msgstr "Розділ ZFS" #: src/utils/drive.rs:142 msgid "Compressed RAM Disk (zram)" msgstr "Скомпресований RAM-диск (zram)" #: src/utils/drive.rs:210 msgid "{} Loop Device" msgstr "{} Loop-пристрій" #: src/utils/drive.rs:211 msgid "{} Mapped Device" msgstr "{} Приєднаний пристрій" #: src/utils/drive.rs:212 msgid "{} RAID" msgstr "{} RAID" #: src/utils/drive.rs:213 msgid "{} RAM Disk" msgstr "{} RAM-диск" #: src/utils/drive.rs:214 msgid "{} zram Device" msgstr "{} zram-пристрій" #: src/utils/drive.rs:215 msgid "{} ZFS Volume" msgstr "{} ZFS розділ" #: src/utils/drive.rs:216 msgid "{} Drive" msgstr "{} накопичувач" #: src/utils/network.rs:123 msgid "Bluetooth Tether" msgstr "Bluetooth з'єднання" #: src/utils/network.rs:124 msgid "Network Bridge" msgstr "Мережевий міст" #: src/utils/network.rs:125 msgid "Ethernet Connection" msgstr "Дротове з'єднання" #: src/utils/network.rs:126 msgid "Docker Bridge" msgstr "Міст Docker" #: src/utils/network.rs:127 msgid "InfiniBand Connection" msgstr "InfiniBand з'єднання" #: src/utils/network.rs:128 msgid "Serial Line IP Connection" msgstr "Послідовне IP-з'єднання" #: src/utils/network.rs:129 msgid "Virtual Ethernet Device" msgstr "Віртуальний Ethernet пристрій" #: src/utils/network.rs:130 msgid "VM Network Bridge" msgstr "Мережевий міст віртуальної машини" #: src/utils/network.rs:131 msgid "VPN Tunnel" msgstr "Тунель VPN" #: src/utils/network.rs:132 msgid "VPN Tunnel (WireGuard)" msgstr "Тунель VPN (WireGuard)" #: src/utils/network.rs:133 msgid "Wi-Fi Connection" msgstr "Wi-Fi з'єднання" #: src/utils/network.rs:134 msgid "WWAN Connection" msgstr "WWAN з'єдання" #~ msgid "Memory Usage" #~ msgstr "Використання пам'яті" #~ msgid "Show Search Fields on Launch" #~ msgstr "Показувати поля пошуку при запуску додатка" #~ msgid "VRAM: {}" #~ msgstr "Відеопам'ять: {}" #~ msgid "Very High" #~ msgstr "Дуже високий" #~ msgid "High" #~ msgstr "Високий" #~ msgid "Normal" #~ msgstr "Нормальний" #~ msgid "Low" #~ msgstr "Низький" #~ msgid "Very Low" #~ msgstr "Дуже низький" #~ msgid "Window width" #~ msgstr "Ширина вікна" #~ msgid "Window height" #~ msgstr "Висота вікна" #~ msgid "Window maximized state" #~ msgstr "Стан розгортання вікна" #~ msgid "Temperature unit" #~ msgstr "Одиниця вимірювання температури" #~ msgid "Unit Prefix Base" #~ msgstr "Основа префіксів одиниць" #~ msgid "Show search field for Processes and Applications on launch" #~ msgstr "" #~ "Показувати поле пошуку для списку процесів та додатків при запуску додатку" #~ msgid "Show virtual block devices such as LVM containers" #~ msgstr "Показувати віртуальні пристрої, такі як LVM контейнери" #~ msgid "Show virtual network interfaces such as Docker interfaces" #~ msgstr "" #~ "Показувати віртуальні мережеві інтерфейси, такі як Docker інтерфейси" #~ msgid "Show usage details in the sidebar" #~ msgstr "Показувати деталі використання у бічній панелі" #~ msgid "Show device description in the sidebar" #~ msgstr "Показувати опис пристрою у бічній панелі" #~ msgid "Display network speeds in bits per second" #~ msgstr "Показувати швидкість у бітах в секунду у списку додатків" #~ msgid "Display memory usage in Applications view" #~ msgstr "Показувати використання пам'яті у списку додатків" #~ msgid "Display CPU usage in Applications view" #~ msgstr "Показувати використання процесору у списку додатків" #~ msgid "Display drive read speed in Applications view" #~ msgstr "Показувати швидкість запису на диск у списку додатків" #~ msgid "Display drive read total in Applications view" #~ msgstr "Показувати читання з диску (загально) у списку додатків" #~ msgid "Display drive write speed in Applications view" #~ msgstr "Показувати швидкість запису на диск у списку додатків" #~ msgid "Display drive write total in Applications view" #~ msgstr "Показувати записування на диск (загально) у списку додатків" #~ msgid "Display GPU usage in Applications view" #~ msgstr "Показувати використання відеокарти у списку додатків" #~ msgid "Display video encoder usage in Applications view" #~ msgstr "Показувати використання відео кодувальника у списку додатків" #~ msgid "Display video decoder usage in Applications view" #~ msgstr "Показувати використання відео декодувальника у списку додатків" #~ msgid "Display GPU memory usage in Applications view" #~ msgstr "Показувати використання відеопам'яті у списку додатків" #~ msgid "Display process ID in Processes view" #~ msgstr "Показувати ідентифікатор процесу у списку процесів" #~ msgid "Display user name in Processes view" #~ msgstr "Показувати ім'я користувача у списку процесів" #~ msgid "Display memory usage in Processes view" #~ msgstr "Показувати використання оперативної пам'яті у списку процесів" #~ msgid "Display CPU usage in Processes view" #~ msgstr "Показувати використання процесору у списку процесів" #~ msgid "Display drive read speed in Processes view" #~ msgstr "Показувати швидкість читання з диску у списку процесів" #~ msgid "Display drive read total in Processes view" #~ msgstr "Показувати загальне читання з диску у списку процесів" #~ msgid "Display drive write speed in Processes view" #~ msgstr "Показувати швидкість запису на диск у списку процесів" #~ msgid "Display drive write total in Processes view" #~ msgstr "Показувати загальний запис на у списку процесів" #~ msgid "Display GPU usage in Processes view" #~ msgstr "Показувати використання відеокарти у списку процесів" #~ msgid "Display video encoder usage in Processes view" #~ msgstr "Показувати використання відео декодувальника списку процесів" #~ msgid "Display video decoder usage in Processes view" #~ msgstr "Показувати використання відео декодувальника у списку процесів" #~ msgid "Display GPU memory usage in Processes view" #~ msgstr "Показувати використання відеокарти у списку процесів" #~ msgid "Display logical CPU graphs in Processor view" #~ msgstr "" #~ "Показувати графіки використання логічних процесорів у списку процесів" #~ msgid "Show grids in graphs" #~ msgstr "Показувати ґрату на графіку" #~ msgid "Amount of data points that should be shown in a graph" #~ msgstr "Кількість даних які повинні бути видимі на графіку" #~ msgid "Applications" #~ msgstr "Додатки" #~ msgid "Application" #~ msgstr "Назва додатку" #~ msgid "GPU Usage" #~ msgstr "Використання відеокарти" #~ msgid "root" #~ msgstr "root" #~ msgid "End application" #~ msgstr "Завершити додаток" #~ msgid "Kill application" #~ msgstr "Знищити додаток" #~ msgid "Continue application" #~ msgstr "Продовжити додаток" #~ msgctxt "shortcut window" #~ msgid "End Application/Process" #~ msgstr "Завершити додаток/процес" #~ msgctxt "shortcut window" #~ msgid "Kill Application/Process" #~ msgstr "Знищити додаток/процес" #~ msgctxt "shortcut window" #~ msgid "Halt Application/Process" #~ msgstr "Зупинити додаток/процес" #~ msgctxt "shortcut window" #~ msgid "Continue Application/Process" #~ msgstr "Продовжити додаток/процес" #~ msgid "Current Power Cap" #~ msgstr "Поточне обмеження споживання електроенергії" #~ msgid "Monitor your system resources and processes" #~ msgstr "Моніторинг ресурсів і процесів вашої системи" resources-1.9.1/po/uz.po000066400000000000000000001414271510634446000151640ustar00rootroot00000000000000# Uzbek (Latin) translation for resources. # Copyright (C) 2025 resources's COPYRIGHT HOLDER # This file is distributed under the same license as the resources package. # BeMeritus , 2025. # msgid "" msgstr "" "Project-Id-Version: resources main\n" "Report-Msgid-Bugs-To: https://github.com/nokyan/resources/issues/\n" "POT-Creation-Date: 2025-10-13 03:35+0000\n" "PO-Revision-Date: 2025-10-14 13:11+0500\n" "Last-Translator: Baxrom Raxmatov \n" "Language-Team: Uzbek (Latin) \n" "Language: uz\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Poedit 3.5\n" #: data/net.nokyan.Resources.desktop.in.in:2 #: data/net.nokyan.Resources.metainfo.xml.in.in:4 data/resources/ui/window.ui:22 #: src/application.rs:272 msgid "Resources" msgstr "Resurslar" #. Translators: The summary should be 35 characters or less according to Flathub appstream guidelines #: data/net.nokyan.Resources.desktop.in.in:3 #: data/net.nokyan.Resources.metainfo.xml.in.in:5 msgid "Keep an eye on system resources" msgstr "Tizim resurslarini kuzatib boring" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/net.nokyan.Resources.desktop.in.in:9 msgid "System;Resources;Monitor;Processes;Usage;Task;Manager;CPU;RAM;Memory;GPU;" msgstr "Tizim;Resurslar;Monitor;Jarayonlar;Foydalanish;Vazifa;Menejer;CPU;RAM;Xotira;GPU;" #: data/net.nokyan.Resources.metainfo.xml.in.in:17 msgid "" "Resources allows you to check the utilization of your system resources and control your " "running processes and apps. It’s designed to be user-friendly and feel right at home on " "a modern desktop by using GNOME’s libadwaita." msgstr "" "Resurslar dasturi sizga tizim resurslaridan foydalanishni tekshirish hamda ishlayotgan " "jarayon va ilovalaringizni boshqarish imkonini beradi. U GNOME’ning libadwaita " "dasturidan foydalangan holda qulay va zamonaviy ish stolida o‘zingizni uydagidek his " "qilishingiz uchun mo‘ljallangan." #: data/net.nokyan.Resources.metainfo.xml.in.in:20 msgid "Resources supports monitoring the following components:" msgstr "Resurslar quyidagi tarkibiy qismlarni kuzatishni qo‘llab-quvvatlaydi:" #: data/net.nokyan.Resources.metainfo.xml.in.in:24 msgid "CPU" msgstr "CPU" #: data/net.nokyan.Resources.metainfo.xml.in.in:25 #: data/resources/ui/dialogs/app_dialog.ui:82 #: data/resources/ui/dialogs/process_dialog.ui:64 #: data/resources/ui/dialogs/settings_dialog.ui:128 #: data/resources/ui/dialogs/settings_dialog.ui:220 data/resources/ui/window.ui:176 #: data/resources/ui/window.ui:183 src/ui/pages/applications/mod.rs:803 #: src/ui/pages/memory.rs:106 src/ui/pages/memory.rs:192 #: src/ui/pages/processes/mod.rs:1080 msgid "Memory" msgstr "Xotira" #: data/net.nokyan.Resources.metainfo.xml.in.in:26 #: data/resources/ui/dialogs/app_dialog.ui:140 #: data/resources/ui/dialogs/process_dialog.ui:118 #: data/resources/ui/dialogs/settings_dialog.ui:158 #: data/resources/ui/dialogs/settings_dialog.ui:250 src/ui/pages/applications/mod.rs:1181 #: src/ui/pages/gpu.rs:119 src/ui/pages/processes/mod.rs:1470 src/ui/window.rs:468 msgid "GPU" msgstr "GPU" #: data/net.nokyan.Resources.metainfo.xml.in.in:27 #: data/resources/ui/dialogs/settings_dialog.ui:324 msgid "Network Interfaces" msgstr "Tarmoq interfeyslari" #: data/net.nokyan.Resources.metainfo.xml.in.in:28 msgid "Storage Devices" msgstr "Xotira qurilmalari" #: data/net.nokyan.Resources.metainfo.xml.in.in:29 msgid "Batteries" msgstr "Batareyalar" #: data/net.nokyan.Resources.metainfo.xml.in.in:51 msgid "Apps page in light theme" msgstr "Tungi mavzudagi ilovalar sahifasi" #: data/net.nokyan.Resources.metainfo.xml.in.in:55 msgid "Processes page in dark theme" msgstr "Tungi mavzudagi sahifani qayta ishlash" #: data/net.nokyan.Resources.metainfo.xml.in.in:59 msgid "Processor page in light theme" msgstr "Tungi mavzusidagi protsessor sahifasi" #: data/net.nokyan.Resources.metainfo.xml.in.in:63 msgid "Memory page in dark theme" msgstr "Xotira sahifasi tungi mavzuda" #: data/net.nokyan.Resources.metainfo.xml.in.in:67 msgid "GPU page in light theme" msgstr "Tungi mavzusidagi GPU sahifasi" #: data/net.nokyan.Resources.metainfo.xml.in.in:71 msgid "Drive page in dark theme" msgstr "Tungi mavzudagi disk sahifasi" #: data/net.nokyan.Resources.metainfo.xml.in.in:75 msgid "Network Interface page in light theme" msgstr "Tungi mavzusidagi tarmoq interfeysi sahifasi" #: data/net.nokyan.Resources.metainfo.xml.in.in:79 msgid "Battery page in dark theme" msgstr "Tungi mavzudagi batareya sahifasi" #: data/net.nokyan.Resources.policy.in.in:9 msgid "Control Process" msgstr "Boshqaruv jarayoni" #: data/net.nokyan.Resources.policy.in.in:10 msgid "Authentication is required to control superuser’s or other users’ processes" msgstr "" "Super foydalanuvchi yoki boshqa foydalanuvchilarning jarayonlarini boshqarish uchun " "autentifikatsiya talab qilinadi" #: data/resources/ui/dialogs/app_dialog.ui:7 msgid "App Information" msgstr "Ilova haqidagi maʼlumot" #: data/resources/ui/dialogs/app_dialog.ui:70 #: data/resources/ui/dialogs/process_dialog.ui:48 data/resources/ui/pages/battery.ui:22 #: data/resources/ui/pages/cpu.ui:37 data/resources/ui/pages/cpu.ui:50 #: data/resources/ui/pages/drive.ui:22 data/resources/ui/pages/gpu.ui:22 #: data/resources/ui/pages/memory.ui:31 data/resources/ui/pages/network.ui:22 #: data/resources/ui/pages/npu.ui:22 msgid "Usage" msgstr "Foydalanish" #: data/resources/ui/dialogs/app_dialog.ui:73 #: data/resources/ui/dialogs/process_dialog.ui:55 #: data/resources/ui/dialogs/settings_dialog.ui:133 #: data/resources/ui/dialogs/settings_dialog.ui:225 data/resources/ui/window.ui:145 #: data/resources/ui/window.ui:152 src/ui/pages/applications/mod.rs:862 #: src/ui/pages/cpu.rs:128 src/ui/pages/processes/mod.rs:1139 src/ui/window.rs:290 msgid "Processor" msgstr "Protsessor" #: data/resources/ui/dialogs/app_dialog.ui:91 #: data/resources/ui/dialogs/process_dialog.ui:73 #: data/resources/ui/dialogs/settings_dialog.ui:178 #: data/resources/ui/dialogs/settings_dialog.ui:290 src/ui/pages/applications/mod.rs:1420 #: src/ui/pages/memory.rs:198 src/ui/pages/processes/mod.rs:1955 msgid "Swap" msgstr "Svap" #: data/resources/ui/dialogs/app_dialog.ui:100 #: data/resources/ui/dialogs/process_dialog.ui:78 #: data/resources/ui/dialogs/settings_dialog.ui:138 #: data/resources/ui/dialogs/settings_dialog.ui:230 src/ui/pages/applications/mod.rs:926 #: src/ui/pages/processes/mod.rs:1203 msgid "Drive Read" msgstr "Diskni o‘qish" #: data/resources/ui/dialogs/app_dialog.ui:109 #: data/resources/ui/dialogs/process_dialog.ui:87 #: data/resources/ui/dialogs/settings_dialog.ui:143 #: data/resources/ui/dialogs/settings_dialog.ui:235 src/ui/pages/applications/mod.rs:991 #: src/ui/pages/processes/mod.rs:1270 msgid "Drive Read Total" msgstr "Jami diskdagi o‘qishlar soni" #: data/resources/ui/dialogs/app_dialog.ui:118 #: data/resources/ui/dialogs/process_dialog.ui:96 #: data/resources/ui/dialogs/settings_dialog.ui:148 #: data/resources/ui/dialogs/settings_dialog.ui:240 src/ui/pages/applications/mod.rs:1052 #: src/ui/pages/processes/mod.rs:1337 msgid "Drive Write" msgstr "Diskga yozish" #: data/resources/ui/dialogs/app_dialog.ui:127 #: data/resources/ui/dialogs/process_dialog.ui:105 #: data/resources/ui/dialogs/settings_dialog.ui:153 #: data/resources/ui/dialogs/settings_dialog.ui:245 src/ui/pages/applications/mod.rs:1119 #: src/ui/pages/processes/mod.rs:1404 msgid "Drive Write Total" msgstr "Jami disk yozuvi" #: data/resources/ui/dialogs/app_dialog.ui:149 #: data/resources/ui/dialogs/process_dialog.ui:127 #: data/resources/ui/dialogs/settings_dialog.ui:163 #: data/resources/ui/dialogs/settings_dialog.ui:255 src/ui/pages/applications/mod.rs:1361 #: src/ui/pages/processes/mod.rs:1651 msgid "Video Memory" msgstr "Video xotira" #: data/resources/ui/dialogs/app_dialog.ui:158 #: data/resources/ui/dialogs/process_dialog.ui:136 #: data/resources/ui/dialogs/settings_dialog.ui:168 #: data/resources/ui/dialogs/settings_dialog.ui:260 src/ui/pages/applications/mod.rs:1240 #: src/ui/pages/processes/mod.rs:1529 msgid "Video Encoder" msgstr "Videoni shifrlovchi" #: data/resources/ui/dialogs/app_dialog.ui:167 #: data/resources/ui/dialogs/process_dialog.ui:145 #: data/resources/ui/dialogs/settings_dialog.ui:173 #: data/resources/ui/dialogs/settings_dialog.ui:265 src/ui/pages/applications/mod.rs:1301 #: src/ui/pages/processes/mod.rs:1590 msgid "Video Decoder" msgstr "Video dekodlovchi" #: data/resources/ui/dialogs/app_dialog.ui:174 #: data/resources/ui/dialogs/process_dialog.ui:179 data/resources/ui/pages/battery.ui:33 #: data/resources/ui/pages/cpu.ui:83 data/resources/ui/pages/drive.ui:54 #: data/resources/ui/pages/gpu.ui:74 data/resources/ui/pages/memory.ui:42 #: data/resources/ui/pages/network.ui:51 data/resources/ui/pages/npu.ui:68 msgid "Properties" msgstr "Xususiyatlar" #: data/resources/ui/dialogs/app_dialog.ui:180 msgid "ID" msgstr "ID" #: data/resources/ui/dialogs/app_dialog.ui:190 #: data/resources/ui/dialogs/process_dialog.ui:195 msgid "Running Since" msgstr "Shuncha vaqtdan beri ishlayapti" #: data/resources/ui/dialogs/app_dialog.ui:198 msgid "Running Processes" msgstr "Jarayonlari Ishga tushirish" #: data/resources/ui/dialogs/app_dialog.ui:207 #: data/resources/ui/dialogs/process_dialog.ui:231 msgid "Containerized" msgstr "Konteynerlangan" #: data/resources/ui/dialogs/process_dialog.ui:7 msgid "Process Information" msgstr "Jarayon haqida ma’lumot" #: data/resources/ui/dialogs/process_dialog.ui:154 #: data/resources/ui/dialogs/settings_dialog.ui:270 src/ui/pages/processes/mod.rs:1711 msgid "Total CPU Time" msgstr "Umumiy CPU vaqti" #: data/resources/ui/dialogs/process_dialog.ui:163 #: data/resources/ui/dialogs/settings_dialog.ui:275 src/ui/pages/processes/mod.rs:1770 msgid "User CPU Time" msgstr "Foydalanuvchining CPU vaqti" #: data/resources/ui/dialogs/process_dialog.ui:172 #: data/resources/ui/dialogs/settings_dialog.ui:280 src/ui/pages/processes/mod.rs:1829 msgid "System CPU Time" msgstr "Tizim CPU vaqti" #: data/resources/ui/dialogs/process_dialog.ui:186 #: data/resources/ui/dialogs/settings_dialog.ui:210 src/ui/pages/processes/mod.rs:973 msgid "Process ID" msgstr "Jarayon identifikatori (ID)" #: data/resources/ui/dialogs/process_dialog.ui:204 #: data/resources/ui/dialogs/settings_dialog.ui:300 src/ui/pages/processes/mod.rs:2075 msgid "Commandline" msgstr "Buyruq satri" #: data/resources/ui/dialogs/process_dialog.ui:213 #: data/resources/ui/dialogs/settings_dialog.ui:215 src/ui/pages/processes/mod.rs:1026 msgid "User" msgstr "Foydalanuvchi" #: data/resources/ui/dialogs/process_dialog.ui:222 msgid "Control Group" msgstr "Nazorat guruhi" #: data/resources/ui/dialogs/process_options_dialog.ui:7 #: data/resources/ui/dialogs/process_options_dialog.ui:69 msgid "Process Options" msgstr "Jarayon sozlamalari" #: data/resources/ui/dialogs/process_options_dialog.ui:29 msgid "Apply" msgstr "Qoʻllash" #: data/resources/ui/dialogs/process_options_dialog.ui:72 #, fuzzy msgid "Niceness" msgstr "Xushmuomalalik" #: data/resources/ui/dialogs/process_options_dialog.ui:73 msgid "" "The priority of a process is given by its niceness. A lower niceness value correspond " "to a higher priority." msgstr "" #: data/resources/ui/dialogs/process_options_dialog.ui:87 #: data/resources/ui/dialogs/settings_dialog.ui:285 src/ui/pages/processes/mod.rs:1888 msgid "Priority" msgstr "Ustuvorlik" #: data/resources/ui/dialogs/process_options_dialog.ui:91 msgctxt "process priority" msgid "Very High" msgstr "Juda yuqori" #: data/resources/ui/dialogs/process_options_dialog.ui:92 msgctxt "process priority" msgid "High" msgstr "Yuqori" #: data/resources/ui/dialogs/process_options_dialog.ui:93 msgctxt "process priority" msgid "Normal" msgstr "Oddiy" #: data/resources/ui/dialogs/process_options_dialog.ui:94 msgctxt "process priority" msgid "Low" msgstr "Past" #: data/resources/ui/dialogs/process_options_dialog.ui:95 msgctxt "process priority" msgid "Very Low" msgstr "Juda past" #: data/resources/ui/dialogs/process_options_dialog.ui:103 msgid "Processor Affinity" msgstr "Protsessor yaqinligi" #: data/resources/ui/dialogs/process_options_dialog.ui:108 msgid "Toggle All" msgstr "Barchasini almashtirish" #: data/resources/ui/dialogs/process_options_dialog.ui:111 msgid "Select which processor cores the process is allowed to run on" msgstr "" "Jarayonni qaysi protsessor yadrolarida ishga tushirishga ruxsat berilganini tanlang" #: data/resources/ui/dialogs/settings_dialog.ui:7 msgid "General" msgstr "Umumiy" #: data/resources/ui/dialogs/settings_dialog.ui:10 msgid "Units" msgstr "Birliklar" #: data/resources/ui/dialogs/settings_dialog.ui:13 msgid "Data Unit Prefix" msgstr "Ma’lumotlar birligi prefiksi" #: data/resources/ui/dialogs/settings_dialog.ui:17 msgid "Decimal" msgstr "O‘nlik" #: data/resources/ui/dialogs/settings_dialog.ui:18 msgid "Binary" msgstr "Ikkilik" #: data/resources/ui/dialogs/settings_dialog.ui:26 msgid "Show Network Speeds in Bits per Second" msgstr "Tarmoq tezligini soniyasiga bitlarda ko‘rsatish" #: data/resources/ui/dialogs/settings_dialog.ui:31 msgid "Temperature Unit" msgstr "Harorat birligi" #: data/resources/ui/dialogs/settings_dialog.ui:35 msgid "Celsius" msgstr "Selsiy" #: data/resources/ui/dialogs/settings_dialog.ui:36 msgid "Kelvin" msgstr "Kelvin" #: data/resources/ui/dialogs/settings_dialog.ui:37 msgid "Fahrenheit" msgstr "Farengeyt" #: data/resources/ui/dialogs/settings_dialog.ui:47 msgid "User Interface" msgstr "Foydalanuvchi interfeysi" #: data/resources/ui/dialogs/settings_dialog.ui:50 msgid "Refresh Speed" msgstr "Yangilash tezligi" #: data/resources/ui/dialogs/settings_dialog.ui:51 msgid "Higher refresh speeds can lead to higher processor usage" msgstr "Yuqori yangilash tezligi protsessor sarfining oshishiga olib kelishi mumkin" #: data/resources/ui/dialogs/settings_dialog.ui:55 msgctxt "UI refresh speed" msgid "Very Slow" msgstr "Juda sekin" #: data/resources/ui/dialogs/settings_dialog.ui:56 msgctxt "UI refresh speed" msgid "Slow" msgstr "Sekin" #: data/resources/ui/dialogs/settings_dialog.ui:57 msgctxt "UI refresh speed" msgid "Normal" msgstr "Oddiy" #: data/resources/ui/dialogs/settings_dialog.ui:58 msgctxt "UI refresh speed" msgid "Fast" msgstr "Tez" #: data/resources/ui/dialogs/settings_dialog.ui:59 msgctxt "UI refresh speed" msgid "Very Fast" msgstr "Juda tez" #: data/resources/ui/dialogs/settings_dialog.ui:67 msgid "Show Graph Grids" msgstr "Grafik panjaralarni ko‘rsatish" #: data/resources/ui/dialogs/settings_dialog.ui:72 msgid "Graph Data Points" msgstr "Grafik ma’lumotlari ballari" #: data/resources/ui/dialogs/settings_dialog.ui:86 msgid "Show Usage Details in Sidebar" msgstr "Foydalanish tafsilotlarini yon panelda chiqarish" #: data/resources/ui/dialogs/settings_dialog.ui:87 msgid "If enabled, the usage along with other information will be displayed" msgstr "Bu yoqilsa, foydalanish va boshqa axborotlar ko‘rsatiladi" #: data/resources/ui/dialogs/settings_dialog.ui:92 msgid "Show Device Descriptions in Sidebar" msgstr "Qurilma tavsiflarini yon panelda chiqarish" #: data/resources/ui/dialogs/settings_dialog.ui:93 msgid "If enabled, a device identifier like its name or device type will be displayed" msgstr "Bu yoqilsa, nomi yoki qurilma turi kabi qurilma identifikatori ko‘rsatiladi" #: data/resources/ui/dialogs/settings_dialog.ui:98 msgid "Sidebar Meter Type" msgstr "Yon panel hisoblagichi turi" #: data/resources/ui/dialogs/settings_dialog.ui:102 msgid "Bar" msgstr "Panel" #: data/resources/ui/dialogs/settings_dialog.ui:103 msgid "Graph" msgstr "Grafik" #: data/resources/ui/dialogs/settings_dialog.ui:111 msgid "Normalize Processor Usage" msgstr "Protsessordan foydalanishni normallashtirish" #: data/resources/ui/dialogs/settings_dialog.ui:112 msgid "If enabled, the total usage of all cores will be divided by the amount of cores" msgstr "Bu yoqilsa, jami ishlatilgan barcha yadrolar yadrolar soniga bo‘linadi" #: data/resources/ui/dialogs/settings_dialog.ui:122 data/resources/ui/window.ui:65 #: data/resources/ui/window.ui:72 src/ui/pages/applications/mod.rs:131 msgid "Apps" msgstr "Ilovalar" #: data/resources/ui/dialogs/settings_dialog.ui:125 #: data/resources/ui/dialogs/settings_dialog.ui:207 msgid "Information Columns" msgstr "Axborot ustunlari" #: data/resources/ui/dialogs/settings_dialog.ui:183 #: data/resources/ui/dialogs/settings_dialog.ui:295 src/ui/pages/applications/mod.rs:1479 #: src/ui/pages/processes/mod.rs:2014 msgid "Combined Memory" msgstr "Kombinatsiyalangan xotira" #: data/resources/ui/dialogs/settings_dialog.ui:193 data/resources/ui/window.ui:105 #: data/resources/ui/window.ui:112 src/ui/pages/processes/mod.rs:175 msgid "Processes" msgstr "Jarayonlar" #: data/resources/ui/dialogs/settings_dialog.ui:196 data/resources/ui/pages/cpu.ui:22 #: data/resources/ui/pages/processes.ui:56 msgid "Options" msgstr "Parametrlar" #: data/resources/ui/dialogs/settings_dialog.ui:199 msgid "Show Niceness Values" msgstr "" #: data/resources/ui/dialogs/settings_dialog.ui:200 msgid "Display priorities as niceness to allow for more fine-grained adjustments" msgstr "" #: data/resources/ui/dialogs/settings_dialog.ui:310 msgid "Devices" msgstr "Qurilmalar" #: data/resources/ui/dialogs/settings_dialog.ui:313 msgid "Drives" msgstr "Drayvlar" #: data/resources/ui/dialogs/settings_dialog.ui:316 msgid "Show Virtual Drives" msgstr "Virtual disklarni ko‘rsatish" #: data/resources/ui/dialogs/settings_dialog.ui:317 msgid "Virtual drives are for example ZFS volumes or mapped devices" msgstr "Virtual disklar, masalan, ZFS hajmlari yoki xaritalangan qurilmalardir" #: data/resources/ui/dialogs/settings_dialog.ui:327 msgid "Show Virtual Network Interfaces" msgstr "Virtual tarmoq interfeyslarini ko‘rsatish" #: data/resources/ui/dialogs/settings_dialog.ui:328 msgid "Virtual network interfaces are for example bridges or VPN tunnels" msgstr "Virtual tarmoq interfeyslari, masalan, ko‘priklar yoki VPN tunnellari" #: data/resources/ui/pages/applications.ui:6 data/resources/ui/pages/applications.ui:26 #: src/ui/pages/applications/mod.rs:1563 msgid "Kill App" msgstr "Ilovani to'xtatish" #: data/resources/ui/pages/applications.ui:10 data/resources/ui/pages/applications.ui:30 #: src/ui/pages/applications/mod.rs:1562 msgid "Halt App" msgstr "Ilovani to‘xtatish" #: data/resources/ui/pages/applications.ui:14 data/resources/ui/pages/applications.ui:34 #: src/ui/pages/applications/mod.rs:1564 msgid "Continue App" msgstr "Ilovani davom ettirish" #: data/resources/ui/pages/applications.ui:22 data/resources/ui/pages/applications.ui:98 #: src/ui/pages/applications/mod.rs:1561 msgid "End App" msgstr "Ilovani tugatish" #: data/resources/ui/pages/applications.ui:40 data/resources/ui/pages/processes.ui:62 msgid "Information" msgstr "Maʼlumot" #: data/resources/ui/pages/applications.ui:57 msgid "Search applications" msgstr "Ilovalarni qidirish" #: data/resources/ui/pages/applications.ui:87 data/resources/ui/pages/applications.ui:89 msgid "Show App Information" msgstr "Ilova haqidagi axborotni chiqarish" #: data/resources/ui/pages/battery.ui:36 msgid "Battery Health" msgstr "Batareya holati" #: data/resources/ui/pages/battery.ui:45 msgid "Design Capacity" msgstr "Loyihaviy quvvat" #: data/resources/ui/pages/battery.ui:54 msgid "Charge Cycles" msgstr "Zaryad sikllari" #: data/resources/ui/pages/battery.ui:63 msgid "Technology" msgstr "Texnologiya" #: data/resources/ui/pages/battery.ui:72 data/resources/ui/pages/gpu.ui:81 #: data/resources/ui/pages/network.ui:58 data/resources/ui/pages/npu.ui:75 msgid "Manufacturer" msgstr "Ishlab chiqaruvchi" #: data/resources/ui/pages/battery.ui:81 msgid "Model Name" msgstr "Model nomi" #: data/resources/ui/pages/battery.ui:90 data/resources/ui/pages/drive.ui:66 msgid "Device" msgstr "Qurilma" #: data/resources/ui/pages/cpu.ui:26 msgid "Show Usages of Logical CPUs" msgstr "Protsessorlardan foydalanishni ko‘rsatish" #: data/resources/ui/pages/cpu.ui:75 data/resources/ui/pages/gpu.ui:66 #: data/resources/ui/pages/npu.ui:60 msgid "Sensors" msgstr "Sensorlar" #: data/resources/ui/pages/cpu.ui:90 msgid "Max Frequency" msgstr "Maksimal chastota" #: data/resources/ui/pages/cpu.ui:99 msgid "Logical Cores" msgstr "Mantiqiy yadrolar" #: data/resources/ui/pages/cpu.ui:108 msgid "Physical Cores" msgstr "Fizik yadrolar" #: data/resources/ui/pages/cpu.ui:117 msgid "Sockets" msgstr "Rozetkalar" #: data/resources/ui/pages/cpu.ui:126 msgid "Uptime" msgstr "Ish vaqti" #: data/resources/ui/pages/cpu.ui:135 msgid "Virtualization" msgstr "Virtualizatsiya" #: data/resources/ui/pages/cpu.ui:144 msgid "Architecture" msgstr "Me’morchilik" #: data/resources/ui/pages/drive.ui:38 msgid "Total Read" msgstr "Jami oʼqish" #: data/resources/ui/pages/drive.ui:47 msgid "Total Written" msgstr "Jami yozilgan" #: data/resources/ui/pages/drive.ui:57 data/resources/ui/pages/memory.ui:72 msgid "Type" msgstr "Turi" #: data/resources/ui/pages/drive.ui:75 msgid "Capacity" msgstr "Quvvat" #: data/resources/ui/pages/drive.ui:84 msgid "Writable" msgstr "Yozishga qodir" #: data/resources/ui/pages/drive.ui:93 msgid "Removable" msgstr "Olinadigan" #. Translators: "Link" refers to something like "PCIe 4.0 ×16" #: data/resources/ui/pages/drive.ui:102 data/resources/ui/pages/gpu.ui:113 #: data/resources/ui/pages/network.ui:103 data/resources/ui/pages/npu.ui:107 msgid "Link" msgstr "Havola" #: data/resources/ui/pages/gpu.ui:37 msgid "GPU Frequency" msgstr "GPU chastotasi" #: data/resources/ui/pages/gpu.ui:50 msgid "Video Memory Frequency" msgstr "Video xotira chastotasi" #: data/resources/ui/pages/gpu.ui:55 data/resources/ui/pages/npu.ui:49 #: src/ui/pages/battery.rs:217 msgid "Power Usage" msgstr "Quvvat sarfi" #: data/resources/ui/pages/gpu.ui:90 data/resources/ui/pages/npu.ui:84 msgid "PCI Slot" msgstr "PCI sloti" #: data/resources/ui/pages/gpu.ui:99 data/resources/ui/pages/network.ui:67 #: data/resources/ui/pages/npu.ui:93 msgid "Driver Used" msgstr "Drayver ishlatildi" #: data/resources/ui/pages/gpu.ui:108 data/resources/ui/pages/npu.ui:102 msgid "Max Power Cap" msgstr "Maksimal quvvat qopqog‘i" #: data/resources/ui/pages/memory.ui:9 msgid "You need to authenticate to see memory properties" msgstr "Xotira xususiyatlarini ko‘rish uchun autentifikatsiya qilishingiz kerak" #: data/resources/ui/pages/memory.ui:10 msgid "Authenticate" msgstr "Haqiqiylikni tasdiqlash" #: data/resources/ui/pages/memory.ui:45 msgid "Slots Used" msgstr "Ishlatilgan slotlar" #: data/resources/ui/pages/memory.ui:54 msgid "Speed" msgstr "Tezlik" #: data/resources/ui/pages/memory.ui:63 msgid "Form Factor" msgstr "Shakl omili" #: data/resources/ui/pages/memory.ui:81 msgid "Type Detail" msgstr "Turi tafsiloti" #: data/resources/ui/pages/network.ui:35 msgid "Total Received" msgstr "Jami qabul qilingan" #: data/resources/ui/pages/network.ui:44 msgid "Total Sent" msgstr "Jami yuborilgan" #: data/resources/ui/pages/network.ui:76 msgid "Interface" msgstr "Interfeys" #: data/resources/ui/pages/network.ui:85 msgid "Hardware Address" msgstr "Uskuna manzili" #: data/resources/ui/pages/network.ui:94 msgid "Network Name" msgstr "Tarmoq nomi" #: data/resources/ui/pages/network.ui:112 msgid "Link Speed" msgstr "Ulanish tezligi" #: data/resources/ui/pages/npu.ui:31 msgid "NPU Frequency" msgstr "NPU chastotasi" #: data/resources/ui/pages/npu.ui:44 msgid "Memory Frequency" msgstr "Xotira chastotasi" #: data/resources/ui/pages/processes.ui:6 data/resources/ui/pages/processes.ui:42 #: src/ui/pages/processes/mod.rs:2184 msgid "Kill Process" msgstr "To'xtatish jarayoni" #: data/resources/ui/pages/processes.ui:10 data/resources/ui/pages/processes.ui:46 #: src/ui/pages/processes/mod.rs:2183 msgid "Halt Process" msgstr "Jarayonni to‘xtatish" #: data/resources/ui/pages/processes.ui:14 data/resources/ui/pages/processes.ui:50 #: src/ui/pages/processes/mod.rs:2185 msgid "Continue Process" msgstr "Jarayonni davom ettirish" #: data/resources/ui/pages/processes.ui:22 data/resources/ui/pages/processes.ui:74 msgid "Kill Processes" msgstr "To'xtatish jarayonlari" #: data/resources/ui/pages/processes.ui:26 data/resources/ui/pages/processes.ui:78 msgid "Halt Processes" msgstr "Jarayonlarni to‘xtatish" #: data/resources/ui/pages/processes.ui:30 data/resources/ui/pages/processes.ui:82 msgid "Continue Processes" msgstr "Jarayonlarni davom ettirish" #: data/resources/ui/pages/processes.ui:38 data/resources/ui/pages/processes.ui:157 #: src/ui/pages/processes/mod.rs:524 src/ui/pages/processes/mod.rs:2182 msgid "End Process" msgstr "Jarayonni yakunlash" #: data/resources/ui/pages/processes.ui:70 src/ui/pages/processes/mod.rs:528 msgid "End Processes" msgstr "Jarayonlarni tugatish" #: data/resources/ui/pages/processes.ui:103 msgid "Search processes" msgstr "Qidiruv jarayonlari" #: data/resources/ui/pages/processes.ui:133 data/resources/ui/pages/processes.ui:135 msgid "Show Process Options" msgstr "Jarayon parametrlarini ko‘rsatish" #: data/resources/ui/pages/processes.ui:146 data/resources/ui/pages/processes.ui:148 msgid "Show Process Information" msgstr "Jarayon haqidagi axborotni chiqarish" #: data/resources/ui/shortcuts.ui:6 msgctxt "shortcut window" msgid "General" msgstr "Umumiy" #: data/resources/ui/shortcuts.ui:9 msgctxt "shortcut window" msgid "Preferences" msgstr "Afzalliklar" #: data/resources/ui/shortcuts.ui:15 msgctxt "shortcut window" msgid "Show Shortcuts" msgstr "Yorliqlarni koʼrsatish" #: data/resources/ui/shortcuts.ui:21 msgctxt "shortcut window" msgid "Quit" msgstr "Chiqish" #: data/resources/ui/shortcuts.ui:29 msgctxt "shortcut window" msgid "Apps/Processes" msgstr "Ilovalar/jarayonlar" #: data/resources/ui/shortcuts.ui:32 msgctxt "shortcut window" msgid "Toggle Search Field" msgstr "Qidiruv maydonini almashtirish" #: data/resources/ui/shortcuts.ui:38 msgctxt "shortcut window" msgid "End App/Process" msgstr "Ilova/jarayonni yakunlash" #: data/resources/ui/shortcuts.ui:44 msgctxt "shortcut window" msgid "Kill App/Process" msgstr "Kill ilovasi/jarayoni" #: data/resources/ui/shortcuts.ui:50 msgctxt "shortcut window" msgid "Halt App/Process" msgstr "Ilova/jarayonni to‘xtatish" #: data/resources/ui/shortcuts.ui:56 msgctxt "shortcut window" msgid "Continue App/Process" msgstr "Ilova/jarayonni davom ettirish" #: data/resources/ui/shortcuts.ui:62 msgctxt "shortcut window" msgid "Show Information for App/Process" msgstr "Ilova/jarayon uchun axborotni chiqarish" #: data/resources/ui/shortcuts.ui:68 msgctxt "shortcut window" msgid "Show Process Options" msgstr "Jarayon parametrlarini ko‘rsatish" #: data/resources/ui/window.ui:6 msgid "Preferences" msgstr "Afzalliklar" #: data/resources/ui/window.ui:10 msgid "Keyboard Shortcuts" msgstr "Klaviatura yorliqlari" #: data/resources/ui/window.ui:14 msgid "About Resources" msgstr "Resurslar haqida" #: data/resources/ui/window.ui:88 data/resources/ui/window.ui:128 msgid "Search" msgstr "Qidirish" #: data/resources/ui/window.ui:90 data/resources/ui/window.ui:130 msgid "Toggle search field" msgstr "Qidiruv maydonini almashtirish" #: src/application.rs:274 msgid "The Nalux Team" msgstr "Nalux jamoasi" #: src/application.rs:282 msgid "Report Issues" msgstr "Hisobot muammolari" #. Translator credits. Replace "translator-credits" with your name/username, and optionally an email or URL. #. One name per line, please do not remove previous names. #: src/application.rs:288 msgid "translator-credits" msgstr "" "BeMeritus \n" "Baxrom Raxmatov" #: src/application.rs:289 msgid "Icon by" msgstr "Belgi" #: src/ui/dialogs/app_dialog.rs:155 src/ui/dialogs/process_dialog.rs:133 #: src/ui/dialogs/process_dialog.rs:137 src/ui/dialogs/process_dialog.rs:146 #: src/ui/dialogs/process_dialog.rs:148 src/ui/dialogs/process_dialog.rs:171 #: src/ui/dialogs/process_dialog.rs:178 src/ui/dialogs/process_dialog.rs:185 #: src/ui/dialogs/process_dialog.rs:192 src/ui/pages/applications/mod.rs:948 #: src/ui/pages/applications/mod.rs:1074 src/ui/pages/battery.rs:205 #: src/ui/pages/battery.rs:225 src/ui/pages/battery.rs:231 src/ui/pages/battery.rs:234 #: src/ui/pages/battery.rs:265 src/ui/pages/battery.rs:289 src/ui/pages/battery.rs:291 #: src/ui/pages/battery.rs:301 src/ui/pages/cpu.rs:243 src/ui/pages/cpu.rs:258 #: src/ui/pages/cpu.rs:278 src/ui/pages/cpu.rs:284 src/ui/pages/cpu.rs:290 #: src/ui/pages/cpu.rs:296 src/ui/pages/cpu.rs:300 src/ui/pages/cpu.rs:303 #: src/ui/pages/cpu.rs:341 src/ui/pages/cpu.rs:448 src/ui/pages/drive.rs:319 #: src/ui/pages/drive.rs:350 src/ui/pages/drive.rs:352 src/ui/pages/drive.rs:381 #: src/ui/pages/drive.rs:383 src/ui/pages/drive.rs:399 src/ui/pages/drive.rs:400 #: src/ui/pages/drive.rs:407 src/ui/pages/drive.rs:417 src/ui/pages/drive.rs:427 #: src/ui/pages/drive.rs:433 src/ui/pages/gpu.rs:245 src/ui/pages/gpu.rs:252 #: src/ui/pages/gpu.rs:297 src/ui/pages/gpu.rs:322 src/ui/pages/gpu.rs:325 #: src/ui/pages/gpu.rs:336 src/ui/pages/gpu.rs:377 src/ui/pages/gpu.rs:384 #: src/ui/pages/gpu.rs:396 src/ui/pages/gpu.rs:403 src/ui/pages/gpu.rs:407 #: src/ui/pages/gpu.rs:437 src/ui/pages/gpu.rs:443 src/ui/pages/memory.rs:227 #: src/ui/pages/memory.rs:228 src/ui/pages/memory.rs:232 src/ui/pages/memory.rs:233 #: src/ui/pages/memory.rs:237 src/ui/pages/memory.rs:238 src/ui/pages/memory.rs:266 #: src/ui/pages/memory.rs:327 src/ui/pages/network.rs:252 src/ui/pages/network.rs:259 #: src/ui/pages/network.rs:266 src/ui/pages/network.rs:272 src/ui/pages/network.rs:275 #: src/ui/pages/network.rs:285 src/ui/pages/network.rs:292 src/ui/pages/network.rs:302 #: src/ui/pages/network.rs:370 src/ui/pages/network.rs:373 src/ui/pages/network.rs:375 #: src/ui/pages/network.rs:404 src/ui/pages/network.rs:407 src/ui/pages/network.rs:409 #: src/ui/pages/network.rs:417 src/ui/pages/network.rs:424 src/ui/pages/network.rs:434 #: src/ui/pages/processes/mod.rs:1225 src/ui/pages/processes/mod.rs:1292 #: src/ui/pages/processes/mod.rs:1359 src/ui/pages/processes/mod.rs:1426 #: src/ui/pages/processes/mod.rs:1912 src/ui/pages/processes/mod.rs:1914 #: src/utils/battery.rs:152 src/utils/drive.rs:137 src/utils/gpu/mod.rs:279 #: src/utils/gpu/mod.rs:291 src/utils/link/mod.rs:61 src/utils/npu/mod.rs:244 #: src/utils/npu/mod.rs:250 msgid "N/A" msgstr "M/E" #: src/ui/dialogs/process_options_dialog.rs:147 src/ui/pages/cpu.rs:257 #: src/ui/pages/cpu.rs:417 src/ui/pages/cpu.rs:421 msgid "CPU {}" msgstr "CPU {}" #: src/ui/pages/applications/application_entry.rs:190 src/ui/pages/drive.rs:414 #: src/ui/pages/drive.rs:424 src/ui/pages/processes/process_entry.rs:211 msgid "No" msgstr "Yo‘q" #: src/ui/pages/applications/application_entry.rs:191 #: src/ui/pages/processes/process_entry.rs:212 msgid "Yes (Flatpak)" msgstr "Ha (Flatpak)" #: src/ui/pages/applications/application_entry.rs:192 #: src/ui/pages/processes/process_entry.rs:213 msgid "Yes (Snap)" msgstr "Ha (Snap)" #: src/ui/pages/applications/mod.rs:660 msgid "Running Apps: {}" msgstr "Ishlayotgan ilovalar: {}" #: src/ui/pages/applications/mod.rs:700 src/ui/pages/processes/mod.rs:863 msgid "Cancel" msgstr "Bekor qilish" #: src/ui/pages/applications/mod.rs:746 msgid "App" msgstr "Ilova" #: src/ui/pages/applications/mod.rs:1539 src/ui/pages/processes/mod.rs:2131 msgid "End {}?" msgstr "{} tugallansinmi?" #: src/ui/pages/applications/mod.rs:1540 src/ui/pages/processes/mod.rs:2132 msgid "Halt {}?" msgstr "{} to‘xtatilsinmi?" #: src/ui/pages/applications/mod.rs:1541 src/ui/pages/processes/mod.rs:2133 msgid "Kill {}?" msgstr "{} to‘xtatilsinmi?" #: src/ui/pages/applications/mod.rs:1542 src/ui/pages/processes/mod.rs:2134 msgid "Continue {}?" msgstr "{} davom ettirilsinmi?" #: src/ui/pages/applications/mod.rs:1548 src/ui/pages/processes/mod.rs:2169 msgid "Unsaved work might be lost." msgstr "Saqlanmagan ish yo‘qolishi mumkin." #: src/ui/pages/applications/mod.rs:1550 msgid "" "Halting an app can come with serious risks such as losing data and security " "implications. Use with caution." msgstr "" "Ilovani to‘xtatish ma’lumotlar va xavfsizlik oqibatlarini yo‘qotish kabi jiddiy " "xavflarni keltirib chiqarishi mumkin. Ehtiyotkorlik bilan foydalaning." #: src/ui/pages/applications/mod.rs:1553 msgid "" "Killing an app can come with serious risks such as losing data and security " "implications. Use with caution." msgstr "" "Ilovani oʻchirish ma’lumotlar va xavfsizlik oqibatlarini yo‘qotish kabi jiddiy " "xavflarni keltirib chiqarishi mumkin. Ehtiyotkorlik bilan foydalaning." #: src/ui/pages/battery.rs:102 src/utils/battery.rs:258 msgid "Battery" msgstr "Batareya" #: src/ui/pages/battery.rs:210 msgid "Battery Charge" msgstr "Batareyani zaryadlash" #: src/ui/pages/battery.rs:279 src/ui/pages/cpu.rs:438 src/ui/pages/drive.rs:344 #: src/ui/pages/drive.rs:375 src/ui/pages/gpu.rs:429 src/ui/pages/network.rs:362 #: src/ui/pages/network.rs:396 msgid "Highest:" msgstr "Eng yuqori:" #: src/ui/pages/cpu.rs:242 src/ui/pages/gpu.rs:212 msgid "Total Usage" msgstr "Umumiy foydalanish" #: src/ui/pages/cpu.rs:271 src/ui/pages/gpu.rs:239 msgid "Temperature" msgstr "Harorat birligi" #: src/ui/pages/drive.rs:126 msgid "Drive" msgstr "Disk" #: src/ui/pages/drive.rs:236 msgid "Drive Activity" msgstr "Disk faoliyati" #: src/ui/pages/drive.rs:243 msgid "Read Speed" msgstr "O‘qish tezligi" #: src/ui/pages/drive.rs:247 msgid "Write Speed" msgstr "Yozish tezligi" #: src/ui/pages/drive.rs:412 src/ui/pages/drive.rs:422 msgid "Yes" msgstr "Xa" #. Translators: This is an abbreviation for "Read" and "Write". This is displayed in the sidebar so your #. translation should preferably be quite short or an abbreviation #: src/ui/pages/drive.rs:440 msgid "R: {} · W: {}" msgstr "O‘: {} · Y: {}" #: src/ui/pages/gpu.rs:220 msgid "Video Encoder/Decoder Usage" msgstr "Video kodlovchi/dekoderdan foydalanish" #: src/ui/pages/gpu.rs:226 msgid "Video Encoder Usage" msgstr "Video kodlovchidan foydalanish" #: src/ui/pages/gpu.rs:231 msgid "Video Decoder Usage" msgstr "Video dekoderdan foydalanish" #: src/ui/pages/gpu.rs:236 msgid "Video Memory Usage" msgstr "Video xotiradan foydalanish" #. Translators: This will be displayed in the sidebar, please try to keep your translation as short as (or even #. shorter than) 'Memory' #: src/ui/pages/gpu.rs:415 msgid "Memory: {}" msgstr "Xotira: {}" #: src/ui/pages/memory.rs:262 msgid "{} of {}" msgstr "{} / {}" #: src/ui/pages/memory.rs:265 msgid "{} MT/s" msgstr "{} MT/s" #. Translators: This will be displayed in the sidebar, so your translation for "Swap" should #. preferably be quite short or an abbreviation #: src/ui/pages/memory.rs:346 msgid "{} / {} · Swap: {} %" msgstr "{} / {} · Svap: {}%" #: src/ui/pages/network.rs:127 src/utils/network.rs:135 msgid "Network Interface" msgstr "Tarmoq interfeysi" #: src/ui/pages/network.rs:241 msgid "Receiving" msgstr "Qabul qilish" #: src/ui/pages/network.rs:245 msgid "Sending" msgstr "Yuborilmoqda" #. Translators: This is an abbreviation for "Receive" and "Send". This is displayed in the sidebar so #. your translation should preferably be quite short or an abbreviation #: src/ui/pages/network.rs:445 msgid "R: {} · S: {}" msgstr "Q: {} · Y: {}" #: src/ui/pages/processes/mod.rs:814 msgid "Running Processes: {}" msgstr "Ishga tushirish jarayonlari: {}" #: src/ui/pages/processes/mod.rs:912 msgid "Process" msgstr "Jarayon" #: src/ui/pages/processes/mod.rs:2141 msgid "End process?" msgid_plural "End {} processes?" msgstr[0] "Jarayon yakunlansinmi?" #: src/ui/pages/processes/mod.rs:2147 msgid "Halt process?" msgid_plural "Halt {} processes?" msgstr[0] "Jarayon to‘xtatilsinmi?" #: src/ui/pages/processes/mod.rs:2153 src/ui/pages/processes/mod.rs:2159 msgid "Kill process?" msgid_plural "Kill {} processes?" msgstr[0] "Jarayonni to'xtatilsinmi?" #: src/ui/pages/processes/mod.rs:2171 msgid "" "Halting a process can come with serious risks such as losing data and security " "implications. Use with caution." msgstr "" "Jarayonni to‘xtatish ma’lumotlar va xavfsizlik oqibatlarini yo‘qotish kabi jiddiy " "xavflar bilan birga kelishi mumkin. Ehtiyotkorlik bilan foydalaning." #: src/ui/pages/processes/mod.rs:2174 msgid "" "Killing a process can come with serious risks such as losing data and security " "implications. Use with caution." msgstr "" "Jarayonni o‘ldirish ma’lumotlar va xavfsizlik oqibatlarini yo‘qotish kabi jiddiy " "xavflar bilan birga kelishi mumkin. Ehtiyotkorlik bilan foydalaning." #: src/ui/window.rs:466 msgid "GPU {}" msgstr "GPU {}" #: src/ui/window.rs:496 msgid "NPU {}" msgstr "NPU {}" #: src/ui/window.rs:498 msgid "NPU" msgstr "NPU" #: src/ui/window.rs:1174 msgid "Successfully adjusted {}" msgstr "{} sozlandi" #: src/ui/window.rs:1175 msgid "There was a problem adjusting {}" msgstr "{}ʼni sozlashda muammo yuz berdi" #: src/ui/window.rs:1257 msgid "Successfully ended {}" msgstr "{} muvaffaqiyatli yakunlandi" #: src/ui/window.rs:1258 msgid "Successfully halted {}" msgstr "{} to‘xtatildi" #: src/ui/window.rs:1259 msgid "Successfully killed {}" msgstr "{} o‘ldirildi" #: src/ui/window.rs:1260 msgid "Successfully continued {}" msgstr "{} davom ettirildi" #: src/ui/window.rs:1267 msgid "Successfully ended the process" msgid_plural "Successfully ended {} processes" msgstr[0] "Jarayon muvaffaqiyatli yakunlandi" #: src/ui/window.rs:1273 msgid "Successfully halted the process" msgid_plural "Successfully halted {} processes" msgstr[0] "Jarayonni muvaffaqiyatli to‘xtatdi" #: src/ui/window.rs:1279 msgid "Successfully killed the process" msgid_plural "Successfully killed {} processes" msgstr[0] "Jarayon muvaffaqiyatli yakunlandi" #: src/ui/window.rs:1285 msgid "Successfully continued the process" msgid_plural "Successfully continued {} processes" msgstr[0] "Jarayonni muvaffaqiyatli davom ettirdi" #: src/ui/window.rs:1296 msgid "There was a problem ending a process" msgid_plural "There were problems ending {} processes" msgstr[0] "Jarayonni yakunlashda muammo yuz berdi" #: src/ui/window.rs:1302 msgid "There was a problem halting a process" msgid_plural "There were problems halting {} processes" msgstr[0] "Jarayonni to‘xtatishda muammo yuz berdi" #: src/ui/window.rs:1308 msgid "There was a problem killing a process" msgid_plural "There were problems killing {} processes" msgstr[0] "Jarayonni o‘ldirish muammosi yuzaga keldi" #: src/ui/window.rs:1314 msgid "There was a problem continuing a process" msgid_plural "There were problems continuing {} processes" msgstr[0] "Jarayonni davom ettirishda muammo yuz berdi" #: src/ui/window.rs:1324 msgid "There was a problem ending {}" msgstr "{} bilan tugaydigan muammo bor edi" #: src/ui/window.rs:1325 msgid "There was a problem halting {}" msgstr "{} to‘xtatishda muammo yuz berdi" #: src/ui/window.rs:1326 msgid "There was a problem killing {}" msgstr "{} o‘ldirishda muammo yuz berdi" #: src/ui/window.rs:1327 msgid "There was a problem continuing {}" msgstr "{} davom etishida muammo bor edi" #: src/utils/app.rs:222 msgid "System Processes" msgstr "Tizim jarayonlari" #: src/utils/battery.rs:93 msgid "Charging" msgstr "Zaryadlanmoqda" #: src/utils/battery.rs:94 msgid "Discharging" msgstr "Boʻshatish" #: src/utils/battery.rs:95 msgid "Empty" msgstr "Boʻsh" #: src/utils/battery.rs:96 msgid "Full" msgstr "Toʻliq" #: src/utils/battery.rs:97 msgid "Unknown" msgstr "Nomaʼlum" #: src/utils/battery.rs:143 msgid "Nickel-Metal Hydride" msgstr "Nikel-metall gidrid" #: src/utils/battery.rs:144 msgid "Nickel-Cadmium" msgstr "Nikel-kadmiy" #: src/utils/battery.rs:145 msgid "Nickel-Zinc" msgstr "Nikel-rux" #: src/utils/battery.rs:146 msgid "Lead-Acid" msgstr "Qo‘rg‘oshin-kislota" #: src/utils/battery.rs:147 msgid "Lithium-Ion" msgstr "Litiy-ion" #: src/utils/battery.rs:148 msgid "Lithium Iron Phosphate" msgstr "Litiy temir fosfati" #: src/utils/battery.rs:149 msgid "Lithium Polymer" msgstr "Litiy polimeri" #: src/utils/battery.rs:151 msgid "Rechargeable Alkaline Managanese" msgstr "Qayta tiklanadigan ishqorli managanes" #: src/utils/battery.rs:256 msgid "{} Battery" msgstr "{} ta batareya" #: src/utils/units.rs:91 msgid "{} K" msgstr "{} K" #: src/utils/units.rs:93 msgid "{} °C" msgstr "{} °C" #: src/utils/units.rs:95 msgid "{} °F" msgstr "{} °F" #: src/utils/units.rs:113 src/utils/units.rs:127 src/utils/units.rs:147 #: src/utils/units.rs:161 msgid "{} B" msgstr "{} B" #: src/utils/units.rs:114 src/utils/units.rs:128 msgid "{} kB" msgstr "{} kB" #: src/utils/units.rs:115 src/utils/units.rs:129 msgid "{} MB" msgstr "{} MB" #: src/utils/units.rs:116 src/utils/units.rs:130 msgid "{} GB" msgstr "{} GB" #: src/utils/units.rs:117 src/utils/units.rs:131 msgid "{} TB" msgstr "{} TB" #: src/utils/units.rs:118 src/utils/units.rs:132 msgid "{} PB" msgstr "{} PB" #: src/utils/units.rs:119 src/utils/units.rs:133 msgid "{} EB" msgstr "{} EB" #: src/utils/units.rs:120 src/utils/units.rs:134 msgid "{} ZB" msgstr "{} ZB" #: src/utils/units.rs:121 src/utils/units.rs:135 msgid "{} YB" msgstr "{} YB" #: src/utils/units.rs:122 src/utils/units.rs:136 msgid "{} RB" msgstr "{} RB" #: src/utils/units.rs:123 src/utils/units.rs:137 msgid "{} QB" msgstr "{} QB" #: src/utils/units.rs:148 src/utils/units.rs:162 msgid "{} KiB" msgstr "{} KiB" #: src/utils/units.rs:149 src/utils/units.rs:163 msgid "{} MiB" msgstr "{} MiB" #: src/utils/units.rs:150 src/utils/units.rs:164 msgid "{} GiB" msgstr "{} GiB" #: src/utils/units.rs:151 src/utils/units.rs:165 msgid "{} TiB" msgstr "{} TiB" #: src/utils/units.rs:152 src/utils/units.rs:166 msgid "{} PiB" msgstr "{} ta PiB" #: src/utils/units.rs:153 src/utils/units.rs:167 msgid "{} EiB" msgstr "{} EiB" #: src/utils/units.rs:154 src/utils/units.rs:168 msgid "{} ZiB" msgstr "{} ZiB" #: src/utils/units.rs:155 src/utils/units.rs:169 msgid "{} YiB" msgstr "{} YiB" #: src/utils/units.rs:156 src/utils/units.rs:170 msgid "{} RiB" msgstr "{} RiB" #: src/utils/units.rs:157 src/utils/units.rs:171 msgid "{} QiB" msgstr "{} QiB" #: src/utils/units.rs:198 src/utils/units.rs:215 msgid "{} B/s" msgstr "{} B/s" #: src/utils/units.rs:199 msgid "{} kB/s" msgstr "{} kB/s" #: src/utils/units.rs:200 msgid "{} MB/s" msgstr "{} MB/s{} MB/s" #: src/utils/units.rs:201 msgid "{} GB/s" msgstr "{} GB/s" #: src/utils/units.rs:202 msgid "{} TB/s" msgstr "{} TB/s" #: src/utils/units.rs:203 msgid "{} PB/s" msgstr "{} PB/s" #: src/utils/units.rs:204 msgid "{} EB/s" msgstr "{} EB/s" #: src/utils/units.rs:205 msgid "{} ZB/s" msgstr "{} ZB/s" #: src/utils/units.rs:206 msgid "{} YB/s" msgstr "{} YB/s" #: src/utils/units.rs:207 msgid "{} RB/s" msgstr "{} RB/s" #: src/utils/units.rs:208 msgid "{} QB/s" msgstr "{} QB/s" #: src/utils/units.rs:216 msgid "{} KiB/s" msgstr "{} KiB/s" #: src/utils/units.rs:217 msgid "{} MiB/s" msgstr "{} MiB/s" #: src/utils/units.rs:218 msgid "{} GiB/s" msgstr "{} GiB/s" #: src/utils/units.rs:219 msgid "{} TiB/s" msgstr "{} TiB/s" #: src/utils/units.rs:220 msgid "{} PiB/s" msgstr "{} PiB/s" #: src/utils/units.rs:221 msgid "{} EiB/s" msgstr "{} EiB/s" #: src/utils/units.rs:222 msgid "{} ZiB/s" msgstr "{} ZiB/s" #: src/utils/units.rs:223 msgid "{} YiB/s" msgstr "{} YiB/s" #: src/utils/units.rs:224 msgid "{} RiB/s" msgstr "{} RiB/s" #: src/utils/units.rs:225 msgid "{} QiB/s" msgstr "{} QiB/s" #: src/utils/units.rs:239 src/utils/units.rs:256 msgid "{} b/s" msgstr "{} b/s" #: src/utils/units.rs:240 msgid "{} kb/s" msgstr "{} kb/s" #: src/utils/units.rs:241 msgid "{} Mb/s" msgstr "{} Mb/s" #: src/utils/units.rs:242 msgid "{} Gb/s" msgstr "{} Gb/s" #: src/utils/units.rs:243 msgid "{} Tb/s" msgstr "{} Tb/s" #: src/utils/units.rs:244 msgid "{} Pb/s" msgstr "{} Pb/s" #: src/utils/units.rs:245 msgid "{} Eb/s" msgstr "{} Eb/s" #: src/utils/units.rs:246 msgid "{} Zb/s" msgstr "{} Zb/s" #: src/utils/units.rs:247 msgid "{} Yb/s" msgstr "{} Yb/s" #: src/utils/units.rs:248 msgid "{} Rb/s" msgstr "{} Rb/s" #: src/utils/units.rs:249 msgid "{} Qb/s" msgstr "{} Qb/s" #: src/utils/units.rs:257 msgid "{} Kib/s" msgstr "{} Kib/s" #: src/utils/units.rs:258 msgid "{} Mib/s" msgstr "{} Mib/s" #: src/utils/units.rs:259 msgid "{} Gib/s" msgstr "{} Gib/s" #: src/utils/units.rs:260 msgid "{} Tib/s" msgstr "{} Tib/s" #: src/utils/units.rs:261 msgid "{} Pib/s" msgstr "{} Pib/s" #: src/utils/units.rs:262 msgid "{} Eib/s" msgstr "{} Eib/s" #: src/utils/units.rs:263 msgid "{} Zib/s" msgstr "{} Zib/s" #: src/utils/units.rs:264 msgid "{} Yib/s" msgstr "{} Yib/s" #: src/utils/units.rs:265 msgid "{} Rib/s" msgstr "{} Rib/s" #: src/utils/units.rs:266 msgid "{} Qib/s" msgstr "{} Qib/s" #: src/utils/units.rs:273 msgid "{} Hz" msgstr "{} Hz" #: src/utils/units.rs:274 msgid "{} kHz" msgstr "{} kHz" #: src/utils/units.rs:275 msgid "{} MHz" msgstr "{} MHz" #: src/utils/units.rs:276 msgid "{} GHz" msgstr "{} GHz" #: src/utils/units.rs:277 msgid "{} THz" msgstr "{} THz" #: src/utils/units.rs:278 msgid "{} PHz" msgstr "{} PHz" #: src/utils/units.rs:279 msgid "{} EHz" msgstr "{} EHz" #: src/utils/units.rs:280 msgid "{} ZHz" msgstr "{} ZHz" #: src/utils/units.rs:281 msgid "{} YHz" msgstr "{} YHz" #: src/utils/units.rs:282 msgid "{} RHz" msgstr "{} RHz" #: src/utils/units.rs:283 msgid "{} QHz" msgstr "{} QHz" #: src/utils/units.rs:290 msgid "{} W" msgstr "{} W" #: src/utils/units.rs:291 msgid "{} kW" msgstr "{} kW" #: src/utils/units.rs:292 msgid "{} MW" msgstr "{} MW" #: src/utils/units.rs:293 msgid "{} GW" msgstr "{} GW" #: src/utils/units.rs:294 msgid "{} TW" msgstr "{} TW" #: src/utils/units.rs:295 msgid "{} PW" msgstr "{} PW" #: src/utils/units.rs:296 msgid "{} EW" msgstr "{} EW" #: src/utils/units.rs:297 msgid "{} ZW" msgstr "{} ZW" #: src/utils/units.rs:298 msgid "{} YW" msgstr "{} YW" #: src/utils/units.rs:299 msgid "{} RW" msgstr "{} RW" #: src/utils/units.rs:300 msgid "{} QW" msgstr "{} QW" #: src/utils/units.rs:309 src/utils/units.rs:323 msgid "{} Wh" msgstr "{} Wh" #: src/utils/units.rs:310 src/utils/units.rs:324 msgid "{} kWh" msgstr "{} kWh" #: src/utils/units.rs:311 src/utils/units.rs:325 msgid "{} MWh" msgstr "{} MWh" #: src/utils/units.rs:312 src/utils/units.rs:326 msgid "{} GWh" msgstr "{} GWh" #: src/utils/units.rs:313 src/utils/units.rs:327 msgid "{} TWh" msgstr "{} TWh" #: src/utils/units.rs:314 src/utils/units.rs:328 msgid "{} PWh" msgstr "{} PWh" #: src/utils/units.rs:315 src/utils/units.rs:329 msgid "{} EWh" msgstr "{} EWh" #: src/utils/units.rs:316 src/utils/units.rs:330 msgid "{} ZWh" msgstr "{} ZWh" #: src/utils/units.rs:317 src/utils/units.rs:331 msgid "{} YWh" msgstr "{} YWh" #: src/utils/units.rs:318 src/utils/units.rs:332 msgid "{} RWh" msgstr "{} RWh" #: src/utils/units.rs:319 src/utils/units.rs:333 msgid "{} QWh" msgstr "{} QWh" #: src/utils/drive.rs:129 src/utils/drive.rs:208 msgid "CD/DVD/Blu-ray Drive" msgstr "CD/DVD/Blu-ray disk" #: src/utils/drive.rs:130 msgid "eMMC Storage" msgstr "eMMC Xotira" #: src/utils/drive.rs:131 msgid "Flash Storage" msgstr "Flesh-xotira" #: src/utils/drive.rs:132 src/utils/drive.rs:209 msgid "Floppy Drive" msgstr "Egiluvchan disk" #: src/utils/drive.rs:133 msgid "Hard Disk Drive" msgstr "Qattiq disk yurituvchi" #: src/utils/drive.rs:134 msgid "Loop Device" msgstr "Halqa qurilmasi" #: src/utils/drive.rs:135 msgid "Mapped Device" msgstr "Xaritalangan qurilma" #: src/utils/drive.rs:136 msgid "NVMe Drive" msgstr "NVMe diski" #: src/utils/drive.rs:138 msgid "Software Raid" msgstr "Dasturiy Raid" #: src/utils/drive.rs:139 msgid "RAM Disk" msgstr "Tezkor xotira disk" #: src/utils/drive.rs:140 msgid "Solid State Drive" msgstr "Qattiq jism diski" #: src/utils/drive.rs:141 msgid "ZFS Volume" msgstr "ZFS hajmi" #: src/utils/drive.rs:142 msgid "Compressed RAM Disk (zram)" msgstr "Siqilgan operativ xotira diski (zram)" #: src/utils/drive.rs:210 msgid "{} Loop Device" msgstr "" #: src/utils/drive.rs:211 msgid "{} Mapped Device" msgstr "{} Xaritalangan qurilma" #: src/utils/drive.rs:212 msgid "{} RAID" msgstr "{} RAID" #: src/utils/drive.rs:213 msgid "{} RAM Disk" msgstr "{} operativ xotira" #: src/utils/drive.rs:214 msgid "{} zram Device" msgstr "{} zram qurilmasi" #: src/utils/drive.rs:215 msgid "{} ZFS Volume" msgstr "{} ZFS ovoz" #: src/utils/drive.rs:216 msgid "{} Drive" msgstr "{} Disk" #: src/utils/network.rs:123 msgid "Bluetooth Tether" msgstr "Bluetooth bog‘lanish" #: src/utils/network.rs:124 msgid "Network Bridge" msgstr "Tarmoq ko‘prigi" #: src/utils/network.rs:125 msgid "Ethernet Connection" msgstr "Ethernet aloqasi" #: src/utils/network.rs:126 msgid "Docker Bridge" msgstr "Doker ko‘prigi" #: src/utils/network.rs:127 msgid "InfiniBand Connection" msgstr "InfiniBand ulanishi" #: src/utils/network.rs:128 msgid "Serial Line IP Connection" msgstr "Ketma-ket liniya IP ulanishi" #: src/utils/network.rs:129 msgid "Virtual Ethernet Device" msgstr "Virtual Ethernet qurilmasi" #: src/utils/network.rs:130 msgid "VM Network Bridge" msgstr "VM tarmoq ko‘prigi" #: src/utils/network.rs:131 msgid "VPN Tunnel" msgstr "VPN tunneli" #: src/utils/network.rs:132 msgid "VPN Tunnel (WireGuard)" msgstr "VPN tunneli (WireGuard)" #: src/utils/network.rs:133 msgid "Wi-Fi Connection" msgstr "Wi-Fi ulanish" #: src/utils/network.rs:134 msgid "WWAN Connection" msgstr "WWAN ulanishi" resources-1.9.1/po/zh_CN.po000066400000000000000000001371021510634446000155220ustar00rootroot00000000000000# Chinese translation of Resources. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the resources package. # Alex3236 , 2024. # nicolasyang , 2024. # lumingzh , 2025. # msgid "" msgstr "" "Project-Id-Version: resources-main\n" "Report-Msgid-Bugs-To: https://github.com/nokyan/resources/issues/\n" "POT-Creation-Date: 2025-10-04 15:36+0000\n" "PO-Revision-Date: 2025-10-05 07:23+0800\n" "Last-Translator: lumingzh \n" "Language-Team: Chinese (China) \n" "Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Gtranslator 49.0\n" #: data/net.nokyan.Resources.desktop.in.in:2 #: data/net.nokyan.Resources.metainfo.xml.in.in:4 #: data/resources/ui/window.ui:22 src/application.rs:272 msgid "Resources" msgstr "资源" #. Translators: The summary should be 35 characters or less according to Flathub appstream guidelines #: data/net.nokyan.Resources.desktop.in.in:3 #: data/net.nokyan.Resources.metainfo.xml.in.in:5 msgid "Keep an eye on system resources" msgstr "随时关注系统资源占用" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/net.nokyan.Resources.desktop.in.in:9 msgid "System;Resources;Monitor;Processes;Usage;Task;Manager;CPU;RAM;Memory;GPU;" msgstr "" "System;Resources;Monitor;Processes;Usage;Task;Manager;CPU;RAM;Memory;GPU;系" "统;资源;监视器;进程;占用;使用情况;任务;管理器;处理器;内存;显卡;" #: data/net.nokyan.Resources.metainfo.xml.in.in:17 msgid "" "Resources allows you to check the utilization of your system resources and " "control your running processes and apps. It’s designed to be user-friendly " "and feel right at home on a modern desktop by using GNOME’s libadwaita." msgstr "" "资源可让您查看系统资源的使用情况,并控制正在运行的应用与进程。其通过使用 " "GNOME 的 libadwaita 使其设计为用户友好且易于在现代桌面上使用。" #: data/net.nokyan.Resources.metainfo.xml.in.in:20 msgid "Resources supports monitoring the following components:" msgstr "资源支持监控以下组件:" #: data/net.nokyan.Resources.metainfo.xml.in.in:24 msgid "CPU" msgstr "处理器" #: data/net.nokyan.Resources.metainfo.xml.in.in:25 #: data/resources/ui/dialogs/app_dialog.ui:82 #: data/resources/ui/dialogs/process_dialog.ui:64 #: data/resources/ui/dialogs/settings_dialog.ui:128 #: data/resources/ui/dialogs/settings_dialog.ui:220 #: data/resources/ui/window.ui:176 data/resources/ui/window.ui:183 #: src/ui/pages/applications/mod.rs:803 src/ui/pages/memory.rs:106 #: src/ui/pages/memory.rs:192 src/ui/pages/processes/mod.rs:1079 msgid "Memory" msgstr "内存" #: data/net.nokyan.Resources.metainfo.xml.in.in:26 #: data/resources/ui/dialogs/app_dialog.ui:140 #: data/resources/ui/dialogs/process_dialog.ui:118 #: data/resources/ui/dialogs/settings_dialog.ui:158 #: data/resources/ui/dialogs/settings_dialog.ui:250 #: src/ui/pages/applications/mod.rs:1181 src/ui/pages/gpu.rs:119 #: src/ui/pages/processes/mod.rs:1469 src/ui/window.rs:468 msgid "GPU" msgstr "显卡" #: data/net.nokyan.Resources.metainfo.xml.in.in:27 #: data/resources/ui/dialogs/settings_dialog.ui:319 msgid "Network Interfaces" msgstr "网络接口" #: data/net.nokyan.Resources.metainfo.xml.in.in:28 msgid "Storage Devices" msgstr "存储设备" #: data/net.nokyan.Resources.metainfo.xml.in.in:29 msgid "Batteries" msgstr "电池" #: data/net.nokyan.Resources.metainfo.xml.in.in:51 msgid "Apps page in light theme" msgstr "亮色主题的应用页面" #: data/net.nokyan.Resources.metainfo.xml.in.in:55 msgid "Processes page in dark theme" msgstr "暗色主题的进程页面" #: data/net.nokyan.Resources.metainfo.xml.in.in:59 msgid "Processor page in light theme" msgstr "亮色主题的处理器页面" #: data/net.nokyan.Resources.metainfo.xml.in.in:63 msgid "Memory page in dark theme" msgstr "暗色主题的内存页面" #: data/net.nokyan.Resources.metainfo.xml.in.in:67 msgid "GPU page in light theme" msgstr "亮色主题的显卡页面" #: data/net.nokyan.Resources.metainfo.xml.in.in:71 msgid "Drive page in dark theme" msgstr "暗色主题的驱动器页面" #: data/net.nokyan.Resources.metainfo.xml.in.in:75 msgid "Network Interface page in light theme" msgstr "亮色主题的网络接口页面" #: data/net.nokyan.Resources.metainfo.xml.in.in:79 msgid "Battery page in dark theme" msgstr "暗色主题的电池页面" #: data/net.nokyan.Resources.policy.in.in:9 msgid "Control Process" msgstr "控制进程" #: data/net.nokyan.Resources.policy.in.in:10 msgid "" "Authentication is required to control superuser’s or other users’ processes" msgstr "需要认证以控制超级用户或其他用户的进程" #: data/resources/ui/dialogs/app_dialog.ui:7 msgid "App Information" msgstr "应用信息" #: data/resources/ui/dialogs/app_dialog.ui:70 #: data/resources/ui/dialogs/process_dialog.ui:48 #: data/resources/ui/pages/battery.ui:22 data/resources/ui/pages/cpu.ui:37 #: data/resources/ui/pages/cpu.ui:50 data/resources/ui/pages/drive.ui:22 #: data/resources/ui/pages/gpu.ui:22 data/resources/ui/pages/memory.ui:31 #: data/resources/ui/pages/network.ui:22 data/resources/ui/pages/npu.ui:22 msgid "Usage" msgstr "占用" #: data/resources/ui/dialogs/app_dialog.ui:73 #: data/resources/ui/dialogs/process_dialog.ui:55 #: data/resources/ui/dialogs/settings_dialog.ui:133 #: data/resources/ui/dialogs/settings_dialog.ui:225 #: data/resources/ui/window.ui:145 data/resources/ui/window.ui:152 #: src/ui/pages/applications/mod.rs:862 src/ui/pages/cpu.rs:128 #: src/ui/pages/processes/mod.rs:1138 src/ui/window.rs:290 msgid "Processor" msgstr "处理器" #: data/resources/ui/dialogs/app_dialog.ui:91 #: data/resources/ui/dialogs/process_dialog.ui:73 #: data/resources/ui/dialogs/settings_dialog.ui:178 #: data/resources/ui/dialogs/settings_dialog.ui:290 #: src/ui/pages/applications/mod.rs:1420 src/ui/pages/memory.rs:198 #: src/ui/pages/processes/mod.rs:1954 msgid "Swap" msgstr "交换空间" #: data/resources/ui/dialogs/app_dialog.ui:100 #: data/resources/ui/dialogs/process_dialog.ui:78 #: data/resources/ui/dialogs/settings_dialog.ui:138 #: data/resources/ui/dialogs/settings_dialog.ui:230 #: src/ui/pages/applications/mod.rs:926 src/ui/pages/processes/mod.rs:1202 msgid "Drive Read" msgstr "驱动器读取" #: data/resources/ui/dialogs/app_dialog.ui:109 #: data/resources/ui/dialogs/process_dialog.ui:87 #: data/resources/ui/dialogs/settings_dialog.ui:143 #: data/resources/ui/dialogs/settings_dialog.ui:235 #: src/ui/pages/applications/mod.rs:991 src/ui/pages/processes/mod.rs:1269 msgid "Drive Read Total" msgstr "驱动器总读取量" #: data/resources/ui/dialogs/app_dialog.ui:118 #: data/resources/ui/dialogs/process_dialog.ui:96 #: data/resources/ui/dialogs/settings_dialog.ui:148 #: data/resources/ui/dialogs/settings_dialog.ui:240 #: src/ui/pages/applications/mod.rs:1052 src/ui/pages/processes/mod.rs:1336 msgid "Drive Write" msgstr "驱动器写入" #: data/resources/ui/dialogs/app_dialog.ui:127 #: data/resources/ui/dialogs/process_dialog.ui:105 #: data/resources/ui/dialogs/settings_dialog.ui:153 #: data/resources/ui/dialogs/settings_dialog.ui:245 #: src/ui/pages/applications/mod.rs:1119 src/ui/pages/processes/mod.rs:1403 msgid "Drive Write Total" msgstr "驱动器总写入量" #: data/resources/ui/dialogs/app_dialog.ui:149 #: data/resources/ui/dialogs/process_dialog.ui:127 #: data/resources/ui/dialogs/settings_dialog.ui:163 #: data/resources/ui/dialogs/settings_dialog.ui:255 #: src/ui/pages/applications/mod.rs:1361 src/ui/pages/processes/mod.rs:1650 msgid "Video Memory" msgstr "显存" #: data/resources/ui/dialogs/app_dialog.ui:158 #: data/resources/ui/dialogs/process_dialog.ui:136 #: data/resources/ui/dialogs/settings_dialog.ui:168 #: data/resources/ui/dialogs/settings_dialog.ui:260 #: src/ui/pages/applications/mod.rs:1240 src/ui/pages/processes/mod.rs:1528 msgid "Video Encoder" msgstr "视频编码器" #: data/resources/ui/dialogs/app_dialog.ui:167 #: data/resources/ui/dialogs/process_dialog.ui:145 #: data/resources/ui/dialogs/settings_dialog.ui:173 #: data/resources/ui/dialogs/settings_dialog.ui:265 #: src/ui/pages/applications/mod.rs:1301 src/ui/pages/processes/mod.rs:1589 msgid "Video Decoder" msgstr "视频解码器" #: data/resources/ui/dialogs/app_dialog.ui:174 #: data/resources/ui/dialogs/process_dialog.ui:179 #: data/resources/ui/pages/battery.ui:33 data/resources/ui/pages/cpu.ui:83 #: data/resources/ui/pages/drive.ui:54 data/resources/ui/pages/gpu.ui:74 #: data/resources/ui/pages/memory.ui:42 data/resources/ui/pages/network.ui:51 #: data/resources/ui/pages/npu.ui:68 msgid "Properties" msgstr "属性" #: data/resources/ui/dialogs/app_dialog.ui:180 msgid "ID" msgstr "ID" #: data/resources/ui/dialogs/app_dialog.ui:190 #: data/resources/ui/dialogs/process_dialog.ui:195 msgid "Running Since" msgstr "启动时间" #: data/resources/ui/dialogs/app_dialog.ui:198 msgid "Running Processes" msgstr "正在运行的进程" #: data/resources/ui/dialogs/app_dialog.ui:207 #: data/resources/ui/dialogs/process_dialog.ui:231 msgid "Containerized" msgstr "已容器化" #: data/resources/ui/dialogs/process_dialog.ui:7 msgid "Process Information" msgstr "进程信息" #: data/resources/ui/dialogs/process_dialog.ui:154 #: data/resources/ui/dialogs/settings_dialog.ui:270 #: src/ui/pages/processes/mod.rs:1710 msgid "Total CPU Time" msgstr "总处理器时间" #: data/resources/ui/dialogs/process_dialog.ui:163 #: data/resources/ui/dialogs/settings_dialog.ui:275 #: src/ui/pages/processes/mod.rs:1769 msgid "User CPU Time" msgstr "用户处理器时间" #: data/resources/ui/dialogs/process_dialog.ui:172 #: data/resources/ui/dialogs/settings_dialog.ui:280 #: src/ui/pages/processes/mod.rs:1828 msgid "System CPU Time" msgstr "系统处理器时间" #: data/resources/ui/dialogs/process_dialog.ui:186 #: data/resources/ui/dialogs/settings_dialog.ui:210 #: src/ui/pages/processes/mod.rs:972 msgid "Process ID" msgstr "进程 ID" #: data/resources/ui/dialogs/process_dialog.ui:204 msgid "Commandline" msgstr "命令行" #: data/resources/ui/dialogs/process_dialog.ui:213 #: data/resources/ui/dialogs/settings_dialog.ui:215 #: src/ui/pages/processes/mod.rs:1025 msgid "User" msgstr "用户" #: data/resources/ui/dialogs/process_dialog.ui:222 msgid "Control Group" msgstr "控制组" #: data/resources/ui/dialogs/process_options_dialog.ui:7 #: data/resources/ui/dialogs/process_options_dialog.ui:69 msgid "Process Options" msgstr "进程选项" #: data/resources/ui/dialogs/process_options_dialog.ui:29 msgid "Apply" msgstr "应用" #: data/resources/ui/dialogs/process_options_dialog.ui:72 msgid "Niceness" msgstr "友好度" #: data/resources/ui/dialogs/process_options_dialog.ui:73 msgid "" "The priority of a process is given by its niceness. A lower niceness value " "correspond to a higher priority." msgstr "进程的优先级由友好度决定。友好度数值越低,优先级越高。" #: data/resources/ui/dialogs/process_options_dialog.ui:87 #: data/resources/ui/dialogs/settings_dialog.ui:285 #: src/ui/pages/processes/mod.rs:1887 msgid "Priority" msgstr "优先级" #: data/resources/ui/dialogs/process_options_dialog.ui:91 msgctxt "process priority" msgid "Very High" msgstr "非常高" #: data/resources/ui/dialogs/process_options_dialog.ui:92 msgctxt "process priority" msgid "High" msgstr "高" #: data/resources/ui/dialogs/process_options_dialog.ui:93 msgctxt "process priority" msgid "Normal" msgstr "正常" #: data/resources/ui/dialogs/process_options_dialog.ui:94 msgctxt "process priority" msgid "Low" msgstr "低" #: data/resources/ui/dialogs/process_options_dialog.ui:95 msgctxt "process priority" msgid "Very Low" msgstr "非常低" #: data/resources/ui/dialogs/process_options_dialog.ui:103 msgid "Processor Affinity" msgstr "处理器亲和性" #: data/resources/ui/dialogs/process_options_dialog.ui:108 msgid "Toggle All" msgstr "切换全部" #: data/resources/ui/dialogs/process_options_dialog.ui:111 msgid "Select which processor cores the process is allowed to run on" msgstr "选择允许该进程运行在哪些处理器核心上" #: data/resources/ui/dialogs/settings_dialog.ui:7 msgid "General" msgstr "常规" #: data/resources/ui/dialogs/settings_dialog.ui:10 msgid "Units" msgstr "单位" #: data/resources/ui/dialogs/settings_dialog.ui:13 msgid "Data Unit Prefix" msgstr "数据单位前缀" #: data/resources/ui/dialogs/settings_dialog.ui:17 msgid "Decimal" msgstr "十进制" #: data/resources/ui/dialogs/settings_dialog.ui:18 msgid "Binary" msgstr "二进制" #: data/resources/ui/dialogs/settings_dialog.ui:26 msgid "Show Network Speeds in Bits per Second" msgstr "以 bits/s 形式显示网络速率" #: data/resources/ui/dialogs/settings_dialog.ui:31 msgid "Temperature Unit" msgstr "温度单位" #: data/resources/ui/dialogs/settings_dialog.ui:35 msgid "Celsius" msgstr "摄氏度" #: data/resources/ui/dialogs/settings_dialog.ui:36 msgid "Kelvin" msgstr "开尔文" #: data/resources/ui/dialogs/settings_dialog.ui:37 msgid "Fahrenheit" msgstr "华氏度" #: data/resources/ui/dialogs/settings_dialog.ui:47 msgid "User Interface" msgstr "用户界面" #: data/resources/ui/dialogs/settings_dialog.ui:50 msgid "Refresh Speed" msgstr "刷新速率" #: data/resources/ui/dialogs/settings_dialog.ui:51 msgid "Higher refresh speeds can lead to higher processor usage" msgstr "较高的刷新速率可导致较高的处理器占用" #: data/resources/ui/dialogs/settings_dialog.ui:55 msgctxt "UI refresh speed" msgid "Very Slow" msgstr "非常慢" #: data/resources/ui/dialogs/settings_dialog.ui:56 msgctxt "UI refresh speed" msgid "Slow" msgstr "慢" #: data/resources/ui/dialogs/settings_dialog.ui:57 msgctxt "UI refresh speed" msgid "Normal" msgstr "正常" #: data/resources/ui/dialogs/settings_dialog.ui:58 msgctxt "UI refresh speed" msgid "Fast" msgstr "快" #: data/resources/ui/dialogs/settings_dialog.ui:59 msgctxt "UI refresh speed" msgid "Very Fast" msgstr "非常快" #: data/resources/ui/dialogs/settings_dialog.ui:67 msgid "Show Graph Grids" msgstr "显示图表网格" #: data/resources/ui/dialogs/settings_dialog.ui:72 msgid "Graph Data Points" msgstr "图表数据点" #: data/resources/ui/dialogs/settings_dialog.ui:86 msgid "Show Usage Details in Sidebar" msgstr "在侧边栏显示占用详情" #: data/resources/ui/dialogs/settings_dialog.ui:87 msgid "If enabled, the usage along with other information will be displayed" msgstr "如果启用,将会在其它信息旁显示占用情况" #: data/resources/ui/dialogs/settings_dialog.ui:92 msgid "Show Device Descriptions in Sidebar" msgstr "在侧边栏显示设备描述" #: data/resources/ui/dialogs/settings_dialog.ui:93 msgid "" "If enabled, a device identifier like its name or device type will be " "displayed" msgstr "如果启用,将会显示设备标识符如名称或设备类型" #: data/resources/ui/dialogs/settings_dialog.ui:98 msgid "Sidebar Meter Type" msgstr "侧边栏仪表类型" #: data/resources/ui/dialogs/settings_dialog.ui:102 msgid "Bar" msgstr "条形图" #: data/resources/ui/dialogs/settings_dialog.ui:103 msgid "Graph" msgstr "图表" #: data/resources/ui/dialogs/settings_dialog.ui:111 msgid "Normalize Processor Usage" msgstr "标准化处理器占用" #: data/resources/ui/dialogs/settings_dialog.ui:112 msgid "" "If enabled, the total usage of all cores will be divided by the amount of " "cores" msgstr "如果启用,所有核心的总占用会除以核心数量" #: data/resources/ui/dialogs/settings_dialog.ui:122 #: data/resources/ui/window.ui:65 data/resources/ui/window.ui:72 #: src/ui/pages/applications/mod.rs:131 msgid "Apps" msgstr "应用" #: data/resources/ui/dialogs/settings_dialog.ui:125 #: data/resources/ui/dialogs/settings_dialog.ui:207 msgid "Information Columns" msgstr "信息栏" #: data/resources/ui/dialogs/settings_dialog.ui:183 #: data/resources/ui/dialogs/settings_dialog.ui:295 #: src/ui/pages/applications/mod.rs:1479 src/ui/pages/processes/mod.rs:2013 msgid "Combined Memory" msgstr "聚合内存" #: data/resources/ui/dialogs/settings_dialog.ui:193 #: data/resources/ui/window.ui:105 data/resources/ui/window.ui:112 #: src/ui/pages/processes/mod.rs:175 msgid "Processes" msgstr "进程" #: data/resources/ui/dialogs/settings_dialog.ui:196 #: data/resources/ui/pages/cpu.ui:22 data/resources/ui/pages/processes.ui:56 msgid "Options" msgstr "选项" #: data/resources/ui/dialogs/settings_dialog.ui:199 msgid "Show Niceness Values" msgstr "显示友好度数值" #: data/resources/ui/dialogs/settings_dialog.ui:200 msgid "" "Display priorities as niceness to allow for more fine-grained adjustments" msgstr "将优先级显示为友好度以允许更精细的调整" #: data/resources/ui/dialogs/settings_dialog.ui:305 msgid "Devices" msgstr "设备" #: data/resources/ui/dialogs/settings_dialog.ui:308 msgid "Drives" msgstr "驱动器" #: data/resources/ui/dialogs/settings_dialog.ui:311 msgid "Show Virtual Drives" msgstr "显示虚拟驱动器" #: data/resources/ui/dialogs/settings_dialog.ui:312 msgid "Virtual drives are for example ZFS volumes or mapped devices" msgstr "虚拟驱动器指的是如 ZFS 卷或映射的设备等" #: data/resources/ui/dialogs/settings_dialog.ui:322 msgid "Show Virtual Network Interfaces" msgstr "显示虚拟网络接口" #: data/resources/ui/dialogs/settings_dialog.ui:323 msgid "Virtual network interfaces are for example bridges or VPN tunnels" msgstr "虚拟网络接口指的是如网桥或 VPN 隧道等" #: data/resources/ui/pages/applications.ui:6 #: data/resources/ui/pages/applications.ui:26 #: src/ui/pages/applications/mod.rs:1563 msgid "Kill App" msgstr "杀死应用" #: data/resources/ui/pages/applications.ui:10 #: data/resources/ui/pages/applications.ui:30 #: src/ui/pages/applications/mod.rs:1562 msgid "Halt App" msgstr "暂停应用" #: data/resources/ui/pages/applications.ui:14 #: data/resources/ui/pages/applications.ui:34 #: src/ui/pages/applications/mod.rs:1564 msgid "Continue App" msgstr "继续应用" #: data/resources/ui/pages/applications.ui:22 #: data/resources/ui/pages/applications.ui:98 #: src/ui/pages/applications/mod.rs:1561 msgid "End App" msgstr "结束应用" #: data/resources/ui/pages/applications.ui:40 #: data/resources/ui/pages/processes.ui:62 msgid "Information" msgstr "信息" #: data/resources/ui/pages/applications.ui:57 msgid "Search applications" msgstr "搜索应用程序" #: data/resources/ui/pages/applications.ui:87 #: data/resources/ui/pages/applications.ui:89 msgid "Show App Information" msgstr "显示应用信息" #: data/resources/ui/pages/battery.ui:36 msgid "Battery Health" msgstr "电池健康" #: data/resources/ui/pages/battery.ui:45 msgid "Design Capacity" msgstr "设计容量" #: data/resources/ui/pages/battery.ui:54 msgid "Charge Cycles" msgstr "充电循环" #: data/resources/ui/pages/battery.ui:63 msgid "Technology" msgstr "技术" #: data/resources/ui/pages/battery.ui:72 data/resources/ui/pages/gpu.ui:81 #: data/resources/ui/pages/network.ui:58 data/resources/ui/pages/npu.ui:75 msgid "Manufacturer" msgstr "制造商" #: data/resources/ui/pages/battery.ui:81 msgid "Model Name" msgstr "型号名称" #: data/resources/ui/pages/battery.ui:90 data/resources/ui/pages/drive.ui:66 msgid "Device" msgstr "设备" #: data/resources/ui/pages/cpu.ui:26 msgid "Show Usages of Logical CPUs" msgstr "显示逻辑处理器占用" #: data/resources/ui/pages/cpu.ui:75 data/resources/ui/pages/gpu.ui:66 #: data/resources/ui/pages/npu.ui:60 msgid "Sensors" msgstr "传感器" #: data/resources/ui/pages/cpu.ui:90 msgid "Max Frequency" msgstr "最大频率" #: data/resources/ui/pages/cpu.ui:99 msgid "Logical Cores" msgstr "逻辑核心" #: data/resources/ui/pages/cpu.ui:108 msgid "Physical Cores" msgstr "物理核心" #: data/resources/ui/pages/cpu.ui:117 msgid "Sockets" msgstr "插槽" #: data/resources/ui/pages/cpu.ui:126 msgid "Uptime" msgstr "运行时间" #: data/resources/ui/pages/cpu.ui:135 msgid "Virtualization" msgstr "虚拟化" #: data/resources/ui/pages/cpu.ui:144 msgid "Architecture" msgstr "架构" #: data/resources/ui/pages/drive.ui:38 msgid "Total Read" msgstr "总读取量" #: data/resources/ui/pages/drive.ui:47 msgid "Total Written" msgstr "总写入量" #: data/resources/ui/pages/drive.ui:57 data/resources/ui/pages/memory.ui:72 msgid "Type" msgstr "类型" #: data/resources/ui/pages/drive.ui:75 msgid "Capacity" msgstr "容量" #: data/resources/ui/pages/drive.ui:84 msgid "Writable" msgstr "可写入" #: data/resources/ui/pages/drive.ui:93 msgid "Removable" msgstr "可移除" #. Translators: "Link" refers to something like "PCIe 4.0 ×16" #: data/resources/ui/pages/drive.ui:102 data/resources/ui/pages/gpu.ui:113 #: data/resources/ui/pages/network.ui:103 data/resources/ui/pages/npu.ui:107 msgid "Link" msgstr "接口" #: data/resources/ui/pages/gpu.ui:37 msgid "GPU Frequency" msgstr "显卡频率" #: data/resources/ui/pages/gpu.ui:50 msgid "Video Memory Frequency" msgstr "显存频率" #: data/resources/ui/pages/gpu.ui:55 data/resources/ui/pages/npu.ui:49 #: src/ui/pages/battery.rs:217 msgid "Power Usage" msgstr "功耗" #: data/resources/ui/pages/gpu.ui:90 data/resources/ui/pages/npu.ui:84 msgid "PCI Slot" msgstr "PCI 插槽" #: data/resources/ui/pages/gpu.ui:99 data/resources/ui/pages/network.ui:67 #: data/resources/ui/pages/npu.ui:93 msgid "Driver Used" msgstr "使用的驱动程序" #: data/resources/ui/pages/gpu.ui:108 data/resources/ui/pages/npu.ui:102 msgid "Max Power Cap" msgstr "最大功耗" #: data/resources/ui/pages/memory.ui:9 msgid "You need to authenticate to see memory properties" msgstr "您需要认证以查看内存属性" #: data/resources/ui/pages/memory.ui:10 msgid "Authenticate" msgstr "认证" #: data/resources/ui/pages/memory.ui:45 msgid "Slots Used" msgstr "已使用插槽" #: data/resources/ui/pages/memory.ui:54 msgid "Speed" msgstr "速度" #: data/resources/ui/pages/memory.ui:63 msgid "Form Factor" msgstr "规格参数" #: data/resources/ui/pages/memory.ui:81 msgid "Type Detail" msgstr "类型详情" #: data/resources/ui/pages/network.ui:35 msgid "Total Received" msgstr "总接收量" #: data/resources/ui/pages/network.ui:44 msgid "Total Sent" msgstr "总发送量" #: data/resources/ui/pages/network.ui:76 msgid "Interface" msgstr "接口" #: data/resources/ui/pages/network.ui:85 msgid "Hardware Address" msgstr "硬件地址" #: data/resources/ui/pages/network.ui:94 msgid "Network Name" msgstr "网络名称" #: data/resources/ui/pages/network.ui:112 msgid "Link Speed" msgstr "连接速度" #: data/resources/ui/pages/npu.ui:31 msgid "NPU Frequency" msgstr "NPU 频率" #: data/resources/ui/pages/npu.ui:44 msgid "Memory Frequency" msgstr "内存频率" #: data/resources/ui/pages/processes.ui:6 #: data/resources/ui/pages/processes.ui:42 src/ui/pages/processes/mod.rs:2126 msgid "Kill Process" msgstr "杀死进程" #: data/resources/ui/pages/processes.ui:10 #: data/resources/ui/pages/processes.ui:46 src/ui/pages/processes/mod.rs:2125 msgid "Halt Process" msgstr "暂停进程" #: data/resources/ui/pages/processes.ui:14 #: data/resources/ui/pages/processes.ui:50 src/ui/pages/processes/mod.rs:2127 msgid "Continue Process" msgstr "继续进程" #: data/resources/ui/pages/processes.ui:22 #: data/resources/ui/pages/processes.ui:74 msgid "Kill Processes" msgstr "杀死进程" #: data/resources/ui/pages/processes.ui:26 #: data/resources/ui/pages/processes.ui:78 msgid "Halt Processes" msgstr "暂停进程" #: data/resources/ui/pages/processes.ui:30 #: data/resources/ui/pages/processes.ui:82 msgid "Continue Processes" msgstr "继续进程" #: data/resources/ui/pages/processes.ui:38 #: data/resources/ui/pages/processes.ui:157 src/ui/pages/processes/mod.rs:523 #: src/ui/pages/processes/mod.rs:2124 msgid "End Process" msgstr "结束进程" #: data/resources/ui/pages/processes.ui:70 src/ui/pages/processes/mod.rs:527 msgid "End Processes" msgstr "结束进程" #: data/resources/ui/pages/processes.ui:103 msgid "Search processes" msgstr "搜索进程" #: data/resources/ui/pages/processes.ui:133 #: data/resources/ui/pages/processes.ui:135 msgid "Show Process Options" msgstr "显示进程选项" #: data/resources/ui/pages/processes.ui:146 #: data/resources/ui/pages/processes.ui:148 msgid "Show Process Information" msgstr "显示进程信息" #: data/resources/ui/shortcuts.ui:6 msgctxt "shortcut window" msgid "General" msgstr "常规" #: data/resources/ui/shortcuts.ui:9 msgctxt "shortcut window" msgid "Preferences" msgstr "首选项" #: data/resources/ui/shortcuts.ui:15 msgctxt "shortcut window" msgid "Show Shortcuts" msgstr "显示快捷键" #: data/resources/ui/shortcuts.ui:21 msgctxt "shortcut window" msgid "Quit" msgstr "退出" #: data/resources/ui/shortcuts.ui:29 msgctxt "shortcut window" msgid "Apps/Processes" msgstr "应用/进程" #: data/resources/ui/shortcuts.ui:32 msgctxt "shortcut window" msgid "Toggle Search Field" msgstr "切换搜索栏" #: data/resources/ui/shortcuts.ui:38 msgctxt "shortcut window" msgid "End App/Process" msgstr "结束应用/进程" #: data/resources/ui/shortcuts.ui:44 msgctxt "shortcut window" msgid "Kill App/Process" msgstr "杀死应用/进程" #: data/resources/ui/shortcuts.ui:50 msgctxt "shortcut window" msgid "Halt App/Process" msgstr "暂停应用/进程" #: data/resources/ui/shortcuts.ui:56 msgctxt "shortcut window" msgid "Continue App/Process" msgstr "继续应用/进程" #: data/resources/ui/shortcuts.ui:62 msgctxt "shortcut window" msgid "Show Information for App/Process" msgstr "显示应用/进程信息" #: data/resources/ui/shortcuts.ui:68 msgctxt "shortcut window" msgid "Show Process Options" msgstr "显示进程选项" #: data/resources/ui/window.ui:6 msgid "Preferences" msgstr "首选项" #: data/resources/ui/window.ui:10 msgid "Keyboard Shortcuts" msgstr "键盘快捷键" #: data/resources/ui/window.ui:14 msgid "About Resources" msgstr "关于资源" #: data/resources/ui/window.ui:88 data/resources/ui/window.ui:128 msgid "Search" msgstr "搜索" #: data/resources/ui/window.ui:90 data/resources/ui/window.ui:130 msgid "Toggle search field" msgstr "切换搜索栏" #: src/application.rs:274 msgid "The Nalux Team" msgstr "Nalux 团队" #: src/application.rs:282 msgid "Report Issues" msgstr "报告问题" #. Translator credits. Replace "translator-credits" with your name/username, and optionally an email or URL. #. One name per line, please do not remove previous names. #: src/application.rs:288 msgid "translator-credits" msgstr "" "Alex3236 , 2024.\n" "nicolasyang , 2024.\n" "lumingzh , 2025." #: src/application.rs:289 msgid "Icon by" msgstr "图标作者" #: src/ui/dialogs/app_dialog.rs:155 src/ui/dialogs/process_dialog.rs:133 #: src/ui/dialogs/process_dialog.rs:137 src/ui/dialogs/process_dialog.rs:146 #: src/ui/dialogs/process_dialog.rs:148 src/ui/dialogs/process_dialog.rs:171 #: src/ui/dialogs/process_dialog.rs:178 src/ui/dialogs/process_dialog.rs:185 #: src/ui/dialogs/process_dialog.rs:192 src/ui/pages/applications/mod.rs:948 #: src/ui/pages/applications/mod.rs:1074 src/ui/pages/battery.rs:205 #: src/ui/pages/battery.rs:225 src/ui/pages/battery.rs:231 #: src/ui/pages/battery.rs:234 src/ui/pages/battery.rs:265 #: src/ui/pages/battery.rs:289 src/ui/pages/battery.rs:291 #: src/ui/pages/battery.rs:301 src/ui/pages/cpu.rs:243 src/ui/pages/cpu.rs:258 #: src/ui/pages/cpu.rs:278 src/ui/pages/cpu.rs:284 src/ui/pages/cpu.rs:290 #: src/ui/pages/cpu.rs:296 src/ui/pages/cpu.rs:300 src/ui/pages/cpu.rs:303 #: src/ui/pages/cpu.rs:341 src/ui/pages/cpu.rs:448 src/ui/pages/drive.rs:319 #: src/ui/pages/drive.rs:350 src/ui/pages/drive.rs:352 #: src/ui/pages/drive.rs:381 src/ui/pages/drive.rs:383 #: src/ui/pages/drive.rs:399 src/ui/pages/drive.rs:400 #: src/ui/pages/drive.rs:407 src/ui/pages/drive.rs:417 #: src/ui/pages/drive.rs:427 src/ui/pages/drive.rs:433 src/ui/pages/gpu.rs:245 #: src/ui/pages/gpu.rs:252 src/ui/pages/gpu.rs:297 src/ui/pages/gpu.rs:322 #: src/ui/pages/gpu.rs:325 src/ui/pages/gpu.rs:336 src/ui/pages/gpu.rs:377 #: src/ui/pages/gpu.rs:384 src/ui/pages/gpu.rs:396 src/ui/pages/gpu.rs:403 #: src/ui/pages/gpu.rs:407 src/ui/pages/gpu.rs:437 src/ui/pages/gpu.rs:443 #: src/ui/pages/memory.rs:227 src/ui/pages/memory.rs:228 #: src/ui/pages/memory.rs:232 src/ui/pages/memory.rs:233 #: src/ui/pages/memory.rs:237 src/ui/pages/memory.rs:238 #: src/ui/pages/memory.rs:266 src/ui/pages/memory.rs:327 #: src/ui/pages/network.rs:252 src/ui/pages/network.rs:259 #: src/ui/pages/network.rs:266 src/ui/pages/network.rs:272 #: src/ui/pages/network.rs:275 src/ui/pages/network.rs:285 #: src/ui/pages/network.rs:292 src/ui/pages/network.rs:302 #: src/ui/pages/network.rs:370 src/ui/pages/network.rs:373 #: src/ui/pages/network.rs:375 src/ui/pages/network.rs:404 #: src/ui/pages/network.rs:407 src/ui/pages/network.rs:409 #: src/ui/pages/network.rs:417 src/ui/pages/network.rs:424 #: src/ui/pages/network.rs:434 src/ui/pages/processes/mod.rs:1224 #: src/ui/pages/processes/mod.rs:1291 src/ui/pages/processes/mod.rs:1358 #: src/ui/pages/processes/mod.rs:1425 src/ui/pages/processes/mod.rs:1911 #: src/ui/pages/processes/mod.rs:1913 src/utils/battery.rs:152 #: src/utils/drive.rs:137 src/utils/gpu/mod.rs:279 src/utils/gpu/mod.rs:291 #: src/utils/link/mod.rs:61 src/utils/npu/mod.rs:244 src/utils/npu/mod.rs:250 msgid "N/A" msgstr "不可用" #: src/ui/dialogs/process_options_dialog.rs:147 src/ui/pages/cpu.rs:257 #: src/ui/pages/cpu.rs:417 src/ui/pages/cpu.rs:421 msgid "CPU {}" msgstr "处理器 {}" #: src/ui/pages/applications/application_entry.rs:190 src/ui/pages/drive.rs:414 #: src/ui/pages/drive.rs:424 src/ui/pages/processes/process_entry.rs:211 msgid "No" msgstr "否" #: src/ui/pages/applications/application_entry.rs:191 #: src/ui/pages/processes/process_entry.rs:212 msgid "Yes (Flatpak)" msgstr "是 (Flatpak)" #: src/ui/pages/applications/application_entry.rs:192 #: src/ui/pages/processes/process_entry.rs:213 msgid "Yes (Snap)" msgstr "是 (Snap)" #: src/ui/pages/applications/mod.rs:660 msgid "Running Apps: {}" msgstr "正在运行的应用:{}" #: src/ui/pages/applications/mod.rs:700 src/ui/pages/processes/mod.rs:862 msgid "Cancel" msgstr "取消" #: src/ui/pages/applications/mod.rs:746 msgid "App" msgstr "应用" #: src/ui/pages/applications/mod.rs:1539 src/ui/pages/processes/mod.rs:2073 msgid "End {}?" msgstr "结束 {}?" #: src/ui/pages/applications/mod.rs:1540 src/ui/pages/processes/mod.rs:2074 msgid "Halt {}?" msgstr "暂停 {}?" #: src/ui/pages/applications/mod.rs:1541 src/ui/pages/processes/mod.rs:2075 msgid "Kill {}?" msgstr "杀死 {}?" #: src/ui/pages/applications/mod.rs:1542 src/ui/pages/processes/mod.rs:2076 msgid "Continue {}?" msgstr "继续 {}?" #: src/ui/pages/applications/mod.rs:1548 src/ui/pages/processes/mod.rs:2111 msgid "Unsaved work might be lost." msgstr "可能会丢失未保存的工作。" #: src/ui/pages/applications/mod.rs:1550 msgid "" "Halting an app can come with serious risks such as losing data and security " "implications. Use with caution." msgstr "暂停应用可能会带来严重的风险,例如数据丢失和安全问题。请谨慎使用。" #: src/ui/pages/applications/mod.rs:1553 msgid "" "Killing an app can come with serious risks such as losing data and security " "implications. Use with caution." msgstr "杀死应用可能会带来严重的风险,例如数据丢失和安全问题。请谨慎使用。" #: src/ui/pages/battery.rs:102 src/utils/battery.rs:258 msgid "Battery" msgstr "电池" #: src/ui/pages/battery.rs:210 msgid "Battery Charge" msgstr "电池电量" #: src/ui/pages/battery.rs:279 src/ui/pages/cpu.rs:438 #: src/ui/pages/drive.rs:344 src/ui/pages/drive.rs:375 src/ui/pages/gpu.rs:429 #: src/ui/pages/network.rs:362 src/ui/pages/network.rs:396 msgid "Highest:" msgstr "最高:" #: src/ui/pages/cpu.rs:242 src/ui/pages/gpu.rs:212 msgid "Total Usage" msgstr "总使用量" #: src/ui/pages/cpu.rs:271 src/ui/pages/gpu.rs:239 msgid "Temperature" msgstr "温度" #: src/ui/pages/drive.rs:126 msgid "Drive" msgstr "驱动器" #: src/ui/pages/drive.rs:236 msgid "Drive Activity" msgstr "驱动器活动" #: src/ui/pages/drive.rs:243 msgid "Read Speed" msgstr "读取速度" #: src/ui/pages/drive.rs:247 msgid "Write Speed" msgstr "写入速度" #: src/ui/pages/drive.rs:412 src/ui/pages/drive.rs:422 msgid "Yes" msgstr "是" #. Translators: This is an abbreviation for "Read" and "Write". This is displayed in the sidebar so your #. translation should preferably be quite short or an abbreviation #: src/ui/pages/drive.rs:440 msgid "R: {} · W: {}" msgstr "读:{} · 写:{}" #: src/ui/pages/gpu.rs:220 msgid "Video Encoder/Decoder Usage" msgstr "视频编解码器占用" #: src/ui/pages/gpu.rs:226 msgid "Video Encoder Usage" msgstr "视频编码器占用" #: src/ui/pages/gpu.rs:231 msgid "Video Decoder Usage" msgstr "视频解码器占用" #: src/ui/pages/gpu.rs:236 msgid "Video Memory Usage" msgstr "显存占用" #. Translators: This will be displayed in the sidebar, please try to keep your translation as short as (or even #. shorter than) 'Memory' #: src/ui/pages/gpu.rs:415 msgid "Memory: {}" msgstr "内存:{}" #: src/ui/pages/memory.rs:262 msgid "{} of {}" msgstr "{} 共 {}" #: src/ui/pages/memory.rs:265 msgid "{} MT/s" msgstr "{} MT/s" #. Translators: This will be displayed in the sidebar, so your translation for "Swap" should #. preferably be quite short or an abbreviation #: src/ui/pages/memory.rs:346 msgid "{} / {} · Swap: {} %" msgstr "{} / {} · 交换:{} %" #: src/ui/pages/network.rs:127 src/utils/network.rs:135 msgid "Network Interface" msgstr "网络接口" #: src/ui/pages/network.rs:241 msgid "Receiving" msgstr "正在接收" #: src/ui/pages/network.rs:245 msgid "Sending" msgstr "正在发送" #. Translators: This is an abbreviation for "Receive" and "Send". This is displayed in the sidebar so #. your translation should preferably be quite short or an abbreviation #: src/ui/pages/network.rs:445 msgid "R: {} · S: {}" msgstr "收:{} · 发:{}" #: src/ui/pages/processes/mod.rs:813 msgid "Running Processes: {}" msgstr "正在运行的进程:{}" #: src/ui/pages/processes/mod.rs:911 msgid "Process" msgstr "进程" #: src/ui/pages/processes/mod.rs:2083 msgid "End process?" msgid_plural "End {} processes?" msgstr[0] "结束 {} 个进程?" #: src/ui/pages/processes/mod.rs:2089 msgid "Halt process?" msgid_plural "Halt {} processes?" msgstr[0] "暂停 {} 个进程?" #: src/ui/pages/processes/mod.rs:2095 src/ui/pages/processes/mod.rs:2101 msgid "Kill process?" msgid_plural "Kill {} processes?" msgstr[0] "杀死 {} 个进程?" #: src/ui/pages/processes/mod.rs:2113 msgid "" "Halting a process can come with serious risks such as losing data and " "security implications. Use with caution." msgstr "暂停进程可能会带来严重的风险,例如数据丢失和安全问题。请谨慎使用。" #: src/ui/pages/processes/mod.rs:2116 msgid "" "Killing a process can come with serious risks such as losing data and " "security implications. Use with caution." msgstr "杀死进程可能会带来严重的风险,例如数据丢失和安全问题。请谨慎使用。" #: src/ui/window.rs:466 msgid "GPU {}" msgstr "显卡 {}" #: src/ui/window.rs:496 msgid "NPU {}" msgstr "NPU {}" #: src/ui/window.rs:498 msgid "NPU" msgstr "NPU" #: src/ui/window.rs:1174 msgid "Successfully adjusted {}" msgstr "已成功调整 {}" #: src/ui/window.rs:1175 msgid "There was a problem adjusting {}" msgstr "调整 {} 时出现问题" #: src/ui/window.rs:1257 msgid "Successfully ended {}" msgstr "已成功结束 {}" #: src/ui/window.rs:1258 msgid "Successfully halted {}" msgstr "已成功暂停 {}" #: src/ui/window.rs:1259 msgid "Successfully killed {}" msgstr "已成功杀死 {}" #: src/ui/window.rs:1260 msgid "Successfully continued {}" msgstr "已成功继续 {}" #: src/ui/window.rs:1267 msgid "Successfully ended the process" msgid_plural "Successfully ended {} processes" msgstr[0] "已成功结束 {} 个进程" #: src/ui/window.rs:1273 msgid "Successfully halted the process" msgid_plural "Successfully halted {} processes" msgstr[0] "已成功暂停 {} 个进程" #: src/ui/window.rs:1279 msgid "Successfully killed the process" msgid_plural "Successfully killed {} processes" msgstr[0] "已成功杀死 {} 个进程" #: src/ui/window.rs:1285 msgid "Successfully continued the process" msgid_plural "Successfully continued {} processes" msgstr[0] "已成功继续 {} 个进程" #: src/ui/window.rs:1296 msgid "There was a problem ending a process" msgid_plural "There were problems ending {} processes" msgstr[0] "结束 {} 个进程时出现问题" #: src/ui/window.rs:1302 msgid "There was a problem halting a process" msgid_plural "There were problems halting {} processes" msgstr[0] "暂停 {} 个进程时出现问题" #: src/ui/window.rs:1308 msgid "There was a problem killing a process" msgid_plural "There were problems killing {} processes" msgstr[0] "杀死 {} 个进程时出现问题" #: src/ui/window.rs:1314 msgid "There was a problem continuing a process" msgid_plural "There were problems continuing {} processes" msgstr[0] "继续 {} 个进程时出现问题" #: src/ui/window.rs:1324 msgid "There was a problem ending {}" msgstr "结束 {} 时出现问题" #: src/ui/window.rs:1325 msgid "There was a problem halting {}" msgstr "暂停 {} 时出现问题" #: src/ui/window.rs:1326 msgid "There was a problem killing {}" msgstr "杀死 {} 时出现问题" #: src/ui/window.rs:1327 msgid "There was a problem continuing {}" msgstr "继续 {} 时出现问题" #: src/utils/app.rs:222 msgid "System Processes" msgstr "系统进程" #: src/utils/battery.rs:93 msgid "Charging" msgstr "充电中" #: src/utils/battery.rs:94 msgid "Discharging" msgstr "放电中" #: src/utils/battery.rs:95 msgid "Empty" msgstr "已耗尽" #: src/utils/battery.rs:96 msgid "Full" msgstr "已充满" #: src/utils/battery.rs:97 msgid "Unknown" msgstr "未知" #: src/utils/battery.rs:143 msgid "Nickel-Metal Hydride" msgstr "镍氢" #: src/utils/battery.rs:144 msgid "Nickel-Cadmium" msgstr "镍镉" #: src/utils/battery.rs:145 msgid "Nickel-Zinc" msgstr "镍锌" #: src/utils/battery.rs:146 msgid "Lead-Acid" msgstr "铅酸" #: src/utils/battery.rs:147 msgid "Lithium-Ion" msgstr "锂离子" #: src/utils/battery.rs:148 msgid "Lithium Iron Phosphate" msgstr "磷酸铁锂" #: src/utils/battery.rs:149 msgid "Lithium Polymer" msgstr "锂离子聚合物" #: src/utils/battery.rs:151 msgid "Rechargeable Alkaline Managanese" msgstr "可充电碱性" #: src/utils/battery.rs:256 msgid "{} Battery" msgstr "{}电池" #: src/utils/units.rs:91 msgid "{} K" msgstr "{} K" #: src/utils/units.rs:93 msgid "{} °C" msgstr "{} °C" #: src/utils/units.rs:95 msgid "{} °F" msgstr "{} °F" #: src/utils/units.rs:113 src/utils/units.rs:127 src/utils/units.rs:147 #: src/utils/units.rs:161 msgid "{} B" msgstr "{} B" #: src/utils/units.rs:114 src/utils/units.rs:128 msgid "{} kB" msgstr "{} kB" #: src/utils/units.rs:115 src/utils/units.rs:129 msgid "{} MB" msgstr "{} MB" #: src/utils/units.rs:116 src/utils/units.rs:130 msgid "{} GB" msgstr "{} GB" #: src/utils/units.rs:117 src/utils/units.rs:131 msgid "{} TB" msgstr "{} TB" #: src/utils/units.rs:118 src/utils/units.rs:132 msgid "{} PB" msgstr "{} PB" #: src/utils/units.rs:119 src/utils/units.rs:133 msgid "{} EB" msgstr "{} EB" #: src/utils/units.rs:120 src/utils/units.rs:134 msgid "{} ZB" msgstr "{} ZB" #: src/utils/units.rs:121 src/utils/units.rs:135 msgid "{} YB" msgstr "{} YB" #: src/utils/units.rs:122 src/utils/units.rs:136 msgid "{} RB" msgstr "{} RB" #: src/utils/units.rs:123 src/utils/units.rs:137 msgid "{} QB" msgstr "{} QB" #: src/utils/units.rs:148 src/utils/units.rs:162 msgid "{} KiB" msgstr "{} KiB" #: src/utils/units.rs:149 src/utils/units.rs:163 msgid "{} MiB" msgstr "{} MiB" #: src/utils/units.rs:150 src/utils/units.rs:164 msgid "{} GiB" msgstr "{} GiB" #: src/utils/units.rs:151 src/utils/units.rs:165 msgid "{} TiB" msgstr "{} TiB" #: src/utils/units.rs:152 src/utils/units.rs:166 msgid "{} PiB" msgstr "{} PiB" #: src/utils/units.rs:153 src/utils/units.rs:167 msgid "{} EiB" msgstr "{} EiB" #: src/utils/units.rs:154 src/utils/units.rs:168 msgid "{} ZiB" msgstr "{} ZiB" #: src/utils/units.rs:155 src/utils/units.rs:169 msgid "{} YiB" msgstr "{} YiB" #: src/utils/units.rs:156 src/utils/units.rs:170 msgid "{} RiB" msgstr "{} RiB" #: src/utils/units.rs:157 src/utils/units.rs:171 msgid "{} QiB" msgstr "{} QiB" #: src/utils/units.rs:198 src/utils/units.rs:215 msgid "{} B/s" msgstr "{} B/s" #: src/utils/units.rs:199 msgid "{} kB/s" msgstr "{} kB/s" #: src/utils/units.rs:200 msgid "{} MB/s" msgstr "{} MB/s" #: src/utils/units.rs:201 msgid "{} GB/s" msgstr "{} GB/s" #: src/utils/units.rs:202 msgid "{} TB/s" msgstr "{} TB/s" #: src/utils/units.rs:203 msgid "{} PB/s" msgstr "{} PB/s" #: src/utils/units.rs:204 msgid "{} EB/s" msgstr "{} EB/s" #: src/utils/units.rs:205 msgid "{} ZB/s" msgstr "{} ZB/s" #: src/utils/units.rs:206 msgid "{} YB/s" msgstr "{} YB/s" #: src/utils/units.rs:207 msgid "{} RB/s" msgstr "{} RB/s" #: src/utils/units.rs:208 msgid "{} QB/s" msgstr "{} QB/s" #: src/utils/units.rs:216 msgid "{} KiB/s" msgstr "{} KiB/s" #: src/utils/units.rs:217 msgid "{} MiB/s" msgstr "{} MiB/s" #: src/utils/units.rs:218 msgid "{} GiB/s" msgstr "{} GiB/s" #: src/utils/units.rs:219 msgid "{} TiB/s" msgstr "{} TiB/s" #: src/utils/units.rs:220 msgid "{} PiB/s" msgstr "{} PiB/s" #: src/utils/units.rs:221 msgid "{} EiB/s" msgstr "{} EiB/s" #: src/utils/units.rs:222 msgid "{} ZiB/s" msgstr "{} ZiB/s" #: src/utils/units.rs:223 msgid "{} YiB/s" msgstr "{} YiB/s" #: src/utils/units.rs:224 msgid "{} RiB/s" msgstr "{} RiB/s" #: src/utils/units.rs:225 msgid "{} QiB/s" msgstr "{} QiB/s" #: src/utils/units.rs:239 src/utils/units.rs:256 msgid "{} b/s" msgstr "{} b/s" #: src/utils/units.rs:240 msgid "{} kb/s" msgstr "{} kb/s" #: src/utils/units.rs:241 msgid "{} Mb/s" msgstr "{} Mb/s" #: src/utils/units.rs:242 msgid "{} Gb/s" msgstr "{} Gb/s" #: src/utils/units.rs:243 msgid "{} Tb/s" msgstr "{} Tb/s" #: src/utils/units.rs:244 msgid "{} Pb/s" msgstr "{} Pb/s" #: src/utils/units.rs:245 msgid "{} Eb/s" msgstr "{} Eb/s" #: src/utils/units.rs:246 msgid "{} Zb/s" msgstr "{} Zb/s" #: src/utils/units.rs:247 msgid "{} Yb/s" msgstr "{} Yb/s" #: src/utils/units.rs:248 msgid "{} Rb/s" msgstr "{} Rb/s" #: src/utils/units.rs:249 msgid "{} Qb/s" msgstr "{} Qb/s" #: src/utils/units.rs:257 msgid "{} Kib/s" msgstr "{} Kib/s" #: src/utils/units.rs:258 msgid "{} Mib/s" msgstr "{} Mib/s" #: src/utils/units.rs:259 msgid "{} Gib/s" msgstr "{} Gib/s" #: src/utils/units.rs:260 msgid "{} Tib/s" msgstr "{} Tib/s" #: src/utils/units.rs:261 msgid "{} Pib/s" msgstr "{} Pib/s" #: src/utils/units.rs:262 msgid "{} Eib/s" msgstr "{} Eib/s" #: src/utils/units.rs:263 msgid "{} Zib/s" msgstr "{} Zib/s" #: src/utils/units.rs:264 msgid "{} Yib/s" msgstr "{} Yib/s" #: src/utils/units.rs:265 msgid "{} Rib/s" msgstr "{} Rib/s" #: src/utils/units.rs:266 msgid "{} Qib/s" msgstr "{} Qib/s" #: src/utils/units.rs:273 msgid "{} Hz" msgstr "{} Hz" #: src/utils/units.rs:274 msgid "{} kHz" msgstr "{} kHz" #: src/utils/units.rs:275 msgid "{} MHz" msgstr "{} MHz" #: src/utils/units.rs:276 msgid "{} GHz" msgstr "{} GHz" #: src/utils/units.rs:277 msgid "{} THz" msgstr "{} THz" #: src/utils/units.rs:278 msgid "{} PHz" msgstr "{} PHz" #: src/utils/units.rs:279 msgid "{} EHz" msgstr "{} EHz" #: src/utils/units.rs:280 msgid "{} ZHz" msgstr "{} ZHz" #: src/utils/units.rs:281 msgid "{} YHz" msgstr "{} YHz" #: src/utils/units.rs:282 msgid "{} RHz" msgstr "{} RHz" #: src/utils/units.rs:283 msgid "{} QHz" msgstr "{} QHz" #: src/utils/units.rs:290 msgid "{} W" msgstr "{} W" #: src/utils/units.rs:291 msgid "{} kW" msgstr "{} kW" #: src/utils/units.rs:292 msgid "{} MW" msgstr "{} MW" #: src/utils/units.rs:293 msgid "{} GW" msgstr "{} GW" #: src/utils/units.rs:294 msgid "{} TW" msgstr "{} TW" #: src/utils/units.rs:295 msgid "{} PW" msgstr "{} PW" #: src/utils/units.rs:296 msgid "{} EW" msgstr "{} EW" #: src/utils/units.rs:297 msgid "{} ZW" msgstr "{} ZW" #: src/utils/units.rs:298 msgid "{} YW" msgstr "{} YW" #: src/utils/units.rs:299 msgid "{} RW" msgstr "{} RW" #: src/utils/units.rs:300 msgid "{} QW" msgstr "{} QW" #: src/utils/units.rs:309 src/utils/units.rs:323 msgid "{} Wh" msgstr "{} Wh" #: src/utils/units.rs:310 src/utils/units.rs:324 msgid "{} kWh" msgstr "{} kWh" #: src/utils/units.rs:311 src/utils/units.rs:325 msgid "{} MWh" msgstr "{} MWh" #: src/utils/units.rs:312 src/utils/units.rs:326 msgid "{} GWh" msgstr "{} GWh" #: src/utils/units.rs:313 src/utils/units.rs:327 msgid "{} TWh" msgstr "{} TWh" #: src/utils/units.rs:314 src/utils/units.rs:328 msgid "{} PWh" msgstr "{} PWh" #: src/utils/units.rs:315 src/utils/units.rs:329 msgid "{} EWh" msgstr "{} EWh" #: src/utils/units.rs:316 src/utils/units.rs:330 msgid "{} ZWh" msgstr "{} ZWh" #: src/utils/units.rs:317 src/utils/units.rs:331 msgid "{} YWh" msgstr "{} YWh" #: src/utils/units.rs:318 src/utils/units.rs:332 msgid "{} RWh" msgstr "{} RWh" #: src/utils/units.rs:319 src/utils/units.rs:333 msgid "{} QWh" msgstr "{} QWh" #: src/utils/drive.rs:129 src/utils/drive.rs:208 msgid "CD/DVD/Blu-ray Drive" msgstr "CD/DVD/蓝光光驱" #: src/utils/drive.rs:130 msgid "eMMC Storage" msgstr "eMMC 存储" #: src/utils/drive.rs:131 msgid "Flash Storage" msgstr "闪存" #: src/utils/drive.rs:132 src/utils/drive.rs:209 msgid "Floppy Drive" msgstr "软盘" #: src/utils/drive.rs:133 msgid "Hard Disk Drive" msgstr "硬盘" #: src/utils/drive.rs:134 msgid "Loop Device" msgstr "Loop 设备" #: src/utils/drive.rs:135 msgid "Mapped Device" msgstr "映射设备" #: src/utils/drive.rs:136 msgid "NVMe Drive" msgstr "NVMe 磁盘" #: src/utils/drive.rs:138 msgid "Software Raid" msgstr "软 RAID" #: src/utils/drive.rs:139 msgid "RAM Disk" msgstr "RAM 盘" #: src/utils/drive.rs:140 msgid "Solid State Drive" msgstr "固态硬盘" #: src/utils/drive.rs:141 msgid "ZFS Volume" msgstr "ZFS 卷" #: src/utils/drive.rs:142 msgid "Compressed RAM Disk (zram)" msgstr "压缩 RAM 盘(ZRAM)" #: src/utils/drive.rs:210 msgid "{} Loop Device" msgstr "{} Loop 设备" #: src/utils/drive.rs:211 msgid "{} Mapped Device" msgstr "{} 映射设备" #: src/utils/drive.rs:212 msgid "{} RAID" msgstr "{} RAID" #: src/utils/drive.rs:213 msgid "{} RAM Disk" msgstr "{} RAM 盘" #: src/utils/drive.rs:214 msgid "{} zram Device" msgstr "{} ZRAM 设备" #: src/utils/drive.rs:215 msgid "{} ZFS Volume" msgstr "{} ZFS 卷" #: src/utils/drive.rs:216 msgid "{} Drive" msgstr "{} 磁盘" #: src/utils/network.rs:123 msgid "Bluetooth Tether" msgstr "蓝牙共享网络" #: src/utils/network.rs:124 msgid "Network Bridge" msgstr "网络桥接" #: src/utils/network.rs:125 msgid "Ethernet Connection" msgstr "以太网络连接" #: src/utils/network.rs:126 msgid "Docker Bridge" msgstr "Docker 网桥" #: src/utils/network.rs:127 msgid "InfiniBand Connection" msgstr "InfiniBand 连接" #: src/utils/network.rs:128 msgid "Serial Line IP Connection" msgstr "串行线路 IP 连接" #: src/utils/network.rs:129 msgid "Virtual Ethernet Device" msgstr "虚拟网卡设备" #: src/utils/network.rs:130 msgid "VM Network Bridge" msgstr "VM 网络桥接" #: src/utils/network.rs:131 msgid "VPN Tunnel" msgstr "VPN 隧道" #: src/utils/network.rs:132 msgid "VPN Tunnel (WireGuard)" msgstr "VPN 隧道 (WireGuard)" #: src/utils/network.rs:133 msgid "Wi-Fi Connection" msgstr "Wi-Fi 连接" #: src/utils/network.rs:134 msgid "WWAN Connection" msgstr "WWAN 连接" #~ msgid "Memory Usage" #~ msgstr "内存占用" #~ msgid "Show Search Fields on Launch" #~ msgstr "在启动时显示搜索框" resources-1.9.1/po/zh_TW.po000066400000000000000000000543271510634446000155630ustar00rootroot00000000000000# # nokyan , 2023. # msgid "" msgstr "" "Project-Id-Version: resources\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2022-12-25 15:51+0100\n" "PO-Revision-Date: 2023-10-14 18:05+0800\n" "Last-Translator: Peter Dave Hello \n" "Language-Team: Chinese (traditional)\n" "Language: zh_TW\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" #: data/net.nokyan.Resources.desktop.in.in:3 #: data/net.nokyan.Resources.metainfo.xml.in.in:4 src/application.rs:145 msgid "Resources" msgstr "Resources" #: data/net.nokyan.Resources.desktop.in.in:4 #: data/net.nokyan.Resources.metainfo.xml.in.in:5 msgid "Monitor your system resources and processes" msgstr "監控您的系統資源與處理程序" #: data/net.nokyan.Resources.desktop.in.in:10 msgid "" "System;Resources;Monitor;Processes;Usage;Task;Manager;CPU;RAM;Memory;GPU;" msgstr "系統;資源;監控器;處理程序;使用情形;任務;管理員;CPU;RAM;記憶體;GPU;" #: data/net.nokyan.Resources.gschema.xml.in:6 msgid "Window width" msgstr "視窗寬度" #: data/net.nokyan.Resources.gschema.xml.in:10 msgid "Window height" msgstr "視窗高度" #: data/net.nokyan.Resources.gschema.xml.in:14 msgid "Window maximized state" msgstr "視窗最大化狀態" #: data/net.nokyan.Resources.gschema.xml.in:18 msgid "Temperature unit" msgstr "溫度單位" #: data/net.nokyan.Resources.gschema.xml.in:22 msgid "Unit Prefix Base" msgstr "單位基數設定" #: data/net.nokyan.Resources.gschema.xml.in:26 #: data/resources/ui/dialogs/settings_dialog.ui:48 msgid "Refresh Speed" msgstr "重新整理速度" #: data/net.nokyan.Resources.metainfo.xml.in.in:14 msgid "" "Resources allows you to check the utilization of your system resources and " "control your running processes and applications. It’s designed to be user-" "friendly and feel right at home on a modern desktop by using GNOME’s " "libadwaita." msgstr "" "「Resources」讓您能夠檢查系統資源的使用情形並控制正在執行的處理程序與應用程式。透過使用 GNOME 的 libadwaita,它的設計使得使用者能夠在現代桌面環境中感到親切且易於使用。" #: data/net.nokyan.Resources.metainfo.xml.in.in:17 msgid "Resources supports monitoring the following components:" msgstr "「Resources」支援監控以下元件:" #: data/net.nokyan.Resources.metainfo.xml.in.in:21 src/ui/pages/cpu.rs:188 msgid "CPU" msgstr "CPU" #: data/net.nokyan.Resources.metainfo.xml.in.in:22 #: src/ui/pages/applications/mod.rs:251 src/ui/pages/memory.rs:85 #: src/ui/pages/memory.rs:151 src/ui/pages/processes/mod.rs:296 #: data/resources/ui/window.ui:155 data/resources/ui/window.ui:162 #: data/resources/ui/dialogs/app_dialog.ui:83 #: data/resources/ui/dialogs/process_dialog.ui:70 msgid "Memory" msgstr "記憶體" #: data/net.nokyan.Resources.metainfo.xml.in.in:23 src/ui/pages/gpu.rs:101 #: src/ui/window.rs:230 msgid "GPU" msgstr "GPU" #: data/net.nokyan.Resources.metainfo.xml.in.in:24 msgid "Network Interfaces" msgstr "網路介面" #: data/net.nokyan.Resources.metainfo.xml.in.in:25 msgid "Storage Devices" msgstr "儲存裝置" #: src/application.rs:147 msgid "The Nalux Team" msgstr "Nalux 團隊" #: src/application.rs:155 msgid "Report Issues" msgstr "回報問題" #: src/application.rs:159 msgid "Icon by" msgstr "圖示由" #: src/ui/dialogs/app_dialog.rs:112 src/ui/dialogs/process_dialog.rs:108 #: src/ui/pages/drive.rs:214 src/ui/pages/drive.rs:220 msgid "No" msgstr "否" #: src/ui/dialogs/app_dialog.rs:113 src/ui/dialogs/process_dialog.rs:109 msgid "Yes (Flatpak)" msgstr "是 (Flatpak)" #: src/ui/dialogs/process_dialog.rs:103 src/ui/dialogs/process_dialog.rs:105 #: src/ui/pages/cpu.rs:189 src/ui/pages/cpu.rs:201 src/ui/pages/cpu.rs:216 #: src/ui/pages/cpu.rs:222 src/ui/pages/cpu.rs:228 src/ui/pages/cpu.rs:234 #: src/ui/pages/cpu.rs:238 src/ui/pages/cpu.rs:241 src/ui/pages/cpu.rs:301 #: src/ui/pages/drive.rs:186 src/ui/pages/gpu.rs:177 src/ui/pages/gpu.rs:192 #: src/ui/pages/gpu.rs:210 src/ui/pages/gpu.rs:218 src/ui/pages/gpu.rs:224 #: src/ui/pages/gpu.rs:231 src/ui/pages/gpu.rs:238 src/ui/pages/gpu.rs:244 #: src/ui/pages/gpu.rs:250 src/ui/pages/memory.rs:183 #: src/ui/pages/memory.rs:187 src/ui/pages/memory.rs:191 #: src/ui/pages/memory.rs:245 src/ui/pages/network.rs:198 #: src/ui/pages/network.rs:205 src/ui/pages/network.rs:211 #: src/ui/pages/network.rs:217 src/ui/pages/network.rs:219 src/utils/gpu.rs:82 #: src/utils/gpu.rs:85 msgid "N/A" msgstr "N/A" #: src/ui/pages/applications/mod.rs:107 data/resources/ui/window.ui:62 #: data/resources/ui/window.ui:69 msgid "Applications" msgstr "應用程式" #: src/ui/pages/applications/mod.rs:228 msgid "Application" msgstr "應用程式" #: src/ui/pages/applications/mod.rs:274 src/ui/pages/cpu.rs:102 #: src/ui/pages/processes/mod.rs:319 src/ui/window.rs:219 #: data/resources/ui/window.ui:124 data/resources/ui/window.ui:131 #: data/resources/ui/dialogs/app_dialog.ui:74 #: data/resources/ui/dialogs/process_dialog.ui:61 msgid "Processor" msgstr "處理器" #: src/ui/pages/applications/mod.rs:481 src/ui/pages/processes/mod.rs:506 msgid "Cancel" msgstr "取消" #: src/ui/pages/cpu.rs:200 msgid "CPU {}" msgstr "CPU {}" #: src/ui/pages/drive.rs:102 msgid "Drive" msgstr "磁碟機" #: src/ui/pages/drive.rs:175 msgid "Total Usage" msgstr "總使用量" #: src/ui/pages/drive.rs:180 src/ui/window.rs:310 msgid "CD/DVD/Blu-ray Drive" msgstr "CD/DVD/藍光磁碟機" #: src/ui/pages/drive.rs:181 msgid "eMMC Storage" msgstr "eMMC 儲存裝置" #: src/ui/pages/drive.rs:182 msgid "Flash Storage" msgstr "快閃記憶體儲存裝置" #: src/ui/pages/drive.rs:183 src/ui/window.rs:311 msgid "Floppy Drive" msgstr "軟碟機" #: src/ui/pages/drive.rs:184 msgid "Hard Disk Drive" msgstr "硬碟機" #: src/ui/pages/drive.rs:185 msgid "NVMe Drive" msgstr "NVMe 磁碟機" #: src/ui/pages/drive.rs:187 msgid "Solid State Drive" msgstr "固態硬碟" #: src/ui/pages/drive.rs:212 src/ui/pages/drive.rs:218 msgid "Yes" msgstr "是" #: src/ui/pages/gpu.rs:170 msgid "GPU Usage" msgstr "GPU 使用情形" #: src/ui/pages/gpu.rs:173 msgid "Video Memory Usage" msgstr "視訊記憶體使用情形" #: src/ui/pages/memory.rs:154 msgid "Swap" msgstr "Swap" #: src/ui/pages/memory.rs:193 msgid "{} of {}" msgstr "已用 {},總計 {}" #: src/ui/pages/network.rs:101 src/ui/window.rs:358 msgid "Network Interface" msgstr "網路介面" #: src/ui/pages/network.rs:185 msgid "Receiving" msgstr "接收中" #: src/ui/pages/network.rs:189 msgid "Sending" msgstr "傳送中" #: src/ui/pages/network.rs:268 src/ui/pages/network.rs:277 msgid "Highest:" msgstr "最高:" #: src/ui/pages/processes/mod.rs:111 data/resources/ui/window.ui:93 #: data/resources/ui/window.ui:100 msgid "Processes" msgstr "處理程序" #: src/ui/pages/processes/mod.rs:232 msgid "Process" msgstr "處理程序" #: src/ui/pages/processes/mod.rs:258 #: data/resources/ui/dialogs/process_dialog.ui:84 msgid "Process ID" msgstr "處理程序 ID" #: src/ui/pages/processes/mod.rs:277 #: data/resources/ui/dialogs/process_dialog.ui:102 msgid "User" msgstr "使用者" #: src/ui/pages/processes/mod.rs:542 msgid "root" msgstr "root" #: src/ui/window.rs:228 msgid "GPU {}" msgstr "GPU {}" #: src/ui/window.rs:312 msgid "{} Drive" msgstr "{} 磁碟機" #: src/ui/window.rs:351 msgid "Ethernet Connection" msgstr "乙太網路連線" #: src/ui/window.rs:352 msgid "InfiniBand Connection" msgstr "InfiniBand 連線" #: src/ui/window.rs:353 msgid "Serial Line IP Connection" msgstr "串列線 IP 連線" #: src/ui/window.rs:354 msgid "Wi-Fi Connection" msgstr "Wi-Fi 連線" #: src/ui/window.rs:355 msgid "WWAN Connection" msgstr "WWAN 連線" #: src/ui/window.rs:356 msgid "Bluetooth Tether" msgstr "藍牙網路共用" #: src/ui/window.rs:357 msgid "VPN Tunnel (WireGuard)" msgstr "VPN 隧道 (WireGuard)" #: src/ui/window.rs:504 msgid "End {}?" msgstr "結束 {}?" #: src/ui/window.rs:505 msgid "Halt {}?" msgstr "暫停 {}?" #: src/ui/window.rs:506 msgid "Kill {}?" msgstr "終止 {}?" #: src/ui/window.rs:507 msgid "Continue {}?" msgstr "繼續 {}?" #: src/ui/window.rs:513 msgid "Unsaved work might be lost." msgstr "未儲存的工作可能會遺失。" #: src/ui/window.rs:514 msgid "" "Halting an application can come with serious risks such as losing data and " "security implications. Use with caution." msgstr "" "暫停應用程式可能會帶來嚴重的風險,例如資料遺失和安全問題。請謹慎使用。" #: src/ui/window.rs:515 msgid "" "Killing an application can come with serious risks such as losing data and " "security implications. Use with caution." msgstr "" "終止應用程式可能會帶來嚴重的風險,例如資料遺失和安全問題。請謹慎使用。" #: src/ui/window.rs:522 msgid "End application" msgstr "結束應用程式" #: src/ui/window.rs:523 msgid "Halt application" msgstr "暫停應用程式" #: src/ui/window.rs:524 msgid "Kill application" msgstr "終止應用程式" #: src/ui/window.rs:525 msgid "Continue application" msgstr "繼續應用程式" #: src/ui/window.rs:531 msgid "Successfully ended {}" msgstr "成功結束 {}" #: src/ui/window.rs:532 msgid "Successfully halted {}" msgstr "成功暫停 {}" #: src/ui/window.rs:533 msgid "Successfully killed {}" msgstr "成功終止 {}" #: src/ui/window.rs:534 msgid "Successfully continued {}" msgstr "成功繼續 {}" #: src/ui/window.rs:541 msgid "There was a problem ending a process" msgid_plural "There were problems ending {} processes" msgstr[0] "結束處理程序時出現問題" msgstr[1] "結束 {} 個處理程序時出現問題" #: src/ui/window.rs:547 msgid "There was a problem halting a process" msgid_plural "There were problems halting {} processes" msgstr[0] "暫停處理程序時出現問題" msgstr[1] "暫停 {} 個處理程序時出現問題" #: src/ui/window.rs:553 msgid "There was a problem killing a process" msgid_plural "There were problems killing {} processes" msgstr[0] "終止處理程序時出現問題" msgstr[1] "終止 {} 個處理程序時出現問題" #: src/ui/window.rs:559 msgid "There was a problem continuing a process" msgid_plural "There were problems continuing {} processes" msgstr[0] "繼續處理程序時出現問題" msgstr[1] "繼續 {} 個處理程序時出現問題" #: src/ui/window.rs:569 msgid "There was a problem ending {}" msgstr "結束 {} 時出現問題" #: src/ui/window.rs:570 msgid "There was a problem halting {}" msgstr "暫停 {} 時出現問題" #: src/ui/window.rs:571 msgid "There was a problem killing {}" msgstr "終止 {} 時出現問題" #: src/ui/window.rs:572 msgid "There was a problem continuing {}" msgstr "繼續 {} 時出現問題" #: src/utils/app.rs:380 msgid "System Processes" msgstr "系統處理程序" #: src/utils/units.rs:51 msgid "{} K" msgstr "{} K" #: src/utils/units.rs:53 msgid "{} °C" msgstr "{} °C" #: src/utils/units.rs:55 msgid "{} °F" msgstr "{} °F" #: src/utils/units.rs:73 src/utils/units.rs:87 src/utils/units.rs:107 #: src/utils/units.rs:121 msgid "{} B" msgstr "{} B" #: src/utils/units.rs:74 src/utils/units.rs:88 msgid "{} kB" msgstr "{} kB" #: src/utils/units.rs:75 src/utils/units.rs:89 msgid "{} MB" msgstr "{} MB" #: src/utils/units.rs:76 src/utils/units.rs:90 msgid "{} GB" msgstr "{} GB" #: src/utils/units.rs:77 src/utils/units.rs:91 msgid "{} TB" msgstr "{} TB" #: src/utils/units.rs:78 src/utils/units.rs:92 msgid "{} PB" msgstr "{} PB" #: src/utils/units.rs:79 src/utils/units.rs:93 msgid "{} EB" msgstr "{} EB" #: src/utils/units.rs:80 src/utils/units.rs:94 msgid "{} ZB" msgstr "{} ZB" #: src/utils/units.rs:81 src/utils/units.rs:95 msgid "{} YB" msgstr "{} YB" #: src/utils/units.rs:82 src/utils/units.rs:96 msgid "{} RB" msgstr "{} RB" #: src/utils/units.rs:83 src/utils/units.rs:97 msgid "{} QB" msgstr "{} QB" #: src/utils/units.rs:108 src/utils/units.rs:122 msgid "{} KiB" msgstr "{} KiB" #: src/utils/units.rs:109 src/utils/units.rs:123 msgid "{} MiB" msgstr "{} MiB" #: src/utils/units.rs:110 src/utils/units.rs:124 msgid "{} GiB" msgstr "{} GiB" #: src/utils/units.rs:111 src/utils/units.rs:125 msgid "{} TiB" msgstr "{} TiB" #: src/utils/units.rs:112 src/utils/units.rs:126 msgid "{} PiB" msgstr "{} PiB" #: src/utils/units.rs:113 src/utils/units.rs:127 msgid "{} EiB" msgstr "{} EiB" #: src/utils/units.rs:114 src/utils/units.rs:128 msgid "{} ZiB" msgstr "{} ZiB" #: src/utils/units.rs:115 src/utils/units.rs:129 msgid "{} YiB" msgstr "{} YiB" #: src/utils/units.rs:116 src/utils/units.rs:130 msgid "{} RiB" msgstr "{} RiB" #: src/utils/units.rs:117 src/utils/units.rs:131 msgid "{} QiB" msgstr "{} QiB" #: src/utils/units.rs:146 src/utils/units.rs:163 msgid "{} B/s" msgstr "{} B/s" #: src/utils/units.rs:147 msgid "{} kB/s" msgstr "{} kB/s" #: src/utils/units.rs:148 msgid "{} MB/s" msgstr "{} MB/s" #: src/utils/units.rs:149 msgid "{} GB/s" msgstr "{} GB/s" #: src/utils/units.rs:150 msgid "{} TB/s" msgstr "{} TB/s" #: src/utils/units.rs:151 msgid "{} PB/s" msgstr "{} PB/s" #: src/utils/units.rs:152 msgid "{} EB/s" msgstr "{} EB/s" #: src/utils/units.rs:153 msgid "{} ZB/s" msgstr "{} ZB/s" #: src/utils/units.rs:154 msgid "{} YB/s" msgstr "{} YB/s" #: src/utils/units.rs:155 msgid "{} RB/s" msgstr "{} RB/s" #: src/utils/units.rs:156 msgid "{} QB/s" msgstr "{} QB/s" #: src/utils/units.rs:164 msgid "{} KiB/s" msgstr "{} KiB/s" #: src/utils/units.rs:165 msgid "{} MiB/s" msgstr "{} MiB/s" #: src/utils/units.rs:166 msgid "{} GiB/s" msgstr "{} GiB/s" #: src/utils/units.rs:167 msgid "{} TiB/s" msgstr "{} TiB/s" #: src/utils/units.rs:168 msgid "{} PiB/s" msgstr "{} PiB/s" #: src/utils/units.rs:169 msgid "{} EiB/s" msgstr "{} EiB/s" #: src/utils/units.rs:170 msgid "{} ZiB/s" msgstr "{} ZiB/s" #: src/utils/units.rs:171 msgid "{} YiB/s" msgstr "{} YiB/s" #: src/utils/units.rs:172 msgid "{} RiB/s" msgstr "{} RiB/s" #: src/utils/units.rs:173 msgid "{} QiB/s" msgstr "{} QiB/s" #: src/utils/units.rs:180 msgid "{} Hz" msgstr "{} Hz" #: src/utils/units.rs:181 msgid "{} kHz" msgstr "{} kHz" #: src/utils/units.rs:182 msgid "{} MHz" msgstr "{} MHz" #: src/utils/units.rs:183 msgid "{} GHz" msgstr "{} GHz" #: src/utils/units.rs:184 msgid "{} THz" msgstr "{} THz" #: src/utils/units.rs:185 msgid "{} PHz" msgstr "{} PHz" #: src/utils/units.rs:186 msgid "{} EHz" msgstr "{} EHz" #: src/utils/units.rs:187 msgid "{} ZHz" msgstr "{} ZHz" #: src/utils/units.rs:188 msgid "{} YHz" msgstr "{} YHz" #: src/utils/units.rs:189 msgid "{} RHz" msgstr "{} RHz" #: src/utils/units.rs:190 msgid "{} QHz" msgstr "{} QHz" #: src/utils/units.rs:197 msgid "{} W" msgstr "{} W" #: src/utils/units.rs:198 msgid "{} kW" msgstr "{} kW" #: src/utils/units.rs:199 msgid "{} MW" msgstr "{} MW" #: src/utils/units.rs:200 msgid "{} GW" msgstr "{} GW" #: src/utils/units.rs:201 msgid "{} TW" msgstr "{} TW" #: src/utils/units.rs:202 msgid "{} PW" msgstr "{} PW" #: src/utils/units.rs:203 msgid "{} EW" msgstr "{} EW" #: src/utils/units.rs:204 msgid "{} ZW" msgstr "{} ZW" #: src/utils/units.rs:205 msgid "{} YW" msgstr "{} YW" #: src/utils/units.rs:206 msgid "{} RW" msgstr "{} RW" #: src/utils/units.rs:207 msgid "{} QW" msgstr "{} QW" #: data/resources/ui/shortcuts.ui:11 msgctxt "shortcut window" msgid "General" msgstr "一般" #: data/resources/ui/shortcuts.ui:14 msgctxt "shortcut window" msgid "Show Shortcuts" msgstr "顯示快捷鍵" #: data/resources/ui/shortcuts.ui:20 msgctxt "shortcut window" msgid "Quit" msgstr "結束" #: data/resources/ui/window.ui:6 msgid "Preferences" msgstr "偏好設定" #: data/resources/ui/window.ui:10 msgid "Keyboard Shortcuts" msgstr "鍵盤快捷鍵" #: data/resources/ui/window.ui:14 msgid "About Resources" msgstr "關於「Resources」" #: data/resources/ui/dialogs/app_dialog.ui:9 msgid "Application Information" msgstr "應用程式資訊" #: data/resources/ui/dialogs/app_dialog.ui:71 #: data/resources/ui/dialogs/process_dialog.ui:54 #: data/resources/ui/pages/cpu.ui:42 data/resources/ui/pages/cpu.ui:55 #: data/resources/ui/pages/drive.ui:22 data/resources/ui/pages/gpu.ui:22 #: data/resources/ui/pages/memory.ui:31 data/resources/ui/pages/network.ui:22 msgid "Usage" msgstr "使用情形" #: data/resources/ui/dialogs/app_dialog.ui:94 #: data/resources/ui/dialogs/process_dialog.ui:77 #: data/resources/ui/pages/cpu.ui:91 data/resources/ui/pages/drive.ui:48 #: data/resources/ui/pages/gpu.ui:74 data/resources/ui/pages/memory.ui:42 #: data/resources/ui/pages/network.ui:51 msgid "Properties" msgstr "屬性" #: data/resources/ui/dialogs/app_dialog.ui:100 msgid "ID" msgstr "ID" #: data/resources/ui/dialogs/app_dialog.ui:109 msgid "Running Processes" msgstr "正在執行的處理程序" #: data/resources/ui/dialogs/app_dialog.ui:118 #: data/resources/ui/dialogs/process_dialog.ui:120 msgid "Containerized" msgstr "已容器化" #: data/resources/ui/dialogs/process_dialog.ui:9 msgid "Process Information" msgstr "處理程序資訊" #: data/resources/ui/dialogs/process_dialog.ui:93 msgid "Commandline" msgstr "命令列" #: data/resources/ui/dialogs/process_dialog.ui:111 msgid "Control Group" msgstr "控制組" #: data/resources/ui/dialogs/settings_dialog.ui:10 msgid "General" msgstr "一般" #: data/resources/ui/dialogs/settings_dialog.ui:13 msgid "Units" msgstr "單位" #: data/resources/ui/dialogs/settings_dialog.ui:16 msgid "Data Unit Prefix" msgstr "資料單位字首" #: data/resources/ui/dialogs/settings_dialog.ui:20 msgid "Decimal" msgstr "十進位制" #: data/resources/ui/dialogs/settings_dialog.ui:21 msgid "Binary" msgstr "二進位制" #: data/resources/ui/dialogs/settings_dialog.ui:29 msgid "Temperature Unit" msgstr "溫度單位" #: data/resources/ui/dialogs/settings_dialog.ui:33 msgid "Celsius" msgstr "攝氏" #: data/resources/ui/dialogs/settings_dialog.ui:34 msgid "Kelvin" msgstr "克耳文" #: data/resources/ui/dialogs/settings_dialog.ui:35 msgid "Fahrenheit" msgstr "華氏" #: data/resources/ui/dialogs/settings_dialog.ui:45 msgid "User Interface" msgstr "使用者介面" #: data/resources/ui/dialogs/settings_dialog.ui:52 msgid "Very Slow" msgstr "非常慢" #: data/resources/ui/dialogs/settings_dialog.ui:53 msgid "Slow" msgstr "慢" #: data/resources/ui/dialogs/settings_dialog.ui:54 msgid "Normal" msgstr "正常" #: data/resources/ui/dialogs/settings_dialog.ui:55 msgid "Fast" msgstr "快" #: data/resources/ui/dialogs/settings_dialog.ui:56 msgid "Very Fast" msgstr "非常快" #: data/resources/ui/pages/applications.ui:6 msgid "Kill Application" msgstr "終止應用程式" #: data/resources/ui/pages/applications.ui:10 msgid "Halt Application" msgstr "暫停應用程式" #: data/resources/ui/pages/applications.ui:14 msgid "Continue Application" msgstr "繼續應用程式" #: data/resources/ui/pages/applications.ui:81 msgid "End Application" msgstr "結束應用程式" #: data/resources/ui/pages/cpu.ui:22 msgid "Options" msgstr "選項" #: data/resources/ui/pages/cpu.ui:26 msgid "Show Usages of Logical CPUs" msgstr "顯示邏輯 CPU 的使用量" #: data/resources/ui/pages/cpu.ui:77 data/resources/ui/pages/gpu.ui:60 msgid "Sensors" msgstr "感測器" #: data/resources/ui/pages/cpu.ui:84 data/resources/ui/pages/gpu.ui:63 msgid "Temperature" msgstr "溫度" #: data/resources/ui/pages/cpu.ui:98 msgid "Max Frequency" msgstr "最大頻率" #: data/resources/ui/pages/cpu.ui:107 msgid "Logical Cores" msgstr "邏輯核心" #: data/resources/ui/pages/cpu.ui:116 msgid "Physical Cores" msgstr "物理核心" #: data/resources/ui/pages/cpu.ui:125 msgid "Sockets" msgstr "插槽" #: data/resources/ui/pages/cpu.ui:134 msgid "Virtualization" msgstr "虛擬化" #: data/resources/ui/pages/cpu.ui:143 msgid "Architecture" msgstr "架構" #: data/resources/ui/pages/drive.ui:28 msgid "Read Speed" msgstr "讀取速度" #: data/resources/ui/pages/drive.ui:37 msgid "Write Speed" msgstr "寫入速度" #: data/resources/ui/pages/drive.ui:51 data/resources/ui/pages/memory.ui:72 msgid "Type" msgstr "類型" #: data/resources/ui/pages/drive.ui:60 msgid "Device" msgstr "裝置" #: data/resources/ui/pages/drive.ui:69 msgid "Capacity" msgstr "容量" #: data/resources/ui/pages/drive.ui:78 msgid "Writable" msgstr "可寫入" #: data/resources/ui/pages/drive.ui:87 msgid "Removable" msgstr "可移除" #: data/resources/ui/pages/gpu.ui:31 msgid "GPU Frequency" msgstr "GPU 頻率" #: data/resources/ui/pages/gpu.ui:44 msgid "Video Memory Frequency" msgstr "視訊記憶體頻率" #: data/resources/ui/pages/gpu.ui:49 msgid "Power Usage" msgstr "功耗" #: data/resources/ui/pages/gpu.ui:81 data/resources/ui/pages/network.ui:58 msgid "Manufacturer" msgstr "製造商" #: data/resources/ui/pages/gpu.ui:90 msgid "PCI Slot" msgstr "PCI 插槽" #: data/resources/ui/pages/gpu.ui:99 data/resources/ui/pages/network.ui:67 msgid "Driver Used" msgstr "使用的驅動程式" #: data/resources/ui/pages/gpu.ui:108 msgid "Current Power Cap" msgstr "目前功耗上限" #: data/resources/ui/pages/gpu.ui:117 msgid "Max Power Cap" msgstr "最大功耗上限" #: data/resources/ui/pages/memory.ui:9 msgid "You need to authenticate to see memory properties" msgstr "您需要驗證才能檢視記憶體屬性" #: data/resources/ui/pages/memory.ui:10 msgid "Authenticate" msgstr "驗證" #: data/resources/ui/pages/memory.ui:45 msgid "Slots Used" msgstr "已使用的插槽" #: data/resources/ui/pages/memory.ui:54 msgid "Speed" msgstr "速度" #: data/resources/ui/pages/memory.ui:63 msgid "Form Factor" msgstr "封裝形式" #: data/resources/ui/pages/memory.ui:81 msgid "Type Detail" msgstr "類型詳細資訊" #: data/resources/ui/pages/network.ui:35 msgid "Total Received" msgstr "總接收量" #: data/resources/ui/pages/network.ui:44 msgid "Total Sent" msgstr "總傳送量" #: data/resources/ui/pages/network.ui:76 msgid "Interface" msgstr "介面" #: data/resources/ui/pages/network.ui:85 msgid "Hardware Address" msgstr "硬體位址" #: data/resources/ui/pages/processes.ui:6 msgid "Kill Process" msgstr "終止處理程序" #: data/resources/ui/pages/processes.ui:10 msgid "Halt Process" msgstr "暫停處理程序" #: data/resources/ui/pages/processes.ui:14 msgid "Continue Process" msgstr "繼續處理程序" #: data/resources/ui/pages/processes.ui:81 msgid "End Process" msgstr "結束處理程序" resources-1.9.1/resources.doap000066400000000000000000000020551510634446000164200ustar00rootroot00000000000000 Resources Keep an eye on system resources Rust GTK 4 Libadwaita nokyan nokyan resources-1.9.1/src/000077500000000000000000000000001510634446000143265ustar00rootroot00000000000000resources-1.9.1/src/application.rs000066400000000000000000000251131510634446000172010ustar00rootroot00000000000000use log::{debug, info, trace}; use adw::{prelude::*, subclass::prelude::*}; use glib::clone; use gtk::{gdk, gio, glib}; use crate::config::{self, APP_ID, PKGDATADIR, PROFILE, VERSION}; use crate::i18n::i18n; use crate::ui::dialogs::settings_dialog::ResSettingsDialog; use crate::ui::window::MainWindow; use crate::utils::os::OsInfo; use crate::utils::process::ProcessAction; mod imp { use std::{cell::Cell, sync::OnceLock}; use super::*; use glib::WeakRef; #[derive(Debug, Default)] pub struct Application { pub window: OnceLock>, pub settings_window_opened: Cell, } #[glib::object_subclass] impl ObjectSubclass for Application { const NAME: &'static str = "Application"; type Type = super::Application; type ParentType = adw::Application; } impl ObjectImpl for Application {} impl ApplicationImpl for Application { fn activate(&self) { self.parent_activate(); let app = self.obj(); if let Some(window) = self.window.get() { let window = window.upgrade().unwrap(); window.present(); return; } let window = MainWindow::new(&app); self.window .set(window.downgrade()) .expect("Window already set."); app.main_window().present(); } fn startup(&self) { self.parent_startup(); let app = self.obj(); // Set icons for shell gtk::Window::set_default_icon_name(APP_ID); app.setup_css(); app.setup_gactions(); app.setup_accels(); } } impl GtkApplicationImpl for Application {} impl AdwApplicationImpl for Application {} } glib::wrapper! { pub struct Application(ObjectSubclass) @extends gio::Application, gtk::Application, adw::Application, @implements gio::ActionMap, gio::ActionGroup; } impl Application { pub fn new() -> Self { trace!("Creating Application GObject…"); glib::Object::builder::() .property("application-id", Some(APP_ID)) .property("flags", gio::ApplicationFlags::empty()) .property("resource-base-path", Some("/net/nokyan/Resources/")) .build() } fn main_window(&self) -> MainWindow { self.imp().window.get().unwrap().upgrade().unwrap() } pub fn try_main_window(&self) -> Option { self.imp() .window .get() .and_then(adw::glib::WeakRef::upgrade) } fn setup_gactions(&self) { // Quit let action_quit = gio::SimpleAction::new("quit", None); action_quit.connect_activate(clone!( #[weak(rename_to = this)] self, move |_, _| { // This is needed to trigger the delete event and saving the window state this.main_window().close(); this.quit(); } )); self.add_action(&action_quit); // Toggle Search let action_search = gio::SimpleAction::new("toggle-search", None); action_search.connect_activate(clone!( #[weak(rename_to = this)] self, move |_, _| { this.main_window().shortcut_toggle_search(); } )); self.add_action(&action_search); // Show Settings let action_settings = gio::SimpleAction::new("settings", None); action_settings.connect_activate(clone!( #[weak(rename_to = this)] self, move |_, _| { this.show_settings_dialog(); } )); self.add_action(&action_settings); // About let action_about = gio::SimpleAction::new("about", None); action_about.connect_activate(clone!( #[weak(rename_to = this)] self, move |_, _| { this.show_about_dialog(); } )); self.add_action(&action_about); // End App/Process let action_end_app_process = gio::SimpleAction::new("end-app-process", None); action_end_app_process.connect_activate(clone!( #[weak(rename_to = this)] self, move |_, _| { this.main_window() .shortcut_manipulate_app_process(ProcessAction::TERM); } )); self.add_action(&action_end_app_process); // Kill App/Process let action_kill_app_process = gio::SimpleAction::new("kill-app-process", None); action_kill_app_process.connect_activate(clone!( #[weak(rename_to = this)] self, move |_, _| { this.main_window() .shortcut_manipulate_app_process(ProcessAction::KILL); } )); self.add_action(&action_kill_app_process); // Halt App/Process let action_halt_app_process = gio::SimpleAction::new("halt-app-process", None); action_halt_app_process.connect_activate(clone!( #[weak(rename_to = this)] self, move |_, _| { this.main_window() .shortcut_manipulate_app_process(ProcessAction::STOP); } )); self.add_action(&action_halt_app_process); // Continue App/Process let action_continue_app_process = gio::SimpleAction::new("continue-app-process", None); action_continue_app_process.connect_activate(clone!( #[weak(rename_to = this)] self, move |_, _| { this.main_window() .shortcut_manipulate_app_process(ProcessAction::CONT); } )); self.add_action(&action_continue_app_process); // Show Information for App/Process let action_information_app_process = gio::SimpleAction::new("information-app-process", None); action_information_app_process.connect_activate(clone!( #[weak(rename_to = this)] self, move |_, _| { this.main_window().shortcut_information_app_process(); } )); self.add_action(&action_information_app_process); // Show Process Options let action_process_options = gio::SimpleAction::new("process-options", None); action_process_options.connect_activate(clone!( #[weak(rename_to = this)] self, move |_, _| { this.main_window().shortcut_process_options(); } )); self.add_action(&action_process_options); } // Sets up keyboard shortcuts fn setup_accels(&self) { self.set_accels_for_action("app.quit", &["q", "w"]); self.set_accels_for_action("app.settings", &["comma"]); self.set_accels_for_action("app.toggle-search", &["f", "F3"]); self.set_accels_for_action("app.end-app-process", &["E", "Delete"]); self.set_accels_for_action("app.kill-app-process", &["K", "Delete"]); self.set_accels_for_action("app.halt-app-process", &["H"]); self.set_accels_for_action("app.continue-app-process", &["N"]); self.set_accels_for_action("app.information-app-process", &["I"]); self.set_accels_for_action("app.process-options", &["O"]); } fn setup_css(&self) { let provider = gtk::CssProvider::new(); provider.load_from_resource("/net/nokyan/Resources/style.css"); if let Some(display) = gdk::Display::default() { gtk::style_context_add_provider_for_display( &display, &provider, gtk::STYLE_PROVIDER_PRIORITY_APPLICATION, ); } } fn show_settings_dialog(&self) { let imp = self.imp(); let settings_window_opened = imp.settings_window_opened.take(); imp.settings_window_opened.set(settings_window_opened); if settings_window_opened { return; } let settings = ResSettingsDialog::new(); settings.init(); AdwDialogExt::present(&settings, Some(&self.main_window())); imp.settings_window_opened.set(true); settings.connect_closed(clone!( #[weak(rename_to = this)] self, move |_| { this.imp().settings_window_opened.set(false); } )); } fn show_about_dialog(&self) { let about = adw::AboutDialog::builder() .application_name(i18n("Resources")) .application_icon(config::APP_ID) .developer_name(i18n("The Nalux Team")) .developers(vec!["nokyan "]) .license_type(gtk::License::Gpl30) .version(config::VERSION) .website("https://apps.gnome.org/app/net.nokyan.Resources/") .build(); about.add_link( &i18n("Report Issues"), "https://github.com/nokyan/resources/issues", ); // Translator credits. Replace "translator-credits" with your name/username, and optionally an email or URL. // One name per line, please do not remove previous names. about.set_translator_credits(&i18n("translator-credits")); about.add_credit_section(Some(&i18n("Icon by")), &["Avhiren"]); about.present(Some(&self.main_window())); } pub fn run(&self) { trace!("Starting the application"); info!("Resources ({APP_ID})"); info!("Version: {VERSION} ({PROFILE})"); info!("Datadir: `{PKGDATADIR}`"); if log::log_enabled!(log::Level::Debug) { let os_info = OsInfo::get(); debug!( "Operating system: {}", os_info.name.as_deref().unwrap_or("N/A") ); debug!( "Kernel version: {}", os_info.kernel_version.as_deref().unwrap_or("N/A") ); } if PROFILE == "Devel" { info!( "You are running a development version of Resources, things may be slow or break!" ); } ApplicationExtManual::run_with_args::<&str>(self, &[]); } pub fn try_default() -> Option { gio::Application::default().and_then(|app| app.downcast().ok()) } } impl Default for Application { fn default() -> Self { gio::Application::default() .expect("Could not get default GApplication") .downcast() .unwrap() } } resources-1.9.1/src/bin/000077500000000000000000000000001510634446000150765ustar00rootroot00000000000000resources-1.9.1/src/bin/resources-adjust.rs000066400000000000000000000027061510634446000207530ustar00rootroot00000000000000use std::{env, path::PathBuf}; use nix::{ sched::{CpuSet, sched_setaffinity}, unistd::Pid, }; fn main() { if let Some(pid) = env::args().nth(1).and_then(|s| s.trim().parse().ok()) { if let Some(nice) = env::args().nth(2).and_then(|s| s.trim().parse().ok()) { if let Some(mask) = env::args().nth(3) { let mut cpu_set = CpuSet::new(); for (i, c) in mask.chars().enumerate() { if c == '1' { cpu_set.set(i).unwrap_or_default(); } } adjust(pid, nice, &cpu_set); // find tasks that belong to this process let tasks_path = PathBuf::from("/proc/").join(pid.to_string()).join("task"); for entry in std::fs::read_dir(tasks_path).unwrap().flatten() { let thread_id = entry.file_name().to_string_lossy().parse().unwrap(); adjust(thread_id, nice, &cpu_set); } std::process::exit(0) } } } std::process::exit(255); } fn adjust(id: i32, nice: i32, cpu_set: &CpuSet) { unsafe { libc::setpriority(libc::PRIO_PROCESS, id as u32, nice); }; let error = std::io::Error::last_os_error() .raw_os_error() .unwrap_or_default(); if error != 0 { std::process::exit(error) } let _ = sched_setaffinity(Pid::from_raw(id), cpu_set); } resources-1.9.1/src/bin/resources-kill.rs000066400000000000000000000016061510634446000204120ustar00rootroot00000000000000use std::env; use nix::{sys::signal, unistd::Pid}; fn main() { if let Some(pid) = env::args().nth(1).and_then(|s| s.trim().parse().ok()) { if let Some(arg) = env::args().nth(2) { let signal = match arg.as_str() { "STOP" => signal::Signal::SIGSTOP, "CONT" => signal::Signal::SIGCONT, "TERM" => signal::Signal::SIGTERM, "KILL" => signal::Signal::SIGKILL, _ => std::process::exit(254), }; let result = signal::kill(Pid::from_raw(pid), Some(signal)); if let Err(errno) = result { match errno { nix::errno::Errno::UnknownErrno => std::process::exit(253), _ => std::process::exit(errno as i32), }; } std::process::exit(0); } } std::process::exit(255); } resources-1.9.1/src/bin/resources-processes.rs000066400000000000000000000023701510634446000214640ustar00rootroot00000000000000use anyhow::Result; use process_data::ProcessData; use ron::ser::PrettyConfig; use std::io::{Read, Write}; use clap::Parser; #[derive(Parser, Debug)] #[command(version, about)] struct Args { /// Output once and then exit #[arg(short, long, default_value_t = false)] once: bool, /// Use Rusty Object Notation (use this only for debugging this binary on its own, Resources won't be able to decode RON) #[arg(short, long, default_value_t = false)] ron: bool, } fn main() -> Result<()> { let args = Args::parse(); if args.once { output(args.ron)?; return Ok(()); } loop { let mut buffer = [0; 1]; std::io::stdin().read_exact(&mut buffer)?; output(args.ron)?; } } fn output(ron: bool) -> Result<()> { let data = ProcessData::all_process_data()?; let encoded = if ron { ron::ser::to_string_pretty(&data, PrettyConfig::default())? .as_bytes() .to_vec() } else { rmp_serde::to_vec(&data)? }; let len_byte_array = encoded.len().to_le_bytes(); let stdout = std::io::stdout(); let mut handle = stdout.lock(); handle.write_all(&len_byte_array)?; handle.write_all(&encoded)?; handle.flush()?; Ok(()) } resources-1.9.1/src/bin/resources.rs000066400000000000000000000000521510634446000174530ustar00rootroot00000000000000fn main() { resources::gui::main(); } resources-1.9.1/src/config.rs.in000066400000000000000000000005601510634446000165470ustar00rootroot00000000000000pub const APP_ID: &str = @APP_ID@; pub const GETTEXT_PACKAGE: &str = @GETTEXT_PACKAGE@; pub const LOCALEDIR: &str = @LOCALEDIR@; pub const PKGDATADIR: &str = @PKGDATADIR@; pub const PROFILE: &str = @PROFILE@; pub const RESOURCES_FILE: &str = concat!(@PKGDATADIR@, "/resources.gresource"); pub const VERSION: &str = @VERSION@; pub const LIBEXECDIR: &str = @LIBEXECDIR@;resources-1.9.1/src/gui.rs000066400000000000000000000063011510634446000154600ustar00rootroot00000000000000use std::ffi::OsString; use std::sync::LazyLock; use crate::application; #[rustfmt::skip] use crate::config; use crate::utils::IS_FLATPAK; use crate::utils::app::DATA_DIRS; use clap::{Parser, command}; use gettextrs::{LocaleCategory, gettext}; use gtk::{gio, glib}; use log::trace; use self::application::Application; use self::config::{GETTEXT_PACKAGE, LOCALEDIR, RESOURCES_FILE}; pub static ARGS: LazyLock = LazyLock::new(Args::parse); #[derive(Parser, Debug)] #[command(version, about)] pub struct Args { /// Disable GPU monitoring #[arg(short = 'g', long, default_value_t = false)] pub disable_gpu_monitoring: bool, /// Disable network interface monitoring #[arg(short = 'n', long, default_value_t = false)] pub disable_network_interface_monitoring: bool, /// Disable drive monitoring #[arg(short = 'd', long, default_value_t = false)] pub disable_drive_monitoring: bool, /// Disable battery monitoring #[arg(short = 'b', long, default_value_t = false)] pub disable_battery_monitoring: bool, /// Disable CPU monitoring #[arg(short = 'c', long, default_value_t = false)] pub disable_cpu_monitoring: bool, /// Disable memory monitoring #[arg(short = 'm', long, default_value_t = false)] pub disable_memory_monitoring: bool, /// Disable NPU monitoring #[arg(short = 'v', long, default_value_t = false)] pub disable_npu_monitoring: bool, /// Disable process monitoring #[arg(short = 'p', long, default_value_t = false)] pub disable_process_monitoring: bool, /// Open tab specified by ID. /// Valid IDs are: "applications", "processes", "cpu", "memory", "gpu-$PCI_SLOT$", /// "drive-$MODEL_NAME_OR_DEVICE_NAME$", "network-$INTERFACE_NAME$", /// "battery-$MANUFACTURER$-$MODEL_NAME$-$DEVICE_NAME$" #[arg(short = 't', long)] pub open_tab_id: Option, } pub fn main() { // Force args parsing here so we don't start printing logs before printing the help page std::hint::black_box(ARGS.disable_battery_monitoring); // Initialize logger pretty_env_logger::init(); trace!("Trace logs activated. Brace yourself for *lots* of logs. Slowdowns may occur."); // reset XDG_DATA_DIRS to use absolute paths instead of relative paths because Flatpak seemingly cannot resolve them // this must happen now because once the GTK app is loaded, it's too late if *IS_FLATPAK { unsafe { std::env::set_var( "XDG_DATA_DIRS", DATA_DIRS .iter() .map(|pathbuf| pathbuf.as_os_str().to_owned()) .collect::>() .join(&OsString::from(":")), ); } } // Prepare i18n gettextrs::setlocale(LocaleCategory::LcAll, ""); gettextrs::bindtextdomain(GETTEXT_PACKAGE, LOCALEDIR).expect("Unable to bind the text domain"); gettextrs::textdomain(GETTEXT_PACKAGE).expect("Unable to switch to the text domain"); glib::set_application_name(&gettext("Resources")); let res = gio::Resource::load(RESOURCES_FILE).expect("Could not load gresource file"); gio::resources_register(&res); let app = Application::new(); app.run(); } resources-1.9.1/src/i18n.rs000066400000000000000000000066331510634446000154630ustar00rootroot00000000000000// i18n.rs // // Copyright 2020 Christopher Davis // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // // SPDX-License-Identifier: GPL-3.0-or-later use gettextrs::{gettext, ngettext, npgettext, pgettext}; use lazy_regex::{Captures, Regex}; #[allow(dead_code)] fn freplace(input: String, args: &[&str]) -> String { let mut parts = input.split("{}"); let mut output = parts.next().unwrap_or_default().to_string(); for (p, a) in parts.zip(args.iter()) { output += &((*a).to_string() + p); } output } #[allow(dead_code)] fn kreplace(input: String, kwargs: &[(&str, &str)]) -> String { let mut s = input; for (k, v) in kwargs { if let Ok(re) = Regex::new(&format!("\\{{{k}\\}}")) { s = re .replace_all(&s, |_: &Captures<'_>| (*v).to_string()) .to_string(); } } s } // Simple translations functions #[allow(dead_code)] pub fn i18n(format: &str) -> String { gettext(format) } #[allow(dead_code)] pub fn i18n_f(format: &str, args: &[&str]) -> String { let s = gettext(format); freplace(s, args) } #[allow(dead_code)] pub fn i18n_k(format: &str, kwargs: &[(&str, &str)]) -> String { let s = gettext(format); kreplace(s, kwargs) } // Singular and plural translations functions #[allow(dead_code)] pub fn ni18n(single: &str, multiple: &str, number: u32) -> String { ngettext(single, multiple, number) } #[allow(dead_code)] pub fn ni18n_f(single: &str, multiple: &str, number: u32, args: &[&str]) -> String { let s = ngettext(single, multiple, number); freplace(s, args) } #[allow(dead_code)] pub fn ni18n_k(single: &str, multiple: &str, number: u32, kwargs: &[(&str, &str)]) -> String { let s = ngettext(single, multiple, number); kreplace(s, kwargs) } // Translations with context functions #[allow(dead_code)] pub fn pi18n(ctx: &str, format: &str) -> String { pgettext(ctx, format) } #[allow(dead_code)] pub fn pi18n_f(ctx: &str, format: &str, args: &[&str]) -> String { let s = pgettext(ctx, format); freplace(s, args) } #[allow(dead_code)] pub fn pi18n_k(ctx: &str, format: &str, kwargs: &[(&str, &str)]) -> String { let s = pgettext(ctx, format); kreplace(s, kwargs) } // Singular and plural with context #[allow(dead_code)] pub fn pni18n(ctx: &str, single: &str, multiple: &str, number: u32) -> String { npgettext(ctx, single, multiple, number) } #[allow(dead_code)] pub fn pni18n_f(ctx: &str, single: &str, multiple: &str, number: u32, args: &[&str]) -> String { let s = npgettext(ctx, single, multiple, number); freplace(s, args) } #[allow(dead_code)] pub fn pni18n_k( ctx: &str, single: &str, multiple: &str, number: u32, kwargs: &[(&str, &str)], ) -> String { let s = npgettext(ctx, single, multiple, number); kreplace(s, kwargs) } resources-1.9.1/src/lib.rs000066400000000000000000000001541510634446000154420ustar00rootroot00000000000000pub mod application; #[rustfmt::skip] pub mod config; pub mod gui; pub mod i18n; pub mod ui; pub mod utils; resources-1.9.1/src/meson.build000066400000000000000000000053201510634446000164700ustar00rootroot00000000000000global_conf = configuration_data() global_conf.set_quoted('APP_ID', application_id) global_conf.set_quoted('PKGDATADIR', pkgdatadir) global_conf.set_quoted('PROFILE', profile) global_conf.set_quoted('VERSION', version + version_suffix) global_conf.set_quoted('GETTEXT_PACKAGE', gettext_package) global_conf.set_quoted('LOCALEDIR', localedir) global_conf.set_quoted('LIBEXECDIR', libexecdir) config = configure_file(input: 'config.rs.in', output: 'config.rs', configuration: global_conf) # Copy the config.rs output to the source directory. run_command( 'cp', meson.project_build_root() / 'src' / 'config.rs', meson.project_source_root() / 'src' / 'config.rs', check: true, ) cargo_options = ['--manifest-path', meson.project_source_root() / 'Cargo.toml'] cargo_options += ['--target-dir', meson.project_build_root() / 'src'] if get_option('profile') == 'default' cargo_options += ['--release'] rust_target = 'release' message('Building in release mode') else rust_target = 'debug' message('Building in debug mode') endif cargo_env = ['CARGO_HOME=' + meson.project_build_root() / 'cargo'] test( 'Cargo tests (main application)', cargo, args: ['test', cargo_options], timeout: 3600, env: cargo_env, ) cargo_build = custom_target( 'cargo-build', depends: resources, build_by_default: true, build_always_stale: true, output: rust_target, console: true, command: [ 'env', cargo_env, cargo, 'build', cargo_options, ], ) copy_binary = custom_target( 'cp-binary', depends: cargo_build, build_by_default: true, build_always_stale: true, install: true, install_dir: bindir, output: meson.project_name(), command: [ 'cp', 'src' / rust_target / meson.project_name(), '@OUTPUT@', ], ) copy_kill_binary = custom_target( 'cp-kill-binary', depends: cargo_build, build_by_default: true, build_always_stale: true, install: true, install_dir: libexecdir, output: meson.project_name() + '-kill', command: [ 'cp', 'src' / rust_target / meson.project_name() + '-kill', '@OUTPUT@', ], ) copy_processes_binary = custom_target( 'cp-processes-binary', depends: cargo_build, build_by_default: true, build_always_stale: true, install: true, install_dir: libexecdir, output: meson.project_name() + '-processes', command: [ 'cp', 'src' / rust_target / meson.project_name() + '-processes', '@OUTPUT@', ], ) copy_adjust_binary = custom_target( 'cp-adjust-binary', depends: cargo_build, build_by_default: true, build_always_stale: true, install: true, install_dir: libexecdir, output: meson.project_name() + '-adjust', command: [ 'cp', 'src' / rust_target / meson.project_name() + '-adjust', '@OUTPUT@', ], )resources-1.9.1/src/ui/000077500000000000000000000000001510634446000147435ustar00rootroot00000000000000resources-1.9.1/src/ui/dialogs/000077500000000000000000000000001510634446000163655ustar00rootroot00000000000000resources-1.9.1/src/ui/dialogs/app_dialog.rs000066400000000000000000000143001510634446000210300ustar00rootroot00000000000000use crate::config::PROFILE; use crate::i18n::i18n; use crate::ui::pages::applications::application_entry::ApplicationEntry; use crate::utils::units::{convert_speed, convert_storage}; use adw::{prelude::*, subclass::prelude::*}; use gtk::gio::ThemedIcon; use gtk::glib; use log::trace; mod imp { use super::*; use gtk::CompositeTemplate; #[derive(Debug, CompositeTemplate, Default)] #[template(resource = "/net/nokyan/Resources/ui/dialogs/app_dialog.ui")] pub struct ResAppDialog { #[template_child] pub icon: TemplateChild, #[template_child] pub name: TemplateChild, #[template_child] pub description: TemplateChild, #[template_child] pub cpu_usage: TemplateChild, #[template_child] pub memory_usage: TemplateChild, #[template_child] pub swap_usage: TemplateChild, #[template_child] pub drive_read_speed: TemplateChild, #[template_child] pub drive_read_total: TemplateChild, #[template_child] pub drive_write_speed: TemplateChild, #[template_child] pub drive_write_total: TemplateChild, #[template_child] pub gpu_usage: TemplateChild, #[template_child] pub vram_usage: TemplateChild, #[template_child] pub encoder_usage: TemplateChild, #[template_child] pub decoder_usage: TemplateChild, #[template_child] pub id: TemplateChild, #[template_child] pub running_since: TemplateChild, #[template_child] pub processes_amount: TemplateChild, #[template_child] pub containerized: TemplateChild, } #[glib::object_subclass] impl ObjectSubclass for ResAppDialog { const NAME: &'static str = "ResAppDialog"; type Type = super::ResAppDialog; type ParentType = adw::Dialog; fn class_init(klass: &mut Self::Class) { Self::bind_template(klass); } // You must call `Widget`'s `init_template()` within `instance_init()`. fn instance_init(obj: &glib::subclass::InitializingObject) { obj.init_template(); } } impl ObjectImpl for ResAppDialog { fn constructed(&self) { self.parent_constructed(); let obj = self.obj(); // Devel Profile if PROFILE == "Devel" { obj.add_css_class("devel"); } } } impl WidgetImpl for ResAppDialog {} impl WindowImpl for ResAppDialog {} impl AdwDialogImpl for ResAppDialog {} } glib::wrapper! { pub struct ResAppDialog(ObjectSubclass) @extends gtk::Widget, adw::Dialog, gtk::Window, @implements gtk::Buildable, gtk::ConstraintTarget, gtk::Accessible, gtk::ShortcutManager, gtk::Root, gtk::Native; } impl Default for ResAppDialog { fn default() -> Self { Self::new() } } impl ResAppDialog { pub fn new() -> Self { trace!("Creating ResAppDialog GObject…"); glib::Object::new::() } pub fn init(&self, app: &ApplicationEntry) { self.setup_widgets(app); } pub fn setup_widgets(&self, app: &ApplicationEntry) { trace!("Setting up ResAppDialog widgets…"); let imp = self.imp(); if app.id().is_none() // this will be the case for System Processes || app .icon() .downcast_ref::() .is_some_and(|themed_icon| { themed_icon .names() .iter() .all(|name| name.ends_with("-symbolic")) || themed_icon .names() .iter() .all(|name| name.contains("generic-process")) }) { imp.icon.set_pixel_size(imp.icon.pixel_size() / 2); imp.icon.set_css_classes(&["big-bubble"]); } imp.icon.set_from_gicon(&app.icon()); imp.name.set_label(&app.name()); if let Some(description) = &app.description() { imp.description.set_label(description); } else { imp.description.set_visible(false); } if let Some(id) = &app.id() { imp.id.set_subtitle(id); } else { imp.id.set_visible(false); } imp.running_since .set_subtitle(&app.running_since().unwrap_or_else(|| i18n("N/A").into())); imp.containerized.set_subtitle(&app.containerization()); self.update(app); } pub fn update(&self, app: &ApplicationEntry) { trace!("Refreshing ResAppDialog…"); let imp = self.imp(); imp.cpu_usage .set_subtitle(&format!("{:.1} %", app.cpu_usage() * 100.0)); imp.memory_usage .set_subtitle(&convert_storage(app.memory_usage() as f64, false)); imp.swap_usage .set_subtitle(&convert_storage(app.swap_usage() as f64, false)); imp.drive_read_speed .set_subtitle(&convert_speed(app.read_speed(), false)); imp.drive_read_total .set_subtitle(&convert_storage(app.read_total() as f64, false)); imp.drive_write_speed .set_subtitle(&convert_speed(app.write_speed(), false)); imp.drive_write_total .set_subtitle(&convert_storage(app.write_total() as f64, false)); imp.gpu_usage .set_subtitle(&format!("{:.1} %", app.gpu_usage() * 100.0)); imp.vram_usage .set_subtitle(&convert_storage(app.gpu_mem_usage() as f64, false)); imp.encoder_usage .set_subtitle(&format!("{:.1} %", app.enc_usage() * 100.0)); imp.decoder_usage .set_subtitle(&format!("{:.1} %", app.dec_usage() * 100.0)); imp.processes_amount .set_subtitle(&app.running_processes().to_string()); } } resources-1.9.1/src/ui/dialogs/mod.rs000066400000000000000000000001451510634446000175120ustar00rootroot00000000000000pub mod app_dialog; pub mod process_dialog; pub mod process_options_dialog; pub mod settings_dialog; resources-1.9.1/src/ui/dialogs/process_dialog.rs000066400000000000000000000156431510634446000217410ustar00rootroot00000000000000use adw::{prelude::*, subclass::prelude::*}; use gtk::glib::{self, GString}; use log::trace; use crate::config::PROFILE; use crate::i18n::i18n; use crate::ui::pages::processes::process_entry::ProcessEntry; use crate::utils::units::{convert_speed, convert_storage, format_time}; mod imp { use super::*; use gtk::CompositeTemplate; #[derive(Debug, CompositeTemplate, Default)] #[template(resource = "/net/nokyan/Resources/ui/dialogs/process_dialog.ui")] pub struct ResProcessDialog { #[template_child] pub name: TemplateChild, #[template_child] pub cpu_usage: TemplateChild, #[template_child] pub memory_usage: TemplateChild, #[template_child] pub swap_usage: TemplateChild, #[template_child] pub drive_read_speed: TemplateChild, #[template_child] pub drive_read_total: TemplateChild, #[template_child] pub drive_write_speed: TemplateChild, #[template_child] pub drive_write_total: TemplateChild, #[template_child] pub gpu_usage: TemplateChild, #[template_child] pub vram_usage: TemplateChild, #[template_child] pub encoder_usage: TemplateChild, #[template_child] pub decoder_usage: TemplateChild, #[template_child] pub total_cpu_time: TemplateChild, #[template_child] pub user_cpu_time: TemplateChild, #[template_child] pub system_cpu_time: TemplateChild, #[template_child] pub pid: TemplateChild, #[template_child] pub running_since: TemplateChild, #[template_child] pub commandline: TemplateChild, #[template_child] pub user: TemplateChild, #[template_child] pub cgroup: TemplateChild, #[template_child] pub containerized: TemplateChild, } #[glib::object_subclass] impl ObjectSubclass for ResProcessDialog { const NAME: &'static str = "ResProcessDialog"; type Type = super::ResProcessDialog; type ParentType = adw::Dialog; fn class_init(klass: &mut Self::Class) { Self::bind_template(klass); } // You must call `Widget`'s `init_template()` within `instance_init()`. fn instance_init(obj: &glib::subclass::InitializingObject) { obj.init_template(); } } impl ObjectImpl for ResProcessDialog { fn constructed(&self) { self.parent_constructed(); let obj = self.obj(); // Devel Profile if PROFILE == "Devel" { obj.add_css_class("devel"); } } } impl WidgetImpl for ResProcessDialog {} impl WindowImpl for ResProcessDialog {} impl AdwDialogImpl for ResProcessDialog {} } glib::wrapper! { pub struct ResProcessDialog(ObjectSubclass) @extends gtk::Widget, adw::Dialog, gtk::Window, @implements gtk::Buildable, gtk::ConstraintTarget, gtk::Accessible, gtk::ShortcutManager, gtk::Root, gtk::Native; } impl Default for ResProcessDialog { fn default() -> Self { Self::new() } } impl ResProcessDialog { pub fn new() -> Self { trace!("Creating ResProcessDialog GObject…"); glib::Object::new::() } pub fn init>(&self, process: &ProcessEntry, user: S) { self.setup_widgets(process, user.as_ref()); } pub fn setup_widgets(&self, process: &ProcessEntry, user: &str) { trace!("Setting up ResProcessDialog widgets…"); let imp = self.imp(); imp.name.set_label(&process.name()); imp.user.set_subtitle(user); imp.pid.set_subtitle(&process.pid().to_string()); imp.running_since.set_subtitle( &process .running_since() .unwrap_or_else(|| i18n("N/A").into()), ); let commandline_str = if process.commandline().is_empty() { GString::from(i18n("N/A")) } else { process.commandline() }; imp.commandline.set_subtitle(&commandline_str); imp.commandline.set_tooltip_text(Some(&commandline_str)); imp.cgroup .set_subtitle(&process.cgroup().unwrap_or_else(|| i18n("N/A").into())); imp.cgroup.set_tooltip_text(Some( &process.cgroup().unwrap_or_else(|| i18n("N/A").into()), )); imp.containerized.set_subtitle(&process.containerization()); self.update(process); } pub fn update(&self, process: &ProcessEntry) { trace!("Refreshing ResProcessDialog…"); let imp = self.imp(); imp.cpu_usage .set_subtitle(&format!("{:.1} %", process.cpu_usage() * 100.0)); imp.memory_usage .set_subtitle(&convert_storage(process.memory_usage() as f64, false)); imp.swap_usage .set_subtitle(&convert_storage(process.swap_usage() as f64, false)); if process.read_speed() == -1.0 { imp.drive_read_speed.set_subtitle(&i18n("N/A")); } else { imp.drive_read_speed .set_subtitle(&convert_speed(process.read_speed(), false)); } if process.read_total() == -1 { imp.drive_read_total.set_subtitle(&i18n("N/A")); } else { imp.drive_read_total .set_subtitle(&convert_storage(process.read_total() as f64, false)); } if process.write_speed() == -1.0 { imp.drive_write_speed.set_subtitle(&i18n("N/A")); } else { imp.drive_write_speed .set_subtitle(&convert_speed(process.write_speed(), false)); } if process.write_total() == -1 { imp.drive_write_total.set_subtitle(&i18n("N/A")); } else { imp.drive_write_total .set_subtitle(&convert_storage(process.write_total() as f64, false)); } imp.gpu_usage .set_subtitle(&format!("{:.1} %", process.gpu_usage() * 100.0)); imp.vram_usage .set_subtitle(&convert_storage(process.gpu_mem_usage() as f64, false)); imp.encoder_usage .set_subtitle(&format!("{:.1} %", process.enc_usage() * 100.0)); imp.decoder_usage .set_subtitle(&format!("{:.1} %", process.dec_usage() * 100.0)); imp.total_cpu_time .set_subtitle(&format_time(process.total_cpu_time())); imp.user_cpu_time .set_subtitle(&format_time(process.user_cpu_time())); imp.system_cpu_time .set_subtitle(&format_time(process.system_cpu_time())); } } resources-1.9.1/src/ui/dialogs/process_options_dialog.rs000066400000000000000000000160351510634446000235100ustar00rootroot00000000000000use crate::{ config::PROFILE, i18n::i18n_f, ui::{ pages::{NICE_TO_LABEL, processes::process_entry::ProcessEntry}, window::Action, }, utils::settings::SETTINGS, }; use adw::{ToastOverlay, prelude::*, subclass::prelude::*}; use async_channel::Sender; use gtk::glib::{self, MainContext, clone}; use log::trace; use process_data::Niceness; mod imp { use std::cell::{Cell, RefCell}; use super::*; use gtk::CompositeTemplate; #[derive(Debug, CompositeTemplate, Default)] #[template(resource = "/net/nokyan/Resources/ui/dialogs/process_options_dialog.ui")] pub struct ResProcessOptionsDialog { #[template_child] pub name: TemplateChild, #[template_child] pub apply_button: TemplateChild, #[template_child] pub nice_row: TemplateChild, #[template_child] pub priority_row: TemplateChild, #[template_child] pub affinity_row: TemplateChild, #[template_child] pub select_all_button: TemplateChild, pub cpu_rows: RefCell>, pub pid: Cell, } #[glib::object_subclass] impl ObjectSubclass for ResProcessOptionsDialog { const NAME: &'static str = "ResProcessOptionsDialog"; type Type = super::ResProcessOptionsDialog; type ParentType = adw::Dialog; fn class_init(klass: &mut Self::Class) { Self::bind_template(klass); } // You must call `Widget`'s `init_template()` within `instance_init()`. fn instance_init(obj: &glib::subclass::InitializingObject) { obj.init_template(); } } impl ObjectImpl for ResProcessOptionsDialog { fn constructed(&self) { self.parent_constructed(); let obj = self.obj(); // Devel Profile if PROFILE == "Devel" { obj.add_css_class("devel"); } } } impl WidgetImpl for ResProcessOptionsDialog {} impl WindowImpl for ResProcessOptionsDialog {} impl AdwDialogImpl for ResProcessOptionsDialog {} } glib::wrapper! { pub struct ResProcessOptionsDialog(ObjectSubclass) @extends gtk::Widget, adw::Dialog, gtk::Window, @implements gtk::Buildable, gtk::ConstraintTarget, gtk::Accessible, gtk::ShortcutManager, gtk::Root, gtk::Native; } impl Default for ResProcessOptionsDialog { fn default() -> Self { Self::new() } } impl ResProcessOptionsDialog { pub fn new() -> Self { trace!("Creating ResProcessOptionsDialog GObject…"); glib::Object::new::() } pub fn init( &self, process: &ProcessEntry, sender: Sender, toast_overlay: &ToastOverlay, ) { self.setup_widgets(process); self.setup_signals(process, sender, toast_overlay); } fn get_current_niceness(&self) -> Niceness { let imp = self.imp(); if imp.priority_row.is_visible() { match imp.priority_row.selected() { 0 => Niceness::try_from(-19).unwrap_or_default(), 1 => Niceness::try_from(-5).unwrap_or_default(), 2 => Niceness::try_from(0).unwrap_or_default(), 3 => Niceness::try_from(5).unwrap_or_default(), 4 => Niceness::try_from(20).unwrap_or_default(), _ => Niceness::default(), } } else { Niceness::try_from(imp.nice_row.value() as i8).unwrap_or_default() } } pub fn setup_widgets(&self, process: &ProcessEntry) { trace!("Setting up ResProcessOptionsDialog widgets…"); let imp = self.imp(); imp.name.set_label(&process.name()); imp.nice_row.set_value(f64::from(process.niceness())); imp.priority_row.set_selected( NICE_TO_LABEL .get(&Niceness::try_from(process.niceness()).unwrap_or_default()) .map_or(2, |(_, i)| *i), ); if SETTINGS.detailed_priority() { imp.priority_row.set_visible(false); } else { imp.nice_row.set_visible(false); } for (i, affinity) in process.affinity().iter().enumerate() { let switch_row = adw::SwitchRow::builder() .title(i18n_f("CPU {}", &[&(i + 1).to_string()])) .active(*affinity) .build(); switch_row.connect_active_notify(clone!( #[weak(rename_to = this)] self, move |_| { let imp = this.imp(); // if all switch rows are disabled, disable the apply button let setting = imp.cpu_rows.borrow().iter().any(adw::SwitchRow::is_active); imp.apply_button.set_sensitive(setting); } )); imp.affinity_row.add_row(&switch_row); imp.cpu_rows.borrow_mut().push(switch_row); } imp.pid.set(process.pid()); } pub fn setup_signals( &self, process: &ProcessEntry, sender: Sender, toast_overlay: &ToastOverlay, ) { trace!("Setting up ResProcessOptionsDialog signals…"); let imp = self.imp(); imp.select_all_button.connect_clicked(clone!( #[weak(rename_to = this)] self, move |_| { let cpu_rows = this.imp().cpu_rows.borrow(); let setting = !cpu_rows.iter().all(adw::SwitchRow::is_active); cpu_rows .iter() .for_each(|switch_row| switch_row.set_active(setting)); } )); imp.apply_button.connect_clicked(clone!( #[weak(rename_to = this)] self, #[weak] process, #[weak] toast_overlay, #[strong] sender, move |_| { let main_context = MainContext::default(); main_context.spawn_local(clone!( #[weak] this, #[strong] sender, async move { let imp = this.imp(); let affinity: Vec<_> = imp .cpu_rows .borrow() .iter() .map(adw::SwitchRow::is_active) .collect(); let _ = sender .send(Action::AdjustProcess( process.pid(), this.get_current_niceness(), affinity, process.name().to_string(), toast_overlay.clone(), )) .await; } )); } )); } } resources-1.9.1/src/ui/dialogs/settings_dialog.rs000066400000000000000000000461331510634446000221210ustar00rootroot00000000000000use adw::{prelude::*, subclass::prelude::*}; use gtk::glib; use log::trace; use crate::{ config::PROFILE, utils::settings::{Base, RefreshSpeed, SETTINGS, SidebarMeterType, TemperatureUnit}, }; mod imp { use super::*; use gtk::CompositeTemplate; #[derive(Debug, CompositeTemplate, Default)] #[template(resource = "/net/nokyan/Resources/ui/dialogs/settings_dialog.ui")] pub struct ResSettingsDialog { #[template_child] pub prefix_combo_row: TemplateChild, #[template_child] pub network_bits_row: TemplateChild, #[template_child] pub temperature_combo_row: TemplateChild, #[template_child] pub refresh_speed_combo_row: TemplateChild, #[template_child] pub show_graph_grids_row: TemplateChild, #[template_child] pub graph_data_points_row: TemplateChild, #[template_child] pub sidebar_details_row: TemplateChild, #[template_child] pub sidebar_description_row: TemplateChild, #[template_child] pub sidebar_meter_type_row: TemplateChild, #[template_child] pub normalize_cpu_usage_row: TemplateChild, #[template_child] pub apps_show_memory_row: TemplateChild, #[template_child] pub apps_show_cpu_row: TemplateChild, #[template_child] pub apps_show_drive_read_speed_row: TemplateChild, #[template_child] pub apps_show_drive_read_total_row: TemplateChild, #[template_child] pub apps_show_drive_write_speed_row: TemplateChild, #[template_child] pub apps_show_drive_write_total_row: TemplateChild, #[template_child] pub apps_show_gpu_row: TemplateChild, #[template_child] pub apps_show_gpu_mem_row: TemplateChild, #[template_child] pub apps_show_encoder_row: TemplateChild, #[template_child] pub apps_show_decoder_row: TemplateChild, #[template_child] pub apps_show_swap_row: TemplateChild, #[template_child] pub apps_show_combined_memory_row: TemplateChild, #[template_child] pub processes_niceness: TemplateChild, #[template_child] pub processes_show_id_row: TemplateChild, #[template_child] pub processes_show_user_row: TemplateChild, #[template_child] pub processes_show_memory_row: TemplateChild, #[template_child] pub processes_show_cpu_row: TemplateChild, #[template_child] pub processes_show_drive_read_speed_row: TemplateChild, #[template_child] pub processes_show_drive_read_total_row: TemplateChild, #[template_child] pub processes_show_drive_write_speed_row: TemplateChild, #[template_child] pub processes_show_drive_write_total_row: TemplateChild, #[template_child] pub processes_show_gpu_row: TemplateChild, #[template_child] pub processes_show_gpu_mem_row: TemplateChild, #[template_child] pub processes_show_encoder_row: TemplateChild, #[template_child] pub processes_show_decoder_row: TemplateChild, #[template_child] pub processes_show_total_cpu_time_row: TemplateChild, #[template_child] pub processes_show_user_cpu_time_row: TemplateChild, #[template_child] pub processes_show_system_cpu_time_row: TemplateChild, #[template_child] pub processes_show_priority_row: TemplateChild, #[template_child] pub processes_show_swap_row: TemplateChild, #[template_child] pub processes_show_combined_memory_row: TemplateChild, #[template_child] pub processes_show_commandline_row: TemplateChild, #[template_child] pub show_virtual_drives_row: TemplateChild, #[template_child] pub show_virtual_network_interfaces_row: TemplateChild, } #[glib::object_subclass] impl ObjectSubclass for ResSettingsDialog { const NAME: &'static str = "ResSettingsDialog"; type Type = super::ResSettingsDialog; type ParentType = adw::PreferencesDialog; fn class_init(klass: &mut Self::Class) { Self::bind_template(klass); } // You must call `Widget`'s `init_template()` within `instance_init()`. fn instance_init(obj: &glib::subclass::InitializingObject) { obj.init_template(); } } impl ObjectImpl for ResSettingsDialog { fn constructed(&self) { self.parent_constructed(); let obj = self.obj(); // Devel Profile if PROFILE == "Devel" { obj.add_css_class("devel"); } } } impl WidgetImpl for ResSettingsDialog {} impl WindowImpl for ResSettingsDialog {} impl AdwDialogImpl for ResSettingsDialog {} impl PreferencesDialogImpl for ResSettingsDialog {} } glib::wrapper! { pub struct ResSettingsDialog(ObjectSubclass) @extends adw::PreferencesDialog, gtk::Widget, adw::Dialog, gtk::Window, @implements gtk::Buildable, gtk::ConstraintTarget, gtk::Accessible, gtk::ShortcutManager, gtk::Root, gtk::Native; } impl Default for ResSettingsDialog { fn default() -> Self { Self::new() } } impl ResSettingsDialog { pub fn new() -> Self { trace!("Creating ResSettingsDialog GObject…"); glib::Object::new::() } pub fn init(&self) { self.setup_widgets(); self.setup_signals(); } pub fn setup_widgets(&self) { trace!("Setting up ResSettingsDialog widgets…"); let imp = self.imp(); imp.prefix_combo_row.set_selected(SETTINGS.base() as u32); imp.network_bits_row.set_active(SETTINGS.network_bits()); imp.temperature_combo_row .set_selected(SETTINGS.temperature_unit() as u32); imp.refresh_speed_combo_row .set_selected(SETTINGS.refresh_speed() as u32); imp.show_graph_grids_row .set_active(SETTINGS.show_graph_grids()); imp.graph_data_points_row .set_value(f64::from(SETTINGS.graph_data_points())); imp.sidebar_details_row .set_active(SETTINGS.sidebar_details()); imp.sidebar_description_row .set_active(SETTINGS.sidebar_description()); imp.sidebar_meter_type_row .set_selected(SETTINGS.sidebar_meter_type() as u32); imp.normalize_cpu_usage_row .set_active(SETTINGS.normalize_cpu_usage()); imp.apps_show_memory_row .set_active(SETTINGS.apps_show_memory()); imp.apps_show_cpu_row.set_active(SETTINGS.apps_show_cpu()); imp.apps_show_drive_read_speed_row .set_active(SETTINGS.apps_show_drive_read_speed()); imp.apps_show_drive_read_total_row .set_active(SETTINGS.apps_show_drive_read_total()); imp.apps_show_drive_write_speed_row .set_active(SETTINGS.apps_show_drive_write_speed()); imp.apps_show_drive_write_total_row .set_active(SETTINGS.apps_show_drive_write_total()); imp.apps_show_gpu_row.set_active(SETTINGS.apps_show_gpu()); imp.apps_show_gpu_mem_row .set_active(SETTINGS.apps_show_gpu_memory()); imp.apps_show_encoder_row .set_active(SETTINGS.apps_show_encoder()); imp.apps_show_decoder_row .set_active(SETTINGS.apps_show_decoder()); imp.apps_show_swap_row.set_active(SETTINGS.apps_show_swap()); imp.apps_show_combined_memory_row .set_active(SETTINGS.apps_show_combined_memory()); imp.processes_niceness .set_active(SETTINGS.detailed_priority()); imp.processes_show_id_row .set_active(SETTINGS.processes_show_id()); imp.processes_show_user_row .set_active(SETTINGS.processes_show_user()); imp.processes_show_memory_row .set_active(SETTINGS.processes_show_memory()); imp.processes_show_cpu_row .set_active(SETTINGS.processes_show_cpu()); imp.processes_show_drive_read_speed_row .set_active(SETTINGS.processes_show_drive_read_speed()); imp.processes_show_drive_read_total_row .set_active(SETTINGS.processes_show_drive_read_total()); imp.processes_show_drive_write_speed_row .set_active(SETTINGS.processes_show_drive_write_speed()); imp.processes_show_drive_write_total_row .set_active(SETTINGS.processes_show_drive_write_total()); imp.processes_show_gpu_row .set_active(SETTINGS.processes_show_gpu()); imp.processes_show_gpu_mem_row .set_active(SETTINGS.processes_show_gpu_memory()); imp.processes_show_encoder_row .set_active(SETTINGS.processes_show_encoder()); imp.processes_show_decoder_row .set_active(SETTINGS.processes_show_decoder()); imp.processes_show_total_cpu_time_row .set_active(SETTINGS.processes_show_total_cpu_time()); imp.processes_show_user_cpu_time_row .set_active(SETTINGS.processes_show_user_cpu_time()); imp.processes_show_system_cpu_time_row .set_active(SETTINGS.processes_show_system_cpu_time()); imp.processes_show_priority_row .set_active(SETTINGS.processes_show_system_cpu_time()); imp.processes_show_swap_row .set_active(SETTINGS.processes_show_swap()); imp.processes_show_combined_memory_row .set_active(SETTINGS.processes_show_combined_memory()); imp.processes_show_commandline_row .set_active(SETTINGS.processes_show_commandline()); imp.show_virtual_drives_row .set_active(SETTINGS.show_virtual_drives()); imp.show_virtual_network_interfaces_row .set_active(SETTINGS.show_virtual_network_interfaces()); } pub fn setup_signals(&self) { trace!("Setting up ResSettingsDialog signals…"); let imp = self.imp(); imp.prefix_combo_row .connect_selected_item_notify(|combo_row| { if let Some(base) = Base::from_repr(combo_row.selected() as u8) { let _ = SETTINGS.set_base(base); } }); imp.network_bits_row.connect_active_notify(|switch_row| { let _ = SETTINGS.set_network_bits(switch_row.is_active()); }); imp.temperature_combo_row .connect_selected_item_notify(|combo_row| { if let Some(temperature_unit) = TemperatureUnit::from_repr(combo_row.selected() as u8) { let _ = SETTINGS.set_temperature_unit(temperature_unit); } }); imp.refresh_speed_combo_row .connect_selected_item_notify(|combo_row| { if let Some(refresh_speed) = RefreshSpeed::from_repr(combo_row.selected() as u8) { let _ = SETTINGS.set_refresh_speed(refresh_speed); } }); imp.show_graph_grids_row .connect_active_notify(|switch_row| { let _ = SETTINGS.set_show_graph_grids(switch_row.is_active()); }); imp.graph_data_points_row.connect_output(|spin_row| { let _ = SETTINGS.set_graph_data_points(spin_row.value() as u32); false }); imp.sidebar_details_row.connect_active_notify(|switch_row| { let _ = SETTINGS.set_sidebar_details(switch_row.is_active()); }); imp.sidebar_description_row .connect_active_notify(|switch_row| { let _ = SETTINGS.set_sidebar_description(switch_row.is_active()); }); imp.sidebar_meter_type_row .connect_selected_item_notify(|combo_row| { if let Some(t) = SidebarMeterType::from_repr(combo_row.selected() as u8) { let _ = SETTINGS.set_sidebar_meter_type(t); } }); imp.normalize_cpu_usage_row .connect_active_notify(|switch_row| { let _ = SETTINGS.set_normalize_cpu_usage(switch_row.is_active()); }); imp.apps_show_cpu_row.connect_active_notify(|switch_row| { let _ = SETTINGS.set_apps_show_cpu(switch_row.is_active()); }); imp.apps_show_memory_row .connect_active_notify(|switch_row| { let _ = SETTINGS.set_apps_show_memory(switch_row.is_active()); }); imp.apps_show_drive_read_speed_row .connect_active_notify(|switch_row| { let _ = SETTINGS.set_apps_show_drive_read_speed(switch_row.is_active()); }); imp.apps_show_drive_read_total_row .connect_active_notify(|switch_row| { let _ = SETTINGS.set_apps_show_drive_read_total(switch_row.is_active()); }); imp.apps_show_gpu_row.connect_active_notify(|switch_row| { let _ = SETTINGS.set_apps_show_gpu(switch_row.is_active()); }); imp.apps_show_gpu_mem_row .connect_active_notify(|switch_row| { let _ = SETTINGS.set_apps_show_gpu_memory(switch_row.is_active()); }); imp.apps_show_encoder_row .connect_active_notify(|switch_row| { let _ = SETTINGS.set_apps_show_encoder(switch_row.is_active()); }); imp.apps_show_decoder_row .connect_active_notify(|switch_row| { let _ = SETTINGS.set_apps_show_decoder(switch_row.is_active()); }); imp.apps_show_drive_write_speed_row .connect_active_notify(|switch_row| { let _ = SETTINGS.set_apps_show_drive_write_speed(switch_row.is_active()); }); imp.apps_show_drive_write_total_row .connect_active_notify(|switch_row| { let _ = SETTINGS.set_apps_show_drive_write_total(switch_row.is_active()); }); imp.apps_show_swap_row.connect_active_notify(|switch_row| { let _ = SETTINGS.set_apps_show_swap(switch_row.is_active()); }); imp.apps_show_combined_memory_row .connect_active_notify(|switch_row| { let _ = SETTINGS.set_apps_show_combined_memory(switch_row.is_active()); }); imp.processes_niceness.connect_active_notify(|switch_row| { let _ = SETTINGS.set_detailed_priority(switch_row.is_active()); }); imp.processes_show_id_row .connect_active_notify(|switch_row| { let _ = SETTINGS.set_processes_show_id(switch_row.is_active()); }); imp.processes_show_user_row .connect_active_notify(|switch_row| { let _ = SETTINGS.set_processes_show_user(switch_row.is_active()); }); imp.processes_show_cpu_row .connect_active_notify(|switch_row| { let _ = SETTINGS.set_processes_show_cpu(switch_row.is_active()); }); imp.processes_show_memory_row .connect_active_notify(|switch_row| { let _ = SETTINGS.set_processes_show_memory(switch_row.is_active()); }); imp.processes_show_drive_read_speed_row .connect_active_notify(|switch_row| { let _ = SETTINGS.set_processes_show_drive_read_speed(switch_row.is_active()); }); imp.processes_show_drive_read_total_row .connect_active_notify(|switch_row| { let _ = SETTINGS.set_processes_show_drive_read_total(switch_row.is_active()); }); imp.processes_show_drive_write_speed_row .connect_active_notify(|switch_row| { let _ = SETTINGS.set_processes_show_drive_write_speed(switch_row.is_active()); }); imp.processes_show_drive_write_total_row .connect_active_notify(|switch_row| { let _ = SETTINGS.set_processes_show_drive_write_total(switch_row.is_active()); }); imp.processes_show_gpu_row .connect_active_notify(|switch_row| { let _ = SETTINGS.set_processes_show_gpu(switch_row.is_active()); }); imp.processes_show_gpu_mem_row .connect_active_notify(|switch_row| { let _ = SETTINGS.set_processes_show_gpu_memory(switch_row.is_active()); }); imp.processes_show_encoder_row .connect_active_notify(|switch_row| { let _ = SETTINGS.set_processes_show_encoder(switch_row.is_active()); }); imp.processes_show_decoder_row .connect_active_notify(|switch_row| { let _ = SETTINGS.set_processes_show_decoder(switch_row.is_active()); }); imp.processes_show_total_cpu_time_row .connect_active_notify(|switch_row| { let _ = SETTINGS.set_processes_show_total_cpu_time(switch_row.is_active()); }); imp.processes_show_user_cpu_time_row .connect_active_notify(|switch_row| { let _ = SETTINGS.set_processes_show_user_cpu_time(switch_row.is_active()); }); imp.processes_show_system_cpu_time_row .connect_active_notify(|switch_row| { let _ = SETTINGS.set_processes_show_system_cpu_time(switch_row.is_active()); }); imp.processes_show_priority_row .connect_active_notify(|switch_row| { let _ = SETTINGS.set_processes_show_priority(switch_row.is_active()); }); imp.processes_show_swap_row .connect_active_notify(|switch_row| { let _ = SETTINGS.set_processes_show_swap(switch_row.is_active()); }); imp.processes_show_combined_memory_row .connect_active_notify(|switch_row| { let _ = SETTINGS.set_processes_show_combined_memory(switch_row.is_active()); }); imp.processes_show_commandline_row .connect_active_notify(|switch_row| { let _ = SETTINGS.set_processes_show_commandline(switch_row.is_active()); }); imp.show_virtual_drives_row .connect_active_notify(|switch_row| { let _ = SETTINGS.set_show_virtual_drives(switch_row.is_active()); }); imp.show_virtual_network_interfaces_row .connect_active_notify(|switch_row| { let _ = SETTINGS.set_show_virtual_network_interfaces(switch_row.is_active()); }); } } resources-1.9.1/src/ui/mod.rs000066400000000000000000000023371510634446000160750ustar00rootroot00000000000000extern crate paste; #[macro_export] macro_rules! gstring_getter_setter { ($($gstring_name:ident),*) => { $( pub fn $gstring_name(&self) -> glib::GString { let $gstring_name = self.$gstring_name.take(); self.$gstring_name.set($gstring_name.clone()); $gstring_name } paste::paste! { pub fn [](&self, $gstring_name: &str) { self.$gstring_name.set(glib::GString::from($gstring_name)); } } )* }; } #[macro_export] macro_rules! gstring_option_getter_setter { ($($gstring_name:ident),*) => { $( pub fn $gstring_name(&self) -> Option { let $gstring_name = self.$gstring_name.take(); self.$gstring_name.set($gstring_name.clone()); $gstring_name } paste::paste! { pub fn [](&self, $gstring_name: Option<&str>) { self.$gstring_name.set($gstring_name.map(glib::GString::from)); } } )* }; } pub mod dialogs; pub mod pages; pub mod widgets; pub mod window; resources-1.9.1/src/ui/pages/000077500000000000000000000000001510634446000160425ustar00rootroot00000000000000resources-1.9.1/src/ui/pages/applications/000077500000000000000000000000001510634446000205305ustar00rootroot00000000000000resources-1.9.1/src/ui/pages/applications/application_entry.rs000066400000000000000000000164601510634446000246310ustar00rootroot00000000000000use gtk::glib::{self}; use log::trace; use process_data::Containerization; use crate::{ i18n::i18n, utils::app::{App, AppsContext}, }; mod imp { use std::cell::Cell; use glib::object::Cast; use gtk::{ gio::{Icon, ThemedIcon}, glib::{ParamSpec, Properties, Value}, prelude::ObjectExt, subclass::prelude::{DerivedObjectProperties, ObjectImpl, ObjectImplExt, ObjectSubclass}, }; use crate::gstring_getter_setter; use super::*; #[derive(Properties)] #[properties(wrapper_type = super::ApplicationEntry)] pub struct ApplicationEntry { #[property(get = Self::name, set = Self::set_name, type = glib::GString)] name: Cell, #[property(get = Self::id, set = Self::set_id, type = Option)] id: Cell>, #[property(get = Self::description, set = Self::set_description, type = Option)] description: Cell>, #[property(get = Self::icon, set = Self::set_icon, type = Icon)] icon: Cell, #[property(get, set)] cpu_usage: Cell, #[property(get, set)] memory_usage: Cell, #[property(get, set)] swap_usage: Cell, #[property(get, set)] combined_memory_usage: Cell, #[property(get, set)] read_speed: Cell, #[property(get, set)] read_total: Cell, #[property(get, set)] write_speed: Cell, #[property(get, set)] write_total: Cell, #[property(get, set)] gpu_usage: Cell, #[property(get, set)] enc_usage: Cell, #[property(get, set)] dec_usage: Cell, #[property(get, set)] gpu_mem_usage: Cell, #[property(get = Self::running_since, set = Self::set_running_since)] running_since: Cell>, #[property(get = Self::containerization, set = Self::set_containerization)] containerization: Cell, #[property(get, set)] running_processes: Cell, // TODO: Make this properly dynamic, don't use a variable that's never read #[property(get = Self::symbolic)] #[allow(dead_code)] symbolic: Cell, } impl Default for ApplicationEntry { fn default() -> Self { Self { name: Cell::new(glib::GString::default()), id: Cell::new(None), description: Cell::new(None), icon: Cell::new(ThemedIcon::new("generic-process").into()), cpu_usage: Cell::new(0.0), memory_usage: Cell::new(0), combined_memory_usage: Cell::new(0), swap_usage: Cell::new(0), read_speed: Cell::new(0.0), read_total: Cell::new(0), write_speed: Cell::new(0.0), write_total: Cell::new(0), gpu_usage: Cell::new(0.0), enc_usage: Cell::new(0.0), dec_usage: Cell::new(0.0), gpu_mem_usage: Cell::new(0), symbolic: Cell::new(false), running_since: Cell::new(None), containerization: Cell::new(glib::GString::default()), running_processes: Cell::new(0), } } } impl ApplicationEntry { gstring_getter_setter!(name, containerization); gstring_option_getter_setter!(description, id, running_since); pub fn icon(&self) -> Icon { let icon = self.icon.replace(ThemedIcon::new("generic-process").into()); self.icon.set(icon.clone()); icon } pub fn set_icon(&self, icon: &Icon) { self.icon.set(icon.clone()); } pub fn symbolic(&self) -> bool { let id = self.id.take(); self.id.set(id.clone()); let icon = self.icon.replace(ThemedIcon::new("generic-process").into()); self.icon.set(icon.clone()); id.is_none() // this will be the case for System Processes || icon .downcast_ref::() .is_some_and(|themed_icon| { themed_icon .names() .iter() .all(|name| name.ends_with("-symbolic")) || themed_icon .names() .iter() .all(|name| name.contains("generic-process")) }) } } #[glib::object_subclass] impl ObjectSubclass for ApplicationEntry { const NAME: &'static str = "ApplicationEntry"; type Type = super::ApplicationEntry; } impl ObjectImpl for ApplicationEntry { fn constructed(&self) { self.parent_constructed(); } fn properties() -> &'static [ParamSpec] { Self::derived_properties() } fn set_property(&self, id: usize, value: &Value, pspec: &ParamSpec) { self.derived_set_property(id, value, pspec); } fn property(&self, id: usize, pspec: &ParamSpec) -> Value { self.derived_property(id, pspec) } } } glib::wrapper! { pub struct ApplicationEntry(ObjectSubclass); } impl ApplicationEntry { pub fn new(app: &App, apps_context: &AppsContext) -> Self { trace!("Creating ApplicationEntry ({}) GObject…", app.display_name); let containerization = match app.containerization { Containerization::None => i18n("No"), Containerization::Flatpak => i18n("Yes (Flatpak)"), Containerization::Snap => i18n("Yes (Snap)"), }; let this: Self = glib::Object::builder() .property("name", &app.display_name) .property("icon", &app.icon) .property("id", &app.id) .property("description", &app.description) .property("containerization", containerization) .property("running_since", app.running_since(apps_context).ok()) .build(); this.update(app, apps_context); this } pub fn update(&self, app: &App, apps_context: &AppsContext) { trace!("Refreshing ApplicationEntry ({})…", app.display_name); self.set_cpu_usage(app.cpu_time_ratio(apps_context)); self.set_memory_usage(app.memory_usage(apps_context) as u64); self.set_swap_usage(app.swap_usage(apps_context) as u64); self.set_combined_memory_usage( app.memory_usage(apps_context) .saturating_add(app.swap_usage(apps_context)) as u64, ); self.set_read_speed(app.read_speed(apps_context)); self.set_read_total(app.read_total(apps_context)); self.set_write_speed(app.write_speed(apps_context)); self.set_write_total(app.write_total(apps_context)); self.set_gpu_usage(app.gpu_usage(apps_context)); self.set_enc_usage(app.enc_usage(apps_context)); self.set_dec_usage(app.dec_usage(apps_context)); self.set_gpu_mem_usage(app.gpu_mem_usage(apps_context)); self.set_running_processes(app.running_processes() as u32); } } resources-1.9.1/src/ui/pages/applications/application_name_cell.rs000066400000000000000000000115771510634446000254130ustar00rootroot00000000000000use adw::{glib::property::PropertySet, prelude::*, subclass::prelude::*}; use gtk::{gio::Icon, glib}; use log::trace; mod imp { use std::cell::{Cell, RefCell}; use super::*; use gtk::{ Box, CompositeTemplate, gio::ThemedIcon, glib::{ParamSpec, Properties, Value}, }; #[derive(CompositeTemplate, Properties)] #[template(resource = "/net/nokyan/Resources/ui/widgets/application_name_cell.ui")] #[properties(wrapper_type = super::ResApplicationNameCell)] pub struct ResApplicationNameCell { #[template_child] pub image: TemplateChild, #[template_child] pub inscription: TemplateChild, #[property(get = Self::name, set = Self::set_name, type = glib::GString)] name: Cell, #[property(get = Self::tooltip, set = Self::set_tooltip, type = glib::GString)] tooltip: Cell, #[property(get = Self::icon, set = Self::set_icon, type = Icon)] icon: RefCell, #[property(get, set = Self::set_symbolic)] symbolic: Cell, } impl Default for ResApplicationNameCell { fn default() -> Self { Self { image: Default::default(), inscription: Default::default(), name: Default::default(), tooltip: Default::default(), icon: RefCell::new(ThemedIcon::new("generic-process").into()), symbolic: Default::default(), } } } impl ResApplicationNameCell { pub fn name(&self) -> glib::GString { let name = self.name.take(); let result = name.clone(); self.name.set(name); result } pub fn set_name(&self, name: &str) { self.name.set(glib::GString::from(name)); self.inscription.set_text(Some(name)); } pub fn tooltip(&self) -> glib::GString { let tooltip = self.tooltip.take(); let result = tooltip.clone(); self.tooltip.set(tooltip); result } pub fn set_tooltip(&self, tooltip: &str) { self.tooltip.set(glib::GString::from(tooltip)); self.inscription.set_tooltip_text(Some(tooltip)); } pub fn icon(&self) -> Icon { let icon = self .icon .replace_with(|_| ThemedIcon::new("generic-process").into()); self.icon.set(icon.clone()); icon } pub fn set_icon(&self, icon: &Icon) { let current_icon = self .icon .replace_with(|_| ThemedIcon::new("generic-process").into()); if ¤t_icon == icon { self.icon.set(current_icon); return; } self.image.set_from_gicon(icon); self.icon.set(icon.clone()); } pub fn set_symbolic(&self, symbolic: bool) { self.symbolic.set(symbolic); if symbolic { self.image.set_css_classes(&["bubble"]); self.image.set_pixel_size(16); } else { self.image.set_css_classes(&["lowres-icon"]); self.image.set_pixel_size(32); } } } #[glib::object_subclass] impl ObjectSubclass for ResApplicationNameCell { const NAME: &'static str = "ResApplicationNameCell"; type Type = super::ResApplicationNameCell; type ParentType = Box; fn class_init(klass: &mut Self::Class) { Self::bind_template(klass); } // You must call `Widget`'s `init_template()` within `instance_init()`. fn instance_init(obj: &glib::subclass::InitializingObject) { obj.init_template(); } } impl ObjectImpl for ResApplicationNameCell { fn constructed(&self) { self.parent_constructed(); } fn properties() -> &'static [ParamSpec] { Self::derived_properties() } fn set_property(&self, id: usize, value: &Value, pspec: &ParamSpec) { self.derived_set_property(id, value, pspec); } fn property(&self, id: usize, pspec: &ParamSpec) -> Value { self.derived_property(id, pspec) } } impl WidgetImpl for ResApplicationNameCell {} impl BoxImpl for ResApplicationNameCell {} } glib::wrapper! { pub struct ResApplicationNameCell(ObjectSubclass) @extends gtk::Widget, gtk::Box, @implements gtk::Buildable, gtk::ConstraintTarget, gtk::Accessible; } impl Default for ResApplicationNameCell { fn default() -> Self { Self::new() } } impl ResApplicationNameCell { pub fn new() -> Self { trace!("Creating ResApplicationNameCell GObject…"); glib::Object::new::() } } resources-1.9.1/src/ui/pages/applications/mod.rs000066400000000000000000001523501510634446000216630ustar00rootroot00000000000000pub mod application_entry; mod application_name_cell; use std::collections::HashSet; use adw::ResponseAppearance; use adw::{prelude::*, subclass::prelude::*}; use async_channel::Sender; use gtk::glib::{self, MainContext, Object, clone, closure}; use gtk::{ ColumnView, ColumnViewColumn, EventControllerKey, FilterChange, ListItem, NumericSorter, SortType, StringSorter, Widget, gio, }; use crate::config::PROFILE; use crate::i18n::{i18n, i18n_f}; use crate::ui::dialogs::app_dialog::ResAppDialog; use crate::ui::window::{Action, MainWindow}; use crate::utils::NUM_CPUS; use crate::utils::app::AppsContext; use crate::utils::process::ProcessAction; use crate::utils::settings::SETTINGS; use crate::utils::units::{convert_speed, convert_storage}; use self::application_entry::ApplicationEntry; use self::application_name_cell::ResApplicationNameCell; pub const TAB_ID: &str = "applications"; mod imp { use std::{ cell::{Cell, RefCell}, sync::OnceLock, }; use crate::ui::{pages::APPLICATIONS_PRIMARY_ORD, window::Action}; use super::*; use gtk::{ ColumnViewColumn, CompositeTemplate, gio::{Icon, ThemedIcon}, glib::{ParamSpec, Properties, Value}, }; #[derive(CompositeTemplate, Properties)] #[template(resource = "/net/nokyan/Resources/ui/pages/applications.ui")] #[properties(wrapper_type = super::ResApplications)] pub struct ResApplications { #[template_child] pub toast_overlay: TemplateChild, #[template_child] pub popover_menu: TemplateChild, #[template_child] pub search_bar: TemplateChild, #[template_child] pub search_entry: TemplateChild, #[template_child] pub applications_scrolled_window: TemplateChild, #[template_child] pub information_button: TemplateChild, #[template_child] pub end_application_button: TemplateChild, pub store: RefCell, pub selection_model: RefCell, pub filter_model: RefCell, pub sort_model: RefCell, pub column_view: RefCell, pub open_info_dialog: RefCell, ResAppDialog)>>, pub info_dialog_closed: Cell, pub sender: OnceLock>, pub popped_over_app: RefCell>, pub columns: RefCell>, #[property(get)] uses_progress_bar: Cell, #[property(get)] icon: RefCell, #[property(get = Self::tab_name, type = glib::GString)] tab_name: Cell, #[property(get = Self::tab_detail_string, type = glib::GString)] tab_detail_string: Cell, #[property(get = Self::tab_usage_string, set = Self::set_tab_usage_string, type = glib::GString)] tab_usage_string: Cell, #[property(get = Self::tab_id, type = glib::GString)] tab_id: Cell, #[property(get)] graph_locked_max_y: Cell, #[property(get)] primary_ord: Cell, #[property(get)] secondary_ord: Cell, } impl ResApplications { gstring_getter_setter!(tab_name, tab_detail_string, tab_usage_string, tab_id); } impl Default for ResApplications { fn default() -> Self { Self { toast_overlay: Default::default(), popover_menu: Default::default(), search_bar: Default::default(), search_entry: Default::default(), information_button: Default::default(), store: gio::ListStore::new::().into(), selection_model: Default::default(), filter_model: Default::default(), sort_model: Default::default(), column_view: Default::default(), open_info_dialog: Default::default(), info_dialog_closed: Default::default(), sender: Default::default(), applications_scrolled_window: Default::default(), end_application_button: Default::default(), uses_progress_bar: Cell::new(false), icon: RefCell::new(ThemedIcon::new("app-symbolic").into()), tab_name: Cell::from(glib::GString::from(i18n("Apps"))), tab_detail_string: Cell::new(glib::GString::new()), tab_usage_string: Cell::new(glib::GString::new()), tab_id: Cell::new(glib::GString::from(TAB_ID)), popped_over_app: Default::default(), columns: Default::default(), graph_locked_max_y: Cell::new(true), primary_ord: Cell::new(APPLICATIONS_PRIMARY_ORD), secondary_ord: Default::default(), } } } #[glib::object_subclass] impl ObjectSubclass for ResApplications { const NAME: &'static str = "ResApplications"; type Type = super::ResApplications; type ParentType = adw::Bin; fn class_init(klass: &mut Self::Class) { klass.install_action( "applications.context-end-app", None, move |res_applications, _, _| { if let Some(application_entry) = res_applications.imp().popped_over_app.borrow().as_ref() { res_applications .open_app_action_dialog(application_entry, ProcessAction::TERM); } }, ); klass.install_action( "applications.context-kill-app", None, move |res_applications, _, _| { if let Some(application_entry) = res_applications.imp().popped_over_app.borrow().as_ref() { res_applications .open_app_action_dialog(application_entry, ProcessAction::KILL); } }, ); klass.install_action( "applications.context-halt-app", None, move |res_applications, _, _| { if let Some(application_entry) = res_applications.imp().popped_over_app.borrow().as_ref() { res_applications .open_app_action_dialog(application_entry, ProcessAction::STOP); } }, ); klass.install_action( "applications.context-continue-app", None, move |res_applications, _, _| { if let Some(application_entry) = res_applications.imp().popped_over_app.borrow().as_ref() { res_applications .open_app_action_dialog(application_entry, ProcessAction::CONT); } }, ); klass.install_action( "applications.context-information", None, move |res_applications, _, _| { if let Some(application_entry) = res_applications.imp().popped_over_app.borrow().as_ref() { res_applications.open_info_dialog(application_entry); } }, ); klass.install_action( "applications.kill-app", None, move |res_applications, _, _| { if let Some(app) = res_applications.get_selected_app_entry() { res_applications.open_app_action_dialog(&app, ProcessAction::KILL); } }, ); klass.install_action( "applications.halt-app", None, move |res_applications, _, _| { if let Some(app) = res_applications.get_selected_app_entry() { res_applications.open_app_action_dialog(&app, ProcessAction::STOP); } }, ); klass.install_action( "applications.continue-app", None, move |res_applications, _, _| { if let Some(app) = res_applications.get_selected_app_entry() { res_applications.open_app_action_dialog(&app, ProcessAction::CONT); } }, ); Self::bind_template(klass); } // You must call `Widget`'s `init_template()` within `instance_init()`. fn instance_init(obj: &glib::subclass::InitializingObject) { obj.init_template(); } } impl ObjectImpl for ResApplications { fn constructed(&self) { self.parent_constructed(); let obj = self.obj(); // Devel Profile if PROFILE == "Devel" { obj.add_css_class("devel"); } } fn properties() -> &'static [ParamSpec] { Self::derived_properties() } fn set_property(&self, id: usize, value: &Value, pspec: &ParamSpec) { self.derived_set_property(id, value, pspec); } fn property(&self, id: usize, pspec: &ParamSpec) -> Value { self.derived_property(id, pspec) } } impl WidgetImpl for ResApplications {} impl BinImpl for ResApplications {} } glib::wrapper! { pub struct ResApplications(ObjectSubclass) @extends gtk::Widget, adw::Bin, @implements gtk::Buildable, gtk::ConstraintTarget, gtk::Accessible; } impl Default for ResApplications { fn default() -> Self { Self::new() } } impl ResApplications { pub fn new() -> Self { glib::Object::new::() } pub fn toggle_search(&self) { let imp = self.imp(); imp.search_bar .set_search_mode(!imp.search_bar.is_search_mode()); } pub fn close_search(&self) { let imp = self.imp(); imp.search_bar.set_search_mode(false); } pub fn init(&self, sender: Sender) { let imp = self.imp(); imp.sender.set(sender).unwrap(); self.setup_widgets(); self.setup_signals(); } fn add_gestures(&self, item: &ListItem) { let widget = item.child().unwrap(); let secondary_click = gtk::GestureClick::new(); secondary_click.set_button(3); secondary_click.connect_released(clone!( #[weak] widget, #[weak] item, #[weak(rename_to = this)] self, move |_, _, x, y| { if let Some(entry) = item.item().and_downcast::() { let imp = this.imp(); let popover_menu = &imp.popover_menu; *imp.popped_over_app.borrow_mut() = Some(entry); let position = widget .compute_point(&this, >k::graphene::Point::new(x as _, y as _)) .unwrap(); popover_menu.set_pointing_to(Some(>k::gdk::Rectangle::new( position.x().round() as i32, position.y().round() as i32, 1, 1, ))); popover_menu.popup(); } } )); widget.add_controller(secondary_click); } pub fn setup_widgets(&self) { let imp = self.imp(); imp.popover_menu.set_parent(self); *imp.column_view.borrow_mut() = gtk::ColumnView::new(None::); let column_view = imp.column_view.borrow(); let mut columns = imp.columns.borrow_mut(); columns.push(self.add_name_column(&column_view)); columns.push(self.add_memory_column(&column_view)); columns.push(self.add_cpu_column(&column_view)); columns.push(self.add_read_speed_column(&column_view)); columns.push(self.add_read_total_column(&column_view)); columns.push(self.add_write_speed_column(&column_view)); columns.push(self.add_write_total_column(&column_view)); columns.push(self.add_gpu_column(&column_view)); columns.push(self.add_gpu_mem_column(&column_view)); columns.push(self.add_encoder_column(&column_view)); columns.push(self.add_decoder_column(&column_view)); columns.push(self.add_swap_column(&column_view)); columns.push(self.add_combined_memory_column(&column_view)); let store = gio::ListStore::new::(); let filter_model = gtk::FilterListModel::new( Some(store.clone()), Some(gtk::CustomFilter::new(clone!( #[strong(rename_to = this)] self, move |obj| this.search_filter(obj) ))), ); let sort_model = gtk::SortListModel::new(Some(filter_model.clone()), column_view.sorter()); let selection_model = gtk::SingleSelection::new(Some(sort_model.clone())); selection_model.set_can_unselect(true); selection_model.set_autoselect(false); column_view.set_model(Some(&selection_model)); column_view.sort_by_column( columns .get(SETTINGS.apps_sort_by() as usize) .or_else(|| columns.first()), SETTINGS.apps_sort_by_ascending(), ); column_view.add_css_class("resources-columnview"); *imp.store.borrow_mut() = store; *imp.selection_model.borrow_mut() = selection_model; *imp.sort_model.borrow_mut() = sort_model; *imp.filter_model.borrow_mut() = filter_model; imp.applications_scrolled_window .set_child(Some(&*column_view)); } pub fn setup_signals(&self) { let imp = self.imp(); imp.selection_model .borrow() .connect_selection_changed(clone!( #[weak(rename_to = this)] self, move |model, _, _| { let imp = this.imp(); let is_system_processes = model.selected_item().is_some_and(|object| { object .downcast::() .unwrap() .id() .is_none() }); imp.information_button .set_sensitive(model.selected() != u32::MAX); imp.end_application_button .set_sensitive(model.selected() != u32::MAX && !is_system_processes); } )); imp.search_bar .set_key_capture_widget(self.parent().as_ref()); imp.search_entry.connect_search_changed(clone!( #[strong(rename_to = this)] self, move |_| { let imp = this.imp(); if let Some(filter) = imp.filter_model.borrow().filter() { filter.changed(FilterChange::Different); } } )); let event_controller = EventControllerKey::new(); event_controller.connect_key_released(clone!( #[weak(rename_to = this)] self, move |_, key, _, _| { if key.name().unwrap_or_default() == "Escape" { this.close_search(); } } )); imp.search_bar.add_controller(event_controller); imp.information_button.connect_clicked(clone!( #[weak(rename_to = this)] self, move |_| { let imp = this.imp(); let selection_option = imp .selection_model .borrow() .selected_item() .map(|object| object.downcast::().unwrap()); if let Some(selection) = selection_option { this.open_info_dialog(&selection); } } )); imp.end_application_button.connect_clicked(clone!( #[weak(rename_to = this)] self, move |_| { if let Some(app) = this.get_selected_app_entry() { this.open_app_action_dialog(&app, ProcessAction::TERM); } } )); if let Some(column_view_sorter) = imp.column_view.borrow().sorter() { column_view_sorter.connect_changed(clone!( #[weak(rename_to = this)] self, move |sorter, _| { if let Some(sorter) = sorter.downcast_ref::() { let current_column = sorter .primary_sort_column() .map(|column| column.as_ptr() as usize) .unwrap_or_default(); let current_column_number = this .imp() .columns .borrow() .iter() .enumerate() .find(|(_, column)| column.as_ptr() as usize == current_column) .map_or(0, |(i, _)| i as u32); // 0 corresponds to the name column if SETTINGS.apps_sort_by() != current_column_number { let _ = SETTINGS.set_apps_sort_by(current_column_number); } if SETTINGS.apps_sort_by_ascending() != sorter.primary_sort_order() { let _ = SETTINGS.set_apps_sort_by_ascending(sorter.primary_sort_order()); } } } )); } } pub fn search_bar(&self) -> >k::SearchBar { &self.imp().search_bar } pub fn open_info_dialog(&self, app: &ApplicationEntry) { let imp = self.imp(); if imp.open_info_dialog.borrow().is_some() { return; } imp.info_dialog_closed.set(false); let dialog = ResAppDialog::new(); dialog.init(app); AdwDialogExt::present(&dialog, Some(&MainWindow::default())); dialog.connect_closed(clone!( #[weak(rename_to = this)] self, move |_| { this.imp().info_dialog_closed.set(true); } )); *imp.open_info_dialog.borrow_mut() = Some(( app.id().as_ref().map(std::string::ToString::to_string), dialog, )); } fn search_filter(&self, obj: &Object) -> bool { let imp = self.imp(); let item = obj.downcast_ref::().unwrap(); let search_string = imp.search_entry.text().to_string().to_lowercase(); !imp.search_bar.is_search_mode() || item.name().to_lowercase().contains(&search_string) || item .id() .is_some_and(|id| id.to_lowercase().contains(&search_string)) || item .description() .unwrap_or_default() .to_lowercase() .contains(&search_string) } pub fn get_selected_app_entry(&self) -> Option { self.imp() .selection_model .borrow() .selected_item() .and_then(|object| object.downcast::().ok()) } pub fn refresh_apps_list(&self, apps_context: &AppsContext) { let imp = self.imp(); if imp.info_dialog_closed.get() { let _ = imp.open_info_dialog.take(); imp.info_dialog_closed.set(false); } let store = imp.store.borrow_mut(); let mut dialog_opt = &*imp.open_info_dialog.borrow_mut(); let mut ids_to_remove = HashSet::new(); let mut already_existing_ids = HashSet::new(); // change process entries of apps that have run before store .iter::() .flatten() .for_each(|object| { let app_id = object.id().map(|gs| gs.to_string()); // filter out apps that have run before but don't anymore if app_id.is_some() // don't try to filter out "System Processes" && !apps_context .get_app(&app_id) .unwrap() .is_running() { if let Some((dialog_id, dialog)) = dialog_opt { if dialog_id.as_deref() == app_id.as_deref() { AdwDialogExt::close(dialog); dialog_opt = &None; } } *imp.popped_over_app.borrow_mut() = None; ids_to_remove.insert(app_id.clone()); } if let Some(app) = apps_context.get_app(&app_id) { object.update(app, apps_context); if let Some((dialog_id, dialog)) = dialog_opt { if *dialog_id == app_id { dialog.update(&object); } } already_existing_ids.insert(app_id); } }); // remove apps that recently have stopped running store.retain(|object| { !ids_to_remove.contains( &object .clone() .downcast::() .unwrap() .id() .map(|gs| gs.to_string()), ) }); // add the newly started apps to the store let items: Vec = apps_context .running_apps_iter() .filter(|app| { !already_existing_ids.contains(&app.id) && !ids_to_remove.contains(&app.id) }) .map(|new_item| ApplicationEntry::new(new_item, apps_context)) .collect(); store.extend_from_slice(&items); if let Some(sorter) = imp.column_view.borrow().sorter() { sorter.changed(gtk::SorterChange::Different); } // -1 because we don't want to count System Processes self.set_tab_usage_string(i18n_f( "Running Apps: {}", &[&(store.n_items().saturating_sub(1)).to_string()], )); } pub fn open_app_action_dialog(&self, app: &ApplicationEntry, action: ProcessAction) { // Nothing too bad can happen on Continue so dont show the dialog if action == ProcessAction::CONT { let main_context = MainContext::default(); main_context.spawn_local(clone!( #[weak(rename_to = this)] self, #[weak] app, async move { let imp = this.imp(); let _ = imp .sender .get() .unwrap() .send(Action::ManipulateApp( action, app.id().unwrap().to_string(), imp.toast_overlay.get(), )) .await; } )); return; } // Confirmation dialog & warning let dialog = adw::AlertDialog::builder() .heading(get_action_name(action, &app.name())) .body(get_action_warning(action)) .build(); dialog.add_response("yes", &get_action_description(action)); dialog.set_response_appearance("yes", ResponseAppearance::Destructive); dialog.add_response("no", &i18n("Cancel")); dialog.set_default_response(Some("no")); dialog.set_close_response("no"); // Called when "yes" or "no" were clicked dialog.connect_response( None, clone!( #[weak(rename_to = this)] self, #[weak] app, move |_, response| { if response == "yes" { let main_context = MainContext::default(); main_context.spawn_local(clone!( #[weak] this, #[strong] app, async move { let imp = this.imp(); let _ = imp .sender .get() .unwrap() .send(Action::ManipulateApp( action, app.id().unwrap().to_string(), imp.toast_overlay.get(), )) .await; } )); } } ), ); dialog.present(Some(&MainWindow::default())); } fn add_name_column(&self, column_view: &ColumnView) -> ColumnViewColumn { let name_col_factory = gtk::SignalListItemFactory::new(); let name_col = gtk::ColumnViewColumn::new(Some(&i18n("App")), Some(name_col_factory.clone())); name_col.set_resizable(true); name_col.set_expand(true); name_col_factory.connect_setup(clone!( #[weak(rename_to = this)] self, move |_factory, item| { let item = item.downcast_ref::().unwrap(); let row = ResApplicationNameCell::new(); item.set_child(Some(&row)); item.property_expression("item") .chain_property::("name") .bind(&row, "name", Widget::NONE); item.property_expression("item") .chain_property::("icon") .bind(&row, "icon", Widget::NONE); item.property_expression("item") .chain_property::("symbolic") .bind(&row, "symbolic", Widget::NONE); this.add_gestures(item); } )); name_col_factory.connect_teardown(move |_factory, item| { let item = item.downcast_ref::().unwrap(); item.set_child(None::<&ResApplicationNameCell>); }); let name_col_sorter = StringSorter::builder() .ignore_case(true) .expression(gtk::PropertyExpression::new( ApplicationEntry::static_type(), None::<>k::Expression>, "name", )) .build(); name_col.set_sorter(Some(&name_col_sorter)); column_view.append_column(&name_col); name_col } fn add_memory_column(&self, column_view: &ColumnView) -> ColumnViewColumn { let memory_col_factory = gtk::SignalListItemFactory::new(); let memory_col = gtk::ColumnViewColumn::new(Some(&i18n("Memory")), Some(memory_col_factory.clone())); memory_col.set_resizable(true); memory_col_factory.connect_setup(clone!( #[weak(rename_to = this)] self, move |_factory, item| { let item = item.downcast_ref::().unwrap(); let row = gtk::Inscription::new(None); row.set_min_chars(9); row.set_xalign(1.0); item.set_child(Some(&row)); item.property_expression("item") .chain_property::("memory_usage") .chain_closure::(closure!(|_: Option, memory_usage: u64| { convert_storage(memory_usage as f64, false) })) .bind(&row, "text", Widget::NONE); this.add_gestures(item); } )); memory_col_factory.connect_teardown(move |_factory, item| { let item = item.downcast_ref::().unwrap(); item.set_child(None::<>k::Inscription>); }); let memory_col_sorter = NumericSorter::builder() .sort_order(SortType::Ascending) .expression(gtk::PropertyExpression::new( ApplicationEntry::static_type(), None::<>k::Expression>, "memory_usage", )) .build(); memory_col.set_sorter(Some(&memory_col_sorter)); memory_col.set_visible(SETTINGS.apps_show_memory()); column_view.append_column(&memory_col); SETTINGS.connect_apps_show_memory(clone!( #[weak] memory_col, move |visible| memory_col.set_visible(visible) )); memory_col } fn add_cpu_column(&self, column_view: &ColumnView) -> ColumnViewColumn { let cpu_col_factory = gtk::SignalListItemFactory::new(); let cpu_col = gtk::ColumnViewColumn::new(Some(&i18n("Processor")), Some(cpu_col_factory.clone())); cpu_col.set_resizable(true); cpu_col_factory.connect_setup(clone!( #[weak(rename_to = this)] self, move |_factory, item| { let item = item.downcast_ref::().unwrap(); let row = gtk::Inscription::new(None); row.set_min_chars(7); row.set_xalign(1.0); item.set_child(Some(&row)); item.property_expression("item") .chain_property::("cpu_usage") .chain_closure::(closure!(|_: Option, cpu_usage: f32| { let mut percentage = cpu_usage * 100.0; if !SETTINGS.normalize_cpu_usage() { percentage *= *NUM_CPUS as f32; } format!("{percentage:.1} %") })) .bind(&row, "text", Widget::NONE); this.add_gestures(item); } )); cpu_col_factory.connect_teardown(move |_factory, item| { let item = item.downcast_ref::().unwrap(); item.set_child(None::<>k::Inscription>); }); let cpu_col_sorter = NumericSorter::builder() .sort_order(SortType::Ascending) .expression(gtk::PropertyExpression::new( ApplicationEntry::static_type(), None::<>k::Expression>, "cpu_usage", )) .build(); cpu_col.set_sorter(Some(&cpu_col_sorter)); cpu_col.set_visible(SETTINGS.apps_show_cpu()); column_view.append_column(&cpu_col); SETTINGS.connect_apps_show_cpu(clone!( #[weak] cpu_col, move |visible| cpu_col.set_visible(visible) )); cpu_col } fn add_read_speed_column(&self, column_view: &ColumnView) -> ColumnViewColumn { let read_speed_col_factory = gtk::SignalListItemFactory::new(); let read_speed_col = gtk::ColumnViewColumn::new( Some(&i18n("Drive Read")), Some(read_speed_col_factory.clone()), ); read_speed_col.set_resizable(true); read_speed_col_factory.connect_setup(clone!( #[weak(rename_to = this)] self, move |_factory, item| { let item = item.downcast_ref::().unwrap(); let row = gtk::Inscription::new(None); row.set_min_chars(11); row.set_xalign(1.0); item.set_child(Some(&row)); item.property_expression("item") .chain_property::("read_speed") .chain_closure::(closure!(|_: Option, read_speed: f64| { if read_speed == -1.0 { i18n("N/A") } else { convert_speed(read_speed, false) } })) .bind(&row, "text", Widget::NONE); this.add_gestures(item); } )); read_speed_col_factory.connect_teardown(move |_factory, item| { let item = item.downcast_ref::().unwrap(); item.set_child(None::<>k::Inscription>); }); let read_speed_col_sorter = NumericSorter::builder() .sort_order(SortType::Ascending) .expression(gtk::PropertyExpression::new( ApplicationEntry::static_type(), None::<>k::Expression>, "read_speed", )) .build(); read_speed_col.set_sorter(Some(&read_speed_col_sorter)); read_speed_col.set_visible(SETTINGS.apps_show_drive_read_speed()); column_view.append_column(&read_speed_col); SETTINGS.connect_apps_show_drive_read_speed(clone!( #[weak] read_speed_col, move |visible| read_speed_col.set_visible(visible) )); read_speed_col } fn add_read_total_column(&self, column_view: &ColumnView) -> ColumnViewColumn { let read_total_col_factory = gtk::SignalListItemFactory::new(); let read_total_col = gtk::ColumnViewColumn::new( Some(&i18n("Drive Read Total")), Some(read_total_col_factory.clone()), ); read_total_col.set_resizable(true); read_total_col_factory.connect_setup(clone!( #[weak(rename_to = this)] self, move |_factory, item| { let item = item.downcast_ref::().unwrap(); let row = gtk::Inscription::new(None); row.set_min_chars(9); row.set_xalign(1.0); item.set_child(Some(&row)); item.property_expression("item") .chain_property::("read_total") .chain_closure::(closure!(|_: Option, read_total: u64| { convert_storage(read_total as f64, false) })) .bind(&row, "text", Widget::NONE); this.add_gestures(item); } )); read_total_col_factory.connect_teardown(move |_factory, item| { let item = item.downcast_ref::().unwrap(); item.set_child(None::<>k::Inscription>); }); let read_total_col_sorter = NumericSorter::builder() .sort_order(SortType::Ascending) .expression(gtk::PropertyExpression::new( ApplicationEntry::static_type(), None::<>k::Expression>, "read_total", )) .build(); read_total_col.set_sorter(Some(&read_total_col_sorter)); read_total_col.set_visible(SETTINGS.apps_show_drive_read_total()); column_view.append_column(&read_total_col); SETTINGS.connect_apps_show_drive_read_total(clone!( #[weak] read_total_col, move |visible| read_total_col.set_visible(visible) )); read_total_col } fn add_write_speed_column(&self, column_view: &ColumnView) -> ColumnViewColumn { let write_speed_col_factory = gtk::SignalListItemFactory::new(); let write_speed_col = gtk::ColumnViewColumn::new( Some(&i18n("Drive Write")), Some(write_speed_col_factory.clone()), ); write_speed_col.set_resizable(true); write_speed_col_factory.connect_setup(clone!( #[weak(rename_to = this)] self, move |_factory, item| { let item = item.downcast_ref::().unwrap(); let row = gtk::Inscription::new(None); row.set_min_chars(11); row.set_xalign(1.0); item.set_child(Some(&row)); item.property_expression("item") .chain_property::("write_speed") .chain_closure::(closure!(|_: Option, write_speed: f64| { if write_speed == -1.0 { i18n("N/A") } else { convert_speed(write_speed, false) } })) .bind(&row, "text", Widget::NONE); this.add_gestures(item); } )); write_speed_col_factory.connect_teardown(move |_factory, item| { let item = item.downcast_ref::().unwrap(); item.set_child(None::<>k::Inscription>); }); let write_speed_col_sorter = NumericSorter::builder() .sort_order(SortType::Ascending) .expression(gtk::PropertyExpression::new( ApplicationEntry::static_type(), None::<>k::Expression>, "write_speed", )) .build(); write_speed_col.set_sorter(Some(&write_speed_col_sorter)); write_speed_col.set_visible(SETTINGS.apps_show_drive_write_speed()); column_view.append_column(&write_speed_col); SETTINGS.connect_apps_show_drive_write_speed(clone!( #[weak] write_speed_col, move |visible| { write_speed_col.set_visible(visible); } )); write_speed_col } fn add_write_total_column(&self, column_view: &ColumnView) -> ColumnViewColumn { let write_total_col_factory = gtk::SignalListItemFactory::new(); let write_total_col = gtk::ColumnViewColumn::new( Some(&i18n("Drive Write Total")), Some(write_total_col_factory.clone()), ); write_total_col.set_resizable(true); write_total_col_factory.connect_setup(clone!( #[weak(rename_to = this)] self, move |_factory, item| { let item = item.downcast_ref::().unwrap(); let row = gtk::Inscription::new(None); row.set_min_chars(9); row.set_xalign(1.0); item.set_child(Some(&row)); item.property_expression("item") .chain_property::("write_total") .chain_closure::(closure!(|_: Option, write_total: u64| { convert_storage(write_total as f64, false) })) .bind(&row, "text", Widget::NONE); this.add_gestures(item); } )); write_total_col_factory.connect_teardown(move |_factory, item| { let item = item.downcast_ref::().unwrap(); item.set_child(None::<>k::Inscription>); }); let write_total_col_sorter = NumericSorter::builder() .sort_order(SortType::Ascending) .expression(gtk::PropertyExpression::new( ApplicationEntry::static_type(), None::<>k::Expression>, "write_total", )) .build(); write_total_col.set_sorter(Some(&write_total_col_sorter)); write_total_col.set_visible(SETTINGS.apps_show_drive_write_total()); column_view.append_column(&write_total_col); SETTINGS.connect_apps_show_drive_write_total(clone!( #[weak] write_total_col, move |visible| { write_total_col.set_visible(visible); } )); write_total_col } fn add_gpu_column(&self, column_view: &ColumnView) -> ColumnViewColumn { let gpu_col_factory = gtk::SignalListItemFactory::new(); let gpu_col = gtk::ColumnViewColumn::new(Some(&i18n("GPU")), Some(gpu_col_factory.clone())); gpu_col.set_resizable(true); gpu_col_factory.connect_setup(clone!( #[weak(rename_to = this)] self, move |_factory, item| { let item = item.downcast_ref::().unwrap(); let row = gtk::Inscription::new(None); row.set_min_chars(7); row.set_xalign(1.0); item.set_child(Some(&row)); item.property_expression("item") .chain_property::("gpu_usage") .chain_closure::(closure!(|_: Option, gpu_usage: f32| { format!("{:.1} %", gpu_usage * 100.0) })) .bind(&row, "text", Widget::NONE); this.add_gestures(item); } )); gpu_col_factory.connect_teardown(move |_factory, item| { let item = item.downcast_ref::().unwrap(); item.set_child(None::<>k::Inscription>); }); let gpu_col_sorter = NumericSorter::builder() .sort_order(SortType::Ascending) .expression(gtk::PropertyExpression::new( ApplicationEntry::static_type(), None::<>k::Expression>, "gpu_usage", )) .build(); gpu_col.set_sorter(Some(&gpu_col_sorter)); gpu_col.set_visible(SETTINGS.apps_show_gpu()); column_view.append_column(&gpu_col); SETTINGS.connect_apps_show_gpu(clone!( #[weak] gpu_col, move |visible| gpu_col.set_visible(visible) )); gpu_col } fn add_encoder_column(&self, column_view: &ColumnView) -> ColumnViewColumn { let encoder_col_factory = gtk::SignalListItemFactory::new(); let encoder_col = gtk::ColumnViewColumn::new( Some(&i18n("Video Encoder")), Some(encoder_col_factory.clone()), ); encoder_col.set_resizable(true); encoder_col_factory.connect_setup(clone!( #[weak(rename_to = this)] self, move |_factory, item| { let item = item.downcast_ref::().unwrap(); let row = gtk::Inscription::new(None); row.set_min_chars(7); row.set_xalign(1.0); item.set_child(Some(&row)); item.property_expression("item") .chain_property::("enc_usage") .chain_closure::(closure!(|_: Option, enc_usage: f32| { format!("{:.1} %", enc_usage * 100.0) })) .bind(&row, "text", Widget::NONE); this.add_gestures(item); } )); encoder_col_factory.connect_teardown(move |_factory, item| { let item = item.downcast_ref::().unwrap(); item.set_child(None::<>k::Inscription>); }); let encoder_col_sorter = NumericSorter::builder() .sort_order(SortType::Ascending) .expression(gtk::PropertyExpression::new( ApplicationEntry::static_type(), None::<>k::Expression>, "enc_usage", )) .build(); encoder_col.set_sorter(Some(&encoder_col_sorter)); encoder_col.set_visible(SETTINGS.apps_show_encoder()); column_view.append_column(&encoder_col); SETTINGS.connect_apps_show_encoder(clone!( #[weak] encoder_col, move |visible| encoder_col.set_visible(visible) )); encoder_col } fn add_decoder_column(&self, column_view: &ColumnView) -> ColumnViewColumn { let decoder_col_factory = gtk::SignalListItemFactory::new(); let decoder_col = gtk::ColumnViewColumn::new( Some(&i18n("Video Decoder")), Some(decoder_col_factory.clone()), ); decoder_col.set_resizable(true); decoder_col_factory.connect_setup(clone!( #[weak(rename_to = this)] self, move |_factory, item| { let item = item.downcast_ref::().unwrap(); let row = gtk::Inscription::new(None); row.set_min_chars(7); row.set_xalign(1.0); item.set_child(Some(&row)); item.property_expression("item") .chain_property::("dec_usage") .chain_closure::(closure!(|_: Option, dec_usage: f32| { format!("{:.1} %", dec_usage * 100.0) })) .bind(&row, "text", Widget::NONE); this.add_gestures(item); } )); decoder_col_factory.connect_teardown(move |_factory, item| { let item = item.downcast_ref::().unwrap(); item.set_child(None::<>k::Inscription>); }); let decoder_col_sorter = NumericSorter::builder() .sort_order(SortType::Ascending) .expression(gtk::PropertyExpression::new( ApplicationEntry::static_type(), None::<>k::Expression>, "dec_usage", )) .build(); decoder_col.set_sorter(Some(&decoder_col_sorter)); decoder_col.set_visible(SETTINGS.apps_show_decoder()); column_view.append_column(&decoder_col); SETTINGS.connect_apps_show_decoder(clone!( #[weak] decoder_col, move |visible| decoder_col.set_visible(visible) )); decoder_col } fn add_gpu_mem_column(&self, column_view: &ColumnView) -> ColumnViewColumn { let gpu_mem_col_factory = gtk::SignalListItemFactory::new(); let gpu_mem_col = gtk::ColumnViewColumn::new( Some(&i18n("Video Memory")), Some(gpu_mem_col_factory.clone()), ); gpu_mem_col.set_resizable(true); gpu_mem_col_factory.connect_setup(clone!( #[weak(rename_to = this)] self, move |_factory, item| { let item = item.downcast_ref::().unwrap(); let row = gtk::Inscription::new(None); row.set_min_chars(9); row.set_xalign(1.0); item.set_child(Some(&row)); item.property_expression("item") .chain_property::("gpu_mem_usage") .chain_closure::(closure!(|_: Option, gpu_mem: u64| { convert_storage(gpu_mem as f64, false) })) .bind(&row, "text", Widget::NONE); this.add_gestures(item); } )); gpu_mem_col_factory.connect_teardown(move |_factory, item| { let item = item.downcast_ref::().unwrap(); item.set_child(None::<>k::Inscription>); }); let gpu_mem_col_sorter = NumericSorter::builder() .sort_order(SortType::Ascending) .expression(gtk::PropertyExpression::new( ApplicationEntry::static_type(), None::<>k::Expression>, "gpu_mem_usage", )) .build(); gpu_mem_col.set_sorter(Some(&gpu_mem_col_sorter)); gpu_mem_col.set_visible(SETTINGS.apps_show_gpu_memory()); column_view.append_column(&gpu_mem_col); SETTINGS.connect_apps_show_gpu_memory(clone!( #[weak] gpu_mem_col, move |visible| gpu_mem_col.set_visible(visible) )); gpu_mem_col } fn add_swap_column(&self, column_view: &ColumnView) -> ColumnViewColumn { let swap_col_factory = gtk::SignalListItemFactory::new(); let swap_col = gtk::ColumnViewColumn::new(Some(&i18n("Swap")), Some(swap_col_factory.clone())); swap_col.set_resizable(true); swap_col_factory.connect_setup(clone!( #[weak(rename_to = this)] self, move |_factory, item| { let item = item.downcast_ref::().unwrap(); let row = gtk::Inscription::new(None); row.set_min_chars(9); row.set_xalign(1.0); item.set_child(Some(&row)); item.property_expression("item") .chain_property::("swap_usage") .chain_closure::(closure!(|_: Option, swap_usage: u64| { convert_storage(swap_usage as f64, false) })) .bind(&row, "text", Widget::NONE); this.add_gestures(item); } )); swap_col_factory.connect_teardown(move |_factory, item| { let item = item.downcast_ref::().unwrap(); item.set_child(None::<>k::Inscription>); }); let swap_col_sorter = NumericSorter::builder() .sort_order(SortType::Ascending) .expression(gtk::PropertyExpression::new( ApplicationEntry::static_type(), None::<>k::Expression>, "swap_usage", )) .build(); swap_col.set_sorter(Some(&swap_col_sorter)); swap_col.set_visible(SETTINGS.apps_show_swap()); column_view.append_column(&swap_col); SETTINGS.connect_apps_show_swap(clone!( #[weak] swap_col, move |visible| swap_col.set_visible(visible) )); swap_col } fn add_combined_memory_column(&self, column_view: &ColumnView) -> ColumnViewColumn { let combined_memory_col_factory = gtk::SignalListItemFactory::new(); let combined_memory_col = gtk::ColumnViewColumn::new( Some(&i18n("Combined Memory")), Some(combined_memory_col_factory.clone()), ); combined_memory_col.set_resizable(true); combined_memory_col_factory.connect_setup(clone!( #[weak(rename_to = this)] self, move |_factory, item| { let item = item.downcast_ref::().unwrap(); let row = gtk::Inscription::new(None); row.set_min_chars(9); row.set_xalign(1.0); item.set_child(Some(&row)); item.property_expression("item") .chain_property::("combined_memory_usage") .chain_closure::(closure!(|_: Option, swap_usage: u64| { convert_storage(swap_usage as f64, false) })) .bind(&row, "text", Widget::NONE); this.add_gestures(item); } )); combined_memory_col_factory.connect_teardown(move |_factory, item| { let item = item.downcast_ref::().unwrap(); item.set_child(None::<>k::Inscription>); }); let combined_memory_col_sorter = NumericSorter::builder() .sort_order(SortType::Ascending) .expression(gtk::PropertyExpression::new( ApplicationEntry::static_type(), None::<>k::Expression>, "combined_memory_usage", )) .build(); combined_memory_col.set_sorter(Some(&combined_memory_col_sorter)); combined_memory_col.set_visible(SETTINGS.processes_show_combined_memory()); column_view.append_column(&combined_memory_col); SETTINGS.connect_apps_show_combined_memory(clone!( #[weak] combined_memory_col, move |visible| combined_memory_col.set_visible(visible) )); combined_memory_col } } fn get_action_name(action: ProcessAction, name: &str) -> String { match action { ProcessAction::TERM => i18n_f("End {}?", &[name]), ProcessAction::STOP => i18n_f("Halt {}?", &[name]), ProcessAction::KILL => i18n_f("Kill {}?", &[name]), ProcessAction::CONT => i18n_f("Continue {}?", &[name]), } } fn get_action_warning(action: ProcessAction) -> String { match action { ProcessAction::TERM => i18n("Unsaved work might be lost."), ProcessAction::STOP => i18n( "Halting an app can come with serious risks such as losing data and security implications. Use with caution.", ), ProcessAction::KILL => i18n( "Killing an app can come with serious risks such as losing data and security implications. Use with caution.", ), ProcessAction::CONT => String::new(), } } fn get_action_description(action: ProcessAction) -> String { match action { ProcessAction::TERM => i18n("End App"), ProcessAction::STOP => i18n("Halt App"), ProcessAction::KILL => i18n("Kill App"), ProcessAction::CONT => i18n("Continue App"), } } resources-1.9.1/src/ui/pages/battery.rs000066400000000000000000000234171510634446000200710ustar00rootroot00000000000000use adw::{prelude::*, subclass::prelude::*}; use gtk::glib; use log::trace; use crate::config::PROFILE; use crate::i18n::i18n; use crate::utils::battery::BatteryData; use crate::utils::units::{convert_energy, convert_power}; pub const TAB_ID_PREFIX: &str = "battery"; mod imp { use std::cell::{Cell, RefCell}; use crate::ui::{pages::BATTERY_PRIMARY_ORD, widgets::graph_box::ResGraphBox}; use super::*; use gtk::{ CompositeTemplate, gio::{Icon, ThemedIcon}, glib::{ParamSpec, Properties, Value}, }; #[derive(CompositeTemplate, Properties)] #[template(resource = "/net/nokyan/Resources/ui/pages/battery.ui")] #[properties(wrapper_type = super::ResBattery)] pub struct ResBattery { #[template_child] pub charge: TemplateChild, #[template_child] pub power_usage: TemplateChild, #[template_child] pub health: TemplateChild, #[template_child] pub design_capacity: TemplateChild, #[template_child] pub charge_cycles: TemplateChild, #[template_child] pub technology: TemplateChild, #[template_child] pub manufacturer: TemplateChild, #[template_child] pub model_name: TemplateChild, #[template_child] pub device: TemplateChild, #[property(get)] uses_progress_bar: Cell, #[property(get)] main_graph_color: glib::Bytes, #[property(get)] icon: RefCell, #[property(get, set)] usage: Cell, #[property(get = Self::tab_name, set = Self::set_tab_name, type = glib::GString)] tab_name: Cell, #[property(get = Self::tab_detail_string, set = Self::set_tab_detail_string, type = glib::GString)] tab_detail_string: Cell, #[property(get = Self::tab_usage_string, set = Self::set_tab_usage_string, type = glib::GString)] tab_usage_string: Cell, #[property(get = Self::tab_id, set = Self::set_tab_id, type = glib::GString)] tab_id: Cell, #[property(get)] graph_locked_max_y: Cell, #[property(get)] primary_ord: Cell, #[property(get, set)] secondary_ord: Cell, } impl ResBattery { gstring_getter_setter!(tab_name, tab_detail_string, tab_usage_string, tab_id); } impl Default for ResBattery { fn default() -> Self { Self { charge: Default::default(), power_usage: Default::default(), health: Default::default(), design_capacity: Default::default(), charge_cycles: Default::default(), technology: Default::default(), manufacturer: Default::default(), model_name: Default::default(), device: Default::default(), uses_progress_bar: Cell::new(true), main_graph_color: glib::Bytes::from_static(&super::ResBattery::MAIN_GRAPH_COLOR), icon: RefCell::new(ThemedIcon::new("battery-symbolic").into()), usage: Default::default(), tab_name: Cell::new(glib::GString::from(i18n("Battery"))), tab_detail_string: Cell::new(glib::GString::new()), tab_id: Cell::new(glib::GString::new()), tab_usage_string: Cell::new(glib::GString::new()), graph_locked_max_y: Cell::new(true), primary_ord: Cell::new(BATTERY_PRIMARY_ORD), secondary_ord: Default::default(), } } } #[glib::object_subclass] impl ObjectSubclass for ResBattery { const NAME: &'static str = "ResBattery"; type Type = super::ResBattery; type ParentType = adw::Bin; fn class_init(klass: &mut Self::Class) { Self::bind_template(klass); } // You must call `Widget`'s `init_template()` within `instance_init()`. fn instance_init(obj: &glib::subclass::InitializingObject) { obj.init_template(); } } impl ObjectImpl for ResBattery { fn constructed(&self) { self.parent_constructed(); let obj = self.obj(); // Devel Profile if PROFILE == "Devel" { obj.add_css_class("devel"); } } fn properties() -> &'static [ParamSpec] { Self::derived_properties() } fn set_property(&self, id: usize, value: &Value, pspec: &ParamSpec) { self.derived_set_property(id, value, pspec); } fn property(&self, id: usize, pspec: &ParamSpec) -> Value { self.derived_property(id, pspec) } } impl WidgetImpl for ResBattery {} impl BinImpl for ResBattery {} } glib::wrapper! { pub struct ResBattery(ObjectSubclass) @extends gtk::Widget, adw::Bin, @implements gtk::Buildable, gtk::ConstraintTarget, gtk::Accessible; } impl Default for ResBattery { fn default() -> Self { Self::new() } } impl ResBattery { const MAIN_GRAPH_COLOR: [u8; 3] = [0x33, 0xd1, 0x7a]; pub fn new() -> Self { trace!("Creating ResBattery GObject…"); glib::Object::new::() } pub fn init(&self, battery_data: &BatteryData, secondary_ord: u32) { self.set_secondary_ord(secondary_ord); self.setup_widgets(battery_data); } pub fn setup_widgets(&self, battery_data: &BatteryData) { trace!( "Setting up ResBattery ({}) widgets…", battery_data.inner.sysfs_path.to_string_lossy() ); let imp = self.imp(); let battery = &battery_data.inner; let tab_id = format!( "{}-{}-{}-{}", TAB_ID_PREFIX, battery.manufacturer.as_deref().unwrap_or_default(), battery.model_name.as_deref().unwrap_or_default(), battery.sysfs_path.file_name().unwrap().to_string_lossy(), ); imp.set_tab_id(&tab_id); if let Some(design_capacity) = battery.design_capacity { let converted_energy = convert_energy(design_capacity, false); imp.design_capacity.set_subtitle(&converted_energy); } else { imp.design_capacity.set_subtitle(&i18n("N/A")); } imp.set_tab_name(&battery.display_name()); imp.charge.set_title_label(&i18n("Battery Charge")); imp.charge.graph().set_graph_color( Self::MAIN_GRAPH_COLOR[0], Self::MAIN_GRAPH_COLOR[1], Self::MAIN_GRAPH_COLOR[2], ); imp.power_usage.set_title_label(&i18n("Power Usage")); imp.power_usage.graph().set_graph_color(0x26, 0xa2, 0x69); imp.power_usage.graph().set_locked_max_y(None); imp.charge_cycles.set_subtitle( &battery_data .charge_cycles .as_ref() .map_or_else(|_| i18n("N/A"), std::string::ToString::to_string), ); imp.technology.set_subtitle(&battery.technology.to_string()); imp.manufacturer .set_subtitle(&battery.manufacturer.clone().unwrap_or_else(|| i18n("N/A"))); imp.model_name .set_subtitle(&battery.model_name.clone().unwrap_or_else(|| i18n("N/A"))); imp.device .set_subtitle(&battery.sysfs_path.file_name().unwrap().to_string_lossy()); imp.set_tab_detail_string(&battery.sysfs_path.file_name().unwrap().to_string_lossy()); } pub fn refresh_page(&self, battery_data: BatteryData) { trace!( "Refreshing ResBattery ({})…", battery_data.inner.sysfs_path.to_string_lossy() ); let imp = self.imp(); let mut usage_string = String::new(); if let Ok(charge) = battery_data.charge { let mut percentage_string = format!("{} %", (charge * 100.0).round()); usage_string.push_str(&percentage_string); if let Ok(state) = battery_data.state { percentage_string.push_str(&format!(" ({state})")); } imp.charge.graph().set_visible(true); imp.charge.graph().push_data_point(charge); imp.charge.set_subtitle(&percentage_string); } else { imp.charge.graph().set_visible(false); imp.charge.set_subtitle(&i18n("N/A")); } self.set_property("usage", battery_data.charge.unwrap_or_default()); if let Ok(power_usage) = battery_data.power_usage { imp.power_usage.graph().push_data_point(power_usage); let formatted_power = convert_power(power_usage); let formatted_highest_power = convert_power(imp.power_usage.graph().get_highest_value()); imp.power_usage.graph().set_visible(true); imp.power_usage.set_subtitle(&format!( "{formatted_power} · {} {formatted_highest_power}", i18n("Highest:") )); if !usage_string.is_empty() { usage_string.push_str(" · "); } usage_string.push_str(&formatted_power); } else { imp.power_usage.graph().set_visible(false); imp.power_usage.set_subtitle(&i18n("N/A")); if usage_string.is_empty() { usage_string.push_str(&i18n("N/A")); } } self.set_tab_usage_string(usage_string); if let Ok(health) = battery_data.health { imp.health .set_subtitle(&format!("{} %", (health * 100.0).round())); } else { imp.health.set_subtitle(&i18n("N/A")); } } } resources-1.9.1/src/ui/pages/cpu.rs000066400000000000000000000363551510634446000172130ustar00rootroot00000000000000use std::time::Duration; use adw::{prelude::*, subclass::prelude::*}; use gtk::FlowBoxChild; use gtk::glib::{self, DateTime, Priority, clone}; use log::trace; use crate::config::PROFILE; use crate::i18n::{i18n, i18n_f}; use crate::ui::widgets::graph_box::ResGraphBox; use crate::utils::cpu::{CpuData, CpuInfo}; use crate::utils::settings::SETTINGS; use crate::utils::units::{convert_frequency, convert_temperature, format_time_integer}; use crate::utils::{FiniteOr, NUM_CPUS, boot_time}; pub const TAB_ID: &str = "cpu"; mod imp { use std::cell::{Cell, RefCell}; use crate::ui::{pages::CPU_PRIMARY_ORD, widgets::graph_box::ResGraphBox}; use super::*; use gtk::{ CompositeTemplate, gio::{Icon, ThemedIcon}, glib::{ParamSpec, Properties, Value}, }; #[derive(CompositeTemplate, Properties)] #[template(resource = "/net/nokyan/Resources/ui/pages/cpu.ui")] #[properties(wrapper_type = super::ResCPU)] pub struct ResCPU { #[template_child] pub logical_switch: TemplateChild, #[template_child] pub stack: TemplateChild, #[template_child] pub total_page: TemplateChild, #[template_child] pub logical_page: TemplateChild, #[template_child] pub total_cpu: TemplateChild, #[template_child] pub thread_box: TemplateChild, #[template_child] pub max_speed: TemplateChild, #[template_child] pub logical_cpus: TemplateChild, #[template_child] pub physical_cpus: TemplateChild, #[template_child] pub sockets: TemplateChild, #[template_child] pub uptime: TemplateChild, #[template_child] pub virtualization: TemplateChild, #[template_child] pub architecture: TemplateChild, #[template_child] pub temperature: TemplateChild, pub thread_graphs: RefCell>, pub old_total_usage: Cell<(u64, u64)>, pub old_thread_usages: RefCell>, pub logical_cpus_amount: Cell, #[property(get)] uses_progress_bar: Cell, #[property(get)] main_graph_color: glib::Bytes, #[property(get)] icon: RefCell, #[property(get, set)] usage: Cell, #[property(get = Self::tab_name, type = glib::GString)] tab_name: Cell, #[property(get = Self::tab_detail_string, set = Self::set_tab_detail_string, type = glib::GString)] tab_detail_string: Cell, #[property(get = Self::tab_usage_string, set = Self::set_tab_usage_string, type = glib::GString)] tab_usage_string: Cell, #[property(get = Self::tab_id, type = glib::GString)] tab_id: Cell, #[property(get)] graph_locked_max_y: Cell, #[property(get)] primary_ord: Cell, #[property(get)] secondary_ord: Cell, } impl ResCPU { gstring_getter_setter!(tab_name, tab_detail_string, tab_usage_string, tab_id); } impl Default for ResCPU { fn default() -> Self { Self { logical_switch: Default::default(), stack: Default::default(), total_page: Default::default(), logical_page: Default::default(), total_cpu: Default::default(), thread_box: Default::default(), max_speed: Default::default(), logical_cpus: Default::default(), physical_cpus: Default::default(), sockets: Default::default(), uptime: Default::default(), virtualization: Default::default(), architecture: Default::default(), temperature: Default::default(), thread_graphs: Default::default(), uses_progress_bar: Cell::new(true), main_graph_color: glib::Bytes::from_static(&super::ResCPU::MAIN_GRAPH_COLOR), icon: RefCell::new(ThemedIcon::new("processor-symbolic").into()), usage: Default::default(), tab_name: Cell::new(glib::GString::from(i18n("Processor"))), tab_detail_string: Cell::new(glib::GString::new()), tab_usage_string: Cell::new(glib::GString::new()), tab_id: Cell::new(glib::GString::from(TAB_ID)), old_total_usage: Cell::default(), old_thread_usages: RefCell::default(), logical_cpus_amount: Cell::default(), graph_locked_max_y: Cell::new(true), primary_ord: Cell::new(CPU_PRIMARY_ORD), secondary_ord: Default::default(), } } } #[glib::object_subclass] impl ObjectSubclass for ResCPU { const NAME: &'static str = "ResCPU"; type Type = super::ResCPU; type ParentType = adw::Bin; fn class_init(klass: &mut Self::Class) { Self::bind_template(klass); } // You must call `Widget`'s `init_template()` within `instance_init()`. fn instance_init(obj: &glib::subclass::InitializingObject) { obj.init_template(); } } impl ObjectImpl for ResCPU { fn constructed(&self) { self.parent_constructed(); let obj = self.obj(); // Devel Profile if PROFILE == "Devel" { obj.add_css_class("devel"); } } fn properties() -> &'static [ParamSpec] { Self::derived_properties() } fn set_property(&self, id: usize, value: &Value, pspec: &ParamSpec) { self.derived_set_property(id, value, pspec); } fn property(&self, id: usize, pspec: &ParamSpec) -> Value { self.derived_property(id, pspec) } } impl WidgetImpl for ResCPU {} impl BinImpl for ResCPU {} } glib::wrapper! { pub struct ResCPU(ObjectSubclass) @extends gtk::Widget, adw::Bin, @implements gtk::Buildable, gtk::ConstraintTarget, gtk::Accessible; } impl Default for ResCPU { fn default() -> Self { Self::new() } } impl ResCPU { const MAIN_GRAPH_COLOR: [u8; 3] = [0x35, 0x84, 0xe4]; pub fn new() -> Self { trace!("Creating ResCPU GObject…"); glib::Object::new::() } pub fn init(&self, cpu_info: CpuInfo) { self.setup_widgets(cpu_info); self.setup_signals(); } pub fn setup_widgets(&self, cpu_info: CpuInfo) { trace!("Setting up ResCPU widgets…"); let imp = self.imp(); let logical_cpus = cpu_info.logical_cpus.unwrap_or(0); let CpuData { new_thread_usages, temperature: _, frequencies: _, } = CpuData::new(logical_cpus); let old_total_usage = new_thread_usages .iter() .flatten() .copied() .reduce(|acc, x| (acc.0 + x.0, acc.1 + x.1)) .unwrap_or_default(); imp.old_total_usage.set(old_total_usage); for i in 0..logical_cpus { let old_thread_usage = new_thread_usages .get(i) .map_or((0, 0), |i| *i.as_ref().unwrap_or(&(0, 0))); imp.old_thread_usages.borrow_mut().push(old_thread_usage); } imp.logical_cpus_amount.set(logical_cpus); imp.total_cpu.set_title_label(&i18n("Total Usage")); imp.total_cpu.set_subtitle(&i18n("N/A")); imp.total_cpu.graph().set_graph_color( Self::MAIN_GRAPH_COLOR[0], Self::MAIN_GRAPH_COLOR[1], Self::MAIN_GRAPH_COLOR[2], ); // if our CPU happens to only have one thread, showing a single thread box with the exact // same fraction as the progress bar for total CPU usage would be silly, so only do // thread boxes if we have more than one thread imp.logical_switch.set_sensitive(logical_cpus > 0); for i in 0..logical_cpus { let thread_box = ResGraphBox::new(); thread_box.set_subtitle(&i18n_f("CPU {}", &[&(i + 1).to_string()])); thread_box.set_title_label(&i18n("N/A")); thread_box.graph().set_css_classes(&["small-graph"]); thread_box.graph().set_height_request(72); thread_box.graph().set_graph_color(28, 113, 216); let flow_box_chld = FlowBoxChild::builder() .child(&thread_box) .css_classes(vec!["tile", "card"]) .can_target(false) .build(); imp.thread_box.append(&flow_box_chld); imp.thread_graphs.borrow_mut().push(thread_box); } imp.temperature.set_title_label(&i18n("Temperature")); imp.temperature.graph().set_graph_color(0x1a, 0x5f, 0xb4); imp.temperature.graph().set_locked_max_y(None); imp.max_speed.set_subtitle( &cpu_info .max_speed .map_or_else(|| i18n("N/A"), convert_frequency), ); imp.logical_cpus.set_subtitle( &cpu_info .logical_cpus .map_or_else(|| i18n("N/A"), |x| x.to_string()), ); imp.physical_cpus.set_subtitle( &cpu_info .physical_cpus .map_or_else(|| i18n("N/A"), |x| x.to_string()), ); imp.sockets.set_subtitle( &cpu_info .sockets .map_or_else(|| i18n("N/A"), |x| x.to_string()), ); imp.virtualization .set_subtitle(&cpu_info.virtualization.unwrap_or_else(|| i18n("N/A"))); imp.architecture .set_subtitle(&cpu_info.architecture.unwrap_or_else(|| i18n("N/A"))); if let Some(model_name) = cpu_info.model_name { imp.set_tab_detail_string(&model_name); } } pub fn setup_signals(&self) { trace!("Setting up ResCPU signals…"); let imp = self.imp(); imp.logical_switch.connect_active_notify(clone!( #[weak] imp, move |switch| { if switch.is_active() { imp.stack.set_visible_child(&imp.logical_page.get()); } else { imp.stack.set_visible_child(&imp.total_page.get()); } let _ = SETTINGS.set_show_logical_cpus(switch.is_active()); } )); glib::timeout_add_local_full( Duration::from_secs(1), Priority::DEFAULT, clone!( #[strong(rename_to = this)] self, move || { let imp = this.imp(); if let (Ok(boot_time), Ok(now)) = (boot_time(), DateTime::now_local()) { let time_difference = now.difference(&boot_time).as_seconds() as isize; imp.uptime .set_subtitle(&format_time_integer(time_difference)); } else { imp.uptime.set_subtitle(&i18n("N/A")); } glib::ControlFlow::Continue } ), ); imp.logical_switch.set_active(SETTINGS.show_logical_cpus()); } pub fn refresh_page(&self, cpu_data: &CpuData) { trace!("Refreshing ResCPU…"); let CpuData { new_thread_usages, temperature, frequencies, } = cpu_data; let imp = self.imp(); let new_total_usage = new_thread_usages .iter() .flatten() .copied() .reduce(|acc, x| (acc.0 + x.0, acc.1 + x.1)) .unwrap_or_default(); let idle_total_delta = new_total_usage .0 .saturating_sub(imp.old_total_usage.get().0); let sum_total_delta = new_total_usage .1 .saturating_sub(imp.old_total_usage.get().1); let work_total_time = sum_total_delta.saturating_sub(idle_total_delta); let total_fraction = ((work_total_time as f64) / (sum_total_delta as f64)).finite_or_default(); imp.total_cpu.graph().push_data_point(total_fraction); let mut percentage = total_fraction * 100.0; if !SETTINGS.normalize_cpu_usage() { percentage *= *NUM_CPUS as f64; } let mut percentage_string = format!("{} %", percentage.round()); imp.total_cpu.set_subtitle(&percentage_string); imp.old_total_usage.set(new_total_usage); if imp.logical_cpus_amount.get() > 1 { for (i, old_thread_usage) in imp .old_thread_usages .borrow_mut() .iter_mut() .enumerate() .take(imp.logical_cpus_amount.get()) { let new_thread_usage = new_thread_usages .get(i) .map_or((0, 0), |i| *i.as_ref().unwrap_or(&(0, 0))); let idle_thread_delta = new_thread_usage.0.saturating_sub(old_thread_usage.0); let sum_thread_delta = new_thread_usage.1.saturating_sub(old_thread_usage.1); let work_thread_time = sum_thread_delta.saturating_sub(idle_thread_delta); let curr_threadbox = &imp.thread_graphs.borrow()[i]; let thread_fraction = ((work_thread_time as f64) / (sum_thread_delta as f64)).finite_or_default(); curr_threadbox.graph().push_data_point(thread_fraction); curr_threadbox.set_subtitle(&format!("{} %", (thread_fraction * 100.0).round())); if let Some(frequency) = frequencies[i] { curr_threadbox.set_title_label(&format!( "{} · {}", &i18n_f("CPU {}", &[&(i + 1).to_string()]), &convert_frequency(frequency as f64) )); } else { curr_threadbox.set_title_label(&i18n_f("CPU {}", &[&(i + 1).to_string()])); } *old_thread_usage = new_thread_usage; } } imp.temperature.graph().set_visible(temperature.is_ok()); if let Ok(temperature) = temperature { let temperature_string = convert_temperature(f64::from(*temperature)); let highest_temperature_string = convert_temperature(imp.temperature.graph().get_highest_value()); imp.temperature.set_subtitle(&format!( "{} · {} {}", &temperature_string, i18n("Highest:"), highest_temperature_string )); imp.temperature .graph() .push_data_point(f64::from(*temperature)); percentage_string.push_str(" · "); percentage_string.push_str(&temperature_string); } else { imp.temperature.set_subtitle(&i18n("N/A")); } self.set_property("usage", total_fraction); self.set_property("tab_usage_string", percentage_string); } } resources-1.9.1/src/ui/pages/drive.rs000066400000000000000000000350001510634446000175170ustar00rootroot00000000000000use std::time::{Duration, SystemTime}; use adw::{glib::property::PropertySet, prelude::*, subclass::prelude::*}; use gtk::glib; use log::trace; use crate::config::PROFILE; use crate::i18n::{i18n, i18n_f}; use crate::utils::drive::{Drive, DriveData}; use crate::utils::units::{convert_speed, convert_storage}; pub const TAB_ID_PREFIX: &str = "drive"; mod imp { use std::{ cell::{Cell, RefCell}, collections::HashMap, }; use crate::ui::{pages::DRIVE_PRIMARY_ORD, widgets::graph_box::ResGraphBox}; use super::*; use gtk::{ CompositeTemplate, gio::Icon, glib::{ParamSpec, Properties, Value}, }; #[derive(CompositeTemplate, Properties)] #[template(resource = "/net/nokyan/Resources/ui/pages/drive.ui")] #[properties(wrapper_type = super::ResDrive)] pub struct ResDrive { #[template_child] pub total_usage: TemplateChild, #[template_child] pub read_speed: TemplateChild, #[template_child] pub write_speed: TemplateChild, #[template_child] pub total_read: TemplateChild, #[template_child] pub total_written: TemplateChild, #[template_child] pub drive_type: TemplateChild, #[template_child] pub device: TemplateChild, #[template_child] pub capacity: TemplateChild, #[template_child] pub writable: TemplateChild, #[template_child] pub removable: TemplateChild, #[template_child] pub link: TemplateChild, pub old_stats: RefCell>, pub last_timestamp: Cell, #[property(get)] uses_progress_bar: Cell, #[property(get)] main_graph_color: glib::Bytes, #[property(get = Self::icon, set = Self::set_icon, type = Icon)] icon: RefCell, #[property(get, set)] usage: Cell, #[property(get = Self::tab_name, set = Self::set_tab_name, type = glib::GString)] tab_name: Cell, #[property(get = Self::tab_detail_string, set = Self::set_tab_detail_string, type = glib::GString)] tab_detail_string: Cell, #[property(get = Self::tab_usage_string, set = Self::set_tab_usage_string, type = glib::GString)] tab_usage_string: Cell, #[property(get = Self::tab_id, set = Self::set_tab_id, type = glib::GString)] tab_id: Cell, #[property(get)] graph_locked_max_y: Cell, #[property(get)] primary_ord: Cell, #[property(get, set)] secondary_ord: Cell, } impl ResDrive { gstring_getter_setter!(tab_name, tab_detail_string, tab_usage_string, tab_id); pub fn icon(&self) -> Icon { let icon = self.icon.replace_with(|_| Drive::default_icon()); let result = icon.clone(); self.icon.set(icon); result } pub fn set_icon(&self, icon: &Icon) { self.icon.set(icon.clone()); } } impl Default for ResDrive { fn default() -> Self { Self { total_usage: Default::default(), read_speed: Default::default(), write_speed: Default::default(), drive_type: Default::default(), total_read: Default::default(), total_written: Default::default(), device: Default::default(), capacity: Default::default(), writable: Default::default(), removable: Default::default(), link: Default::default(), uses_progress_bar: Cell::new(true), main_graph_color: glib::Bytes::from_static(&super::ResDrive::MAIN_GRAPH_COLOR), icon: RefCell::new(Drive::default_icon()), usage: Default::default(), tab_name: Cell::new(glib::GString::from(i18n("Drive"))), tab_detail_string: Cell::new(glib::GString::new()), tab_id: Cell::new(glib::GString::new()), old_stats: Default::default(), last_timestamp: Cell::new( SystemTime::now() .checked_sub(Duration::from_secs(1)) .unwrap(), ), tab_usage_string: Cell::new(glib::GString::new()), graph_locked_max_y: Cell::new(true), primary_ord: Cell::new(DRIVE_PRIMARY_ORD), secondary_ord: Default::default(), } } } #[glib::object_subclass] impl ObjectSubclass for ResDrive { const NAME: &'static str = "ResDrive"; type Type = super::ResDrive; type ParentType = adw::Bin; fn class_init(klass: &mut Self::Class) { Self::bind_template(klass); } // You must call `Widget`'s `init_template()` within `instance_init()`. fn instance_init(obj: &glib::subclass::InitializingObject) { obj.init_template(); } } impl ObjectImpl for ResDrive { fn constructed(&self) { self.parent_constructed(); let obj = self.obj(); // Devel Profile if PROFILE == "Devel" { obj.add_css_class("devel"); } } fn properties() -> &'static [ParamSpec] { Self::derived_properties() } fn set_property(&self, id: usize, value: &Value, pspec: &ParamSpec) { self.derived_set_property(id, value, pspec); } fn property(&self, id: usize, pspec: &ParamSpec) -> Value { self.derived_property(id, pspec) } } impl WidgetImpl for ResDrive {} impl BinImpl for ResDrive {} } glib::wrapper! { pub struct ResDrive(ObjectSubclass) @extends gtk::Widget, adw::Bin, @implements gtk::Buildable, gtk::ConstraintTarget, gtk::Accessible; } impl Default for ResDrive { fn default() -> Self { Self::new() } } impl ResDrive { const MAIN_GRAPH_COLOR: [u8; 3] = [0xff, 0x78, 0x00]; const SECTOR_SIZE: usize = 512; pub fn new() -> Self { trace!("Creating ResDrive GObject…"); glib::Object::new::() } pub fn init(&self, drive_data: &DriveData, secondary_ord: u32) { self.set_secondary_ord(secondary_ord); self.setup_widgets(drive_data); } pub fn setup_widgets(&self, drive_data: &DriveData) { trace!( "Setting up ResDrive ({}) widgets…", drive_data.inner.sysfs_path.to_string_lossy() ); let imp = self.imp(); let drive = &drive_data.inner; let tab_id = format!( "{}-{}", TAB_ID_PREFIX, drive .model .as_deref() .unwrap_or(drive.sysfs_path.to_str().unwrap()) ); imp.set_tab_id(&tab_id); imp.set_icon(&drive.icon()); imp.set_tab_name(&drive.display_name()); imp.total_usage.set_title_label(&i18n("Drive Activity")); imp.total_usage.graph().set_graph_color( Self::MAIN_GRAPH_COLOR[0], Self::MAIN_GRAPH_COLOR[1], Self::MAIN_GRAPH_COLOR[2], ); imp.read_speed.set_title_label(&i18n("Read Speed")); imp.read_speed.graph().set_graph_color(0xe6, 0x61, 0x00); imp.read_speed.graph().set_locked_max_y(None); imp.write_speed.set_title_label(&i18n("Write Speed")); imp.write_speed.graph().set_graph_color(0xc6, 0x46, 0x00); imp.write_speed.graph().set_locked_max_y(None); imp.drive_type.set_subtitle(&drive.drive_type.to_string()); imp.device.set_subtitle(&drive.block_device); imp.last_timestamp.set( SystemTime::now() .checked_sub(Duration::from_secs(1)) .unwrap(), ); if let Some(model_name) = &drive_data.inner.model { imp.set_tab_detail_string(&format!( "{model_name} ({})", &drive_data.inner.block_device )); } else { imp.set_tab_detail_string(&drive_data.inner.block_device); } imp.old_stats .borrow_mut() .clone_from(&drive_data.disk_stats); } pub fn refresh_page(&self, drive_data: DriveData) { trace!( "Refreshing ResDrive ({})…", drive_data.inner.sysfs_path.to_string_lossy() ); let imp = self.imp(); let DriveData { inner: _, is_virtual: _, writable, removable, disk_stats, capacity, link, } = drive_data; let time_passed = SystemTime::now() .duration_since(imp.last_timestamp.get()) .map_or(1.0f64, |timestamp| timestamp.as_secs_f64()); if let (Some(read_ticks), Some(write_ticks), Some(old_read_ticks), Some(old_write_ticks)) = ( disk_stats.get("read_ticks"), disk_stats.get("write_ticks"), imp.old_stats.borrow().get("read_ticks"), imp.old_stats.borrow().get("write_ticks"), ) { let delta_read_ticks = read_ticks.saturating_sub(*old_read_ticks); let delta_write_ticks = write_ticks.saturating_sub(*old_write_ticks); let read_ratio = delta_read_ticks as f64 / (time_passed * 1000.0); let write_ratio = delta_write_ticks as f64 / (time_passed * 1000.0); let total_usage = f64::max(read_ratio, write_ratio).clamp(0.0, 1.0); let percentage_string = format!("{} %", (total_usage * 100.0).round()); imp.total_usage.graph().set_visible(true); imp.total_usage.graph().push_data_point(total_usage); imp.total_usage.set_subtitle(&percentage_string); self.set_property("usage", total_usage); } else { imp.total_usage.graph().set_visible(false); imp.total_usage.set_subtitle(&i18n("N/A")); self.set_property("usage", 0.0); } let read_string = if let (Some(read_sectors), Some(old_read_sectors)) = ( disk_stats.get("read_sectors"), imp.old_stats.borrow().get("read_sectors"), ) { let delta_read_sectors = read_sectors.saturating_sub(*old_read_sectors); let read_speed = (delta_read_sectors.saturating_mul(Self::SECTOR_SIZE)) as f64 / time_passed; imp.read_speed.graph().set_visible(true); imp.read_speed.graph().push_data_point(read_speed); let highest_read_speed = imp.read_speed.graph().get_highest_value(); let formatted_read_speed = convert_speed(read_speed, false); let formatted_highest_read_speed = convert_speed(highest_read_speed, false); imp.read_speed.set_subtitle(&format!( "{formatted_read_speed} · {} {formatted_highest_read_speed}", i18n("Highest:") )); formatted_read_speed } else { imp.read_speed.graph().set_visible(false); imp.read_speed.set_subtitle(&i18n("N/A")); i18n("N/A") }; let write_string = if let (Some(write_sectors), Some(old_write_sectors)) = ( disk_stats.get("write_sectors"), imp.old_stats.borrow().get("write_sectors"), ) { let delta_write_sectors = write_sectors.saturating_sub(*old_write_sectors); let write_speed = (delta_write_sectors.saturating_mul(Self::SECTOR_SIZE)) as f64 / time_passed; imp.read_speed.graph().set_visible(true); imp.write_speed.graph().push_data_point(write_speed); let highest_write_speed = imp.write_speed.graph().get_highest_value(); let formatted_write_speed = convert_speed(write_speed, false); let formatted_highest_write_speed = convert_speed(highest_write_speed, false); imp.write_speed.set_subtitle(&format!( "{formatted_write_speed} · {} {formatted_highest_write_speed}", i18n("Highest:") )); formatted_write_speed } else { imp.write_speed.graph().set_visible(false); imp.write_speed.set_subtitle(&i18n("N/A")); i18n("N/A") }; if let (Some(read_sectors), Some(write_sectors)) = ( disk_stats.get("read_sectors"), disk_stats.get("write_sectors"), ) { imp.total_read.set_subtitle(&convert_storage( (read_sectors.saturating_mul(Self::SECTOR_SIZE)) as f64, false, )); imp.total_written.set_subtitle(&convert_storage( (write_sectors.saturating_mul(Self::SECTOR_SIZE)) as f64, false, )); } else { imp.total_read.set_subtitle(&i18n("N/A")); imp.total_written.set_subtitle(&i18n("N/A")); } if let Ok(capacity) = capacity { imp.capacity .set_subtitle(&convert_storage(capacity as f64, false)); } else { imp.capacity.set_subtitle(&i18n("N/A")); } if let Ok(writable) = writable { if writable { imp.writable.set_subtitle(&i18n("Yes")); } else { imp.writable.set_subtitle(&i18n("No")); } } else { imp.writable.set_subtitle(&i18n("N/A")); } if let Ok(removable) = removable { if removable { imp.removable.set_subtitle(&i18n("Yes")); } else { imp.removable.set_subtitle(&i18n("No")); } } else { imp.removable.set_subtitle(&i18n("N/A")); } if let Ok(link) = link { imp.link.set_subtitle(&link.to_string()); } else { imp.link.set_subtitle(&i18n("N/A")); } self.set_property( "tab_usage_string", // Translators: This is an abbreviation for "Read" and "Write". This is displayed in the sidebar so your // translation should preferably be quite short or an abbreviation i18n_f("R: {} · W: {}", &[&read_string, &write_string]), ); *imp.old_stats.borrow_mut() = disk_stats; imp.last_timestamp.set(SystemTime::now()); } } resources-1.9.1/src/ui/pages/gpu.rs000066400000000000000000000362611510634446000172130ustar00rootroot00000000000000use adw::{prelude::*, subclass::prelude::*}; use gtk::glib::{self}; use log::trace; use process_data::gpu_usage::GpuIdentifier; use crate::config::PROFILE; use crate::i18n::{i18n, i18n_f}; use crate::utils::FiniteOr; use crate::utils::gpu::{Gpu, GpuData}; use crate::utils::units::{convert_frequency, convert_power, convert_storage, convert_temperature}; pub const TAB_ID_PREFIX: &str = "gpu"; mod imp { use std::cell::{Cell, RefCell}; use crate::ui::{ pages::GPU_PRIMARY_ORD, widgets::{double_graph_box::ResDoubleGraphBox, graph_box::ResGraphBox}, }; use super::*; use gtk::{ CompositeTemplate, gio::{Icon, ThemedIcon}, glib::{ParamSpec, Properties, Value}, }; #[derive(CompositeTemplate, Properties)] #[template(resource = "/net/nokyan/Resources/ui/pages/gpu.ui")] #[properties(wrapper_type = super::ResGPU)] pub struct ResGPU { #[template_child] pub gpu_usage: TemplateChild, #[template_child] pub encode_decode_usage: TemplateChild, #[template_child] pub encode_decode_combined_usage: TemplateChild, #[template_child] pub vram_usage: TemplateChild, #[template_child] pub temperature: TemplateChild, #[template_child] pub power_usage: TemplateChild, #[template_child] pub gpu_clockspeed: TemplateChild, #[template_child] pub vram_clockspeed: TemplateChild, #[template_child] pub manufacturer: TemplateChild, #[template_child] pub pci_slot: TemplateChild, #[template_child] pub driver_used: TemplateChild, #[template_child] pub max_power_cap: TemplateChild, #[template_child] pub link: TemplateChild, #[property(get)] uses_progress_bar: Cell, #[property(get)] main_graph_color: glib::Bytes, #[property(get)] icon: RefCell, #[property(get, set)] usage: Cell, #[property(get = Self::tab_name, set = Self::set_tab_name, type = glib::GString)] tab_name: Cell, #[property(get = Self::tab_detail_string, set = Self::set_tab_detail_string, type = glib::GString)] tab_detail_string: Cell, #[property(get = Self::tab_usage_string, set = Self::set_tab_usage_string, type = glib::GString)] tab_usage_string: Cell, #[property(get = Self::tab_id, set = Self::set_tab_id, type = glib::GString)] tab_id: Cell, #[property(get)] graph_locked_max_y: Cell, #[property(get)] primary_ord: Cell, #[property(get, set)] secondary_ord: Cell, } impl ResGPU { gstring_getter_setter!(tab_name, tab_detail_string, tab_usage_string, tab_id); } impl Default for ResGPU { fn default() -> Self { Self { gpu_usage: Default::default(), encode_decode_usage: Default::default(), encode_decode_combined_usage: Default::default(), vram_usage: Default::default(), temperature: Default::default(), power_usage: Default::default(), gpu_clockspeed: Default::default(), vram_clockspeed: Default::default(), manufacturer: Default::default(), pci_slot: Default::default(), driver_used: Default::default(), max_power_cap: Default::default(), link: Default::default(), uses_progress_bar: Cell::new(true), main_graph_color: glib::Bytes::from_static(&super::ResGPU::MAIN_GRAPH_COLOR), icon: RefCell::new(ThemedIcon::new("gpu-symbolic").into()), usage: Default::default(), tab_name: Cell::new(glib::GString::from(i18n("GPU"))), tab_detail_string: Cell::new(glib::GString::new()), tab_usage_string: Cell::new(glib::GString::new()), tab_id: Cell::new(glib::GString::new()), graph_locked_max_y: Cell::new(true), primary_ord: Cell::new(GPU_PRIMARY_ORD), secondary_ord: Default::default(), } } } #[glib::object_subclass] impl ObjectSubclass for ResGPU { const NAME: &'static str = "ResGPU"; type Type = super::ResGPU; type ParentType = adw::Bin; fn class_init(klass: &mut Self::Class) { Self::bind_template(klass); } // You must call `Widget`'s `init_template()` within `instance_init()`. fn instance_init(obj: &glib::subclass::InitializingObject) { obj.init_template(); } } impl ObjectImpl for ResGPU { fn constructed(&self) { self.parent_constructed(); let obj = self.obj(); // Devel Profile if PROFILE == "Devel" { obj.add_css_class("devel"); } } fn properties() -> &'static [ParamSpec] { Self::derived_properties() } fn set_property(&self, id: usize, value: &Value, pspec: &ParamSpec) { self.derived_set_property(id, value, pspec); } fn property(&self, id: usize, pspec: &ParamSpec) -> Value { self.derived_property(id, pspec) } } impl WidgetImpl for ResGPU {} impl BinImpl for ResGPU {} } glib::wrapper! { pub struct ResGPU(ObjectSubclass) @extends gtk::Widget, adw::Bin, @implements gtk::Buildable, gtk::ConstraintTarget, gtk::Accessible; } impl Default for ResGPU { fn default() -> Self { Self::new() } } impl ResGPU { const MAIN_GRAPH_COLOR: [u8; 3] = [0xed, 0x33, 0x3b]; pub fn new() -> Self { trace!("Creating ResGPU GObject…"); glib::Object::new::() } pub fn init(&self, gpu: &Gpu, secondary_ord: u32) { self.set_secondary_ord(secondary_ord); self.setup_widgets(gpu); } pub fn setup_widgets(&self, gpu: &Gpu) { trace!( "Setting up ResGPU ({}, {}) widgets…", self.tab_detail_string(), gpu.gpu_identifier() ); let imp = self.imp(); let tab_id = format!("{}-{}", TAB_ID_PREFIX, &gpu.gpu_identifier()); imp.set_tab_id(&tab_id); imp.gpu_usage.set_title_label(&i18n("Total Usage")); imp.gpu_usage.graph().set_graph_color( Self::MAIN_GRAPH_COLOR[0], Self::MAIN_GRAPH_COLOR[1], Self::MAIN_GRAPH_COLOR[2], ); imp.encode_decode_combined_usage .set_title_label(&i18n("Video Encoder/Decoder Usage")); imp.encode_decode_combined_usage .graph() .set_graph_color(0xe0, 0x1b, 0x24); imp.encode_decode_usage .set_start_title_label(&i18n("Video Encoder Usage")); imp.encode_decode_usage .start_graph() .set_graph_color(0xe0, 0x1b, 0x24); imp.encode_decode_usage .set_end_title_label(&i18n("Video Decoder Usage")); imp.encode_decode_usage .end_graph() .set_graph_color(0xe0, 0x1b, 0x24); imp.vram_usage.set_title_label(&i18n("Video Memory Usage")); imp.vram_usage.graph().set_graph_color(0xc0, 0x1c, 0x28); imp.temperature.set_title_label(&i18n("Temperature")); imp.temperature.graph().set_graph_color(0xa5, 0x1d, 0x2d); imp.temperature.graph().set_locked_max_y(None); imp.manufacturer.set_subtitle( &gpu.get_vendor() .map_or_else(|_| i18n("N/A"), |vendor| vendor.name().to_string()), ); match gpu.gpu_identifier() { GpuIdentifier::PciSlot(pci_slot) => { imp.pci_slot.set_subtitle(&pci_slot.to_string()); } GpuIdentifier::Enumerator(_) => imp.pci_slot.set_subtitle(&i18n("N/A")), } imp.driver_used.set_subtitle(gpu.driver()); if gpu.combined_media_engine().unwrap_or_default() { imp.encode_decode_combined_usage.set_visible(true); imp.encode_decode_usage.set_visible(false); } else { imp.encode_decode_combined_usage.set_visible(false); imp.encode_decode_usage.set_visible(true); } if let Ok(model_name) = gpu.name() { imp.set_tab_detail_string(&model_name); } } pub fn refresh_page(&self, gpu_data: &GpuData) { trace!( "Refreshing ResGPU ({}, {})…", self.tab_detail_string(), gpu_data.gpu_identifier ); let imp = self.imp(); let GpuData { gpu_identifier: _, usage_fraction, encode_fraction, decode_fraction, total_vram, used_vram, clock_speed, vram_speed, temperature, power_usage, power_cap, power_cap_max, link, nvidia: _, } = gpu_data; let mut usage_percentage_string = usage_fraction.map_or_else( || i18n("N/A"), |fraction| format!("{} %", (fraction * 100.0).round()), ); imp.gpu_usage.set_subtitle(&usage_percentage_string); imp.gpu_usage .graph() .push_data_point(usage_fraction.unwrap_or(0.0)); imp.gpu_usage.graph().set_visible(usage_fraction.is_some()); // encode_fraction could be the combined usage of encoder and decoder for Intel GPUs and newer AMD GPUs if let Some(encode_fraction) = encode_fraction { imp.encode_decode_usage .start_graph() .push_data_point(*encode_fraction); imp.encode_decode_usage .set_start_subtitle(&format!("{} %", (encode_fraction * 100.0).round())); imp.encode_decode_combined_usage .graph() .push_data_point(*encode_fraction); imp.encode_decode_combined_usage .set_subtitle(&format!("{} %", (encode_fraction * 100.0).round())); } else { imp.encode_decode_usage.start_graph().push_data_point(0.0); imp.encode_decode_usage.set_start_subtitle(&i18n("N/A")); imp.encode_decode_combined_usage.graph().set_visible(false); imp.encode_decode_combined_usage.set_subtitle(&i18n("N/A")); } if let Some(decode_fraction) = decode_fraction { imp.encode_decode_usage .end_graph() .push_data_point(*decode_fraction); imp.encode_decode_usage .set_end_subtitle(&format!("{} %", (decode_fraction * 100.0).round())); } else { imp.encode_decode_usage.end_graph().push_data_point(0.0); imp.encode_decode_usage.set_end_subtitle(&i18n("N/A")); } // only turn enc and dec graphs invisible if both of them are None, otherwise only one of them might show a // graph and that'd look odd imp.encode_decode_usage .start_graph() .set_visible(encode_fraction.is_some() || decode_fraction.is_some()); imp.encode_decode_usage .end_graph() .set_visible(encode_fraction.is_some() || decode_fraction.is_some()); let vram_usage_string = if let (Some(total_vram), Some(used_vram)) = (total_vram, used_vram) { let used_vram_fraction = (*used_vram as f64 / *total_vram as f64).finite_or_default(); let vram_percentage_string = format!("{} %", (used_vram_fraction * 100.0).round()); let vram_subtitle = format!( "{} / {} · {}", convert_storage(*used_vram as f64, false), convert_storage(*total_vram as f64, false), vram_percentage_string ); imp.vram_usage.set_subtitle(&vram_subtitle); imp.vram_usage.graph().push_data_point(used_vram_fraction); imp.vram_usage.graph().set_visible(true); imp.vram_usage.graph().set_locked_max_y(Some(1.0)); Some(vram_percentage_string) } else if let Some(used_vram) = used_vram { let vram_subtitle = convert_storage(*used_vram as f64, false); imp.vram_usage.set_subtitle(&vram_subtitle); imp.vram_usage.graph().push_data_point(*used_vram as f64); imp.vram_usage.graph().set_visible(true); imp.vram_usage.graph().set_locked_max_y(None); Some(vram_subtitle) } else { imp.vram_usage.set_subtitle(&i18n("N/A")); imp.vram_usage.graph().set_visible(false); None }; let mut power_string = power_usage.map_or_else(|| i18n("N/A"), convert_power); if let Some(power_cap) = power_cap { power_string.push_str(&format!(" / {}", convert_power(*power_cap))); } imp.power_usage.set_subtitle(&power_string); if let Some(gpu_clockspeed) = clock_speed { imp.gpu_clockspeed .set_subtitle(&convert_frequency(*gpu_clockspeed)); } else { imp.gpu_clockspeed.set_subtitle(&i18n("N/A")); } if let Some(vram_clockspeed) = vram_speed { imp.vram_clockspeed .set_subtitle(&convert_frequency(*vram_clockspeed)); } else { imp.vram_clockspeed.set_subtitle(&i18n("N/A")); } imp.max_power_cap .set_subtitle(&power_cap_max.map_or_else(|| i18n("N/A"), convert_power)); self.set_property("usage", usage_fraction.unwrap_or(0.0)); if let Some(vram_usage_string) = vram_usage_string { usage_percentage_string.push_str(" · "); // Translators: This will be displayed in the sidebar, please try to keep your translation as short as (or even // shorter than) 'Memory' usage_percentage_string.push_str(&i18n_f("Memory: {}", &[&vram_usage_string])); } imp.temperature.graph().set_visible(temperature.is_some()); if let Some(temperature) = temperature { let temperature_string = convert_temperature(*temperature); let highest_temperature_string = convert_temperature(imp.temperature.graph().get_highest_value()); imp.temperature.set_subtitle(&format!( "{} · {} {}", &temperature_string, i18n("Highest:"), highest_temperature_string )); imp.temperature.graph().push_data_point(*temperature); usage_percentage_string.push_str(" · "); usage_percentage_string.push_str(&temperature_string); } else { imp.temperature.set_subtitle(&i18n("N/A")); } if let Some(link) = link { imp.link.set_subtitle(&link.to_string()); } else { imp.link.set_subtitle(&i18n("N/A")); } self.set_property("tab_usage_string", &usage_percentage_string); } } resources-1.9.1/src/ui/pages/memory.rs000066400000000000000000000273721510634446000177330ustar00rootroot00000000000000use adw::{prelude::*, subclass::prelude::*}; use gtk::glib::{self, clone}; use log::trace; use crate::config::PROFILE; use crate::i18n::{i18n, i18n_f}; use crate::utils::FiniteOr; use crate::utils::memory::{MemoryData, MemoryDevice}; use crate::utils::units::convert_storage; pub const TAB_ID: &str = "memory"; mod imp { use std::cell::{Cell, RefCell}; use crate::ui::{pages::MEMORY_PRIMARY_ORD, widgets::graph_box::ResGraphBox}; use super::*; use gtk::{ CompositeTemplate, gio::{Icon, ThemedIcon}, glib::{ParamSpec, Properties, Value}, }; #[derive(CompositeTemplate, Properties)] #[template(resource = "/net/nokyan/Resources/ui/pages/memory.ui")] #[properties(wrapper_type = super::ResMemory)] pub struct ResMemory { #[template_child] pub memory: TemplateChild, #[template_child] pub swap: TemplateChild, #[template_child] pub authentication_banner: TemplateChild, #[template_child] pub properties: TemplateChild, #[template_child] pub slots_used: TemplateChild, #[template_child] pub speed: TemplateChild, #[template_child] pub form_factor: TemplateChild, #[template_child] pub memory_type: TemplateChild, #[template_child] pub type_detail: TemplateChild, pub memory_devices: RefCell>, #[property(get)] uses_progress_bar: Cell, #[property(get)] main_graph_color: glib::Bytes, #[property(get)] icon: RefCell, #[property(get, set)] usage: Cell, #[property(get = Self::tab_name, type = glib::GString)] tab_name: Cell, #[property(get = Self::tab_detail_string, set = Self::set_tab_detail_string, type = glib::GString)] tab_detail_string: Cell, #[property(get = Self::tab_usage_string, set = Self::set_tab_usage_string, type = glib::GString)] tab_usage_string: Cell, #[property(get = Self::tab_id, type = glib::GString)] tab_id: Cell, #[property(get)] graph_locked_max_y: Cell, #[property(get)] primary_ord: Cell, #[property(get)] secondary_ord: Cell, } impl ResMemory { gstring_getter_setter!(tab_name, tab_detail_string, tab_usage_string, tab_id); } impl Default for ResMemory { fn default() -> Self { Self { memory: Default::default(), swap: Default::default(), authentication_banner: Default::default(), properties: Default::default(), slots_used: Default::default(), speed: Default::default(), form_factor: Default::default(), memory_type: Default::default(), type_detail: Default::default(), memory_devices: Default::default(), uses_progress_bar: Cell::new(true), main_graph_color: glib::Bytes::from_static(&super::ResMemory::MAIN_GRAPH_COLOR), icon: RefCell::new(ThemedIcon::new("memory-symbolic").into()), usage: Default::default(), tab_name: Cell::new(glib::GString::from(i18n("Memory"))), tab_detail_string: Cell::new(glib::GString::new()), tab_usage_string: Cell::new(glib::GString::new()), tab_id: Cell::new(glib::GString::from(TAB_ID)), graph_locked_max_y: Cell::new(true), primary_ord: Cell::new(MEMORY_PRIMARY_ORD), secondary_ord: Default::default(), } } } #[glib::object_subclass] impl ObjectSubclass for ResMemory { const NAME: &'static str = "ResMemory"; type Type = super::ResMemory; type ParentType = adw::Bin; fn class_init(klass: &mut Self::Class) { Self::bind_template(klass); } // You must call `Widget`'s `init_template()` within `instance_init()`. fn instance_init(obj: &glib::subclass::InitializingObject) { obj.init_template(); } } impl ObjectImpl for ResMemory { fn constructed(&self) { self.parent_constructed(); let obj = self.obj(); // Devel Profile if PROFILE == "Devel" { obj.add_css_class("devel"); } } fn properties() -> &'static [ParamSpec] { Self::derived_properties() } fn set_property(&self, id: usize, value: &Value, pspec: &ParamSpec) { self.derived_set_property(id, value, pspec); } fn property(&self, id: usize, pspec: &ParamSpec) -> Value { self.derived_property(id, pspec) } } impl WidgetImpl for ResMemory {} impl BinImpl for ResMemory {} } glib::wrapper! { pub struct ResMemory(ObjectSubclass) @extends gtk::Widget, adw::Bin, @implements gtk::Buildable, gtk::ConstraintTarget, gtk::Accessible; } impl Default for ResMemory { fn default() -> Self { Self::new() } } impl ResMemory { const MAIN_GRAPH_COLOR: [u8; 3] = [0xc5, 0x2f, 0x90]; pub fn new() -> Self { trace!("Creating ResMemory GObject…"); glib::Object::new::() } pub fn init(&self) { self.setup_widgets(); self.setup_signals(); } pub fn setup_widgets(&self) { trace!("Setting up ResMemory widgets…"); let imp = self.imp(); imp.memory.set_title_label(&i18n("Memory")); imp.memory.graph().set_graph_color( Self::MAIN_GRAPH_COLOR[0], Self::MAIN_GRAPH_COLOR[1], Self::MAIN_GRAPH_COLOR[2], ); imp.swap.set_title_label(&i18n("Swap")); imp.swap.graph().set_graph_color(0x94, 0x29, 0x7c); if let Ok(memory_devices) = MemoryDevice::get() { self.setup_properties(memory_devices); } else { imp.properties.set_visible(false); imp.authentication_banner.set_revealed(true); } } pub fn setup_properties(&self, memory_devices: Vec) { let imp = self.imp(); let slots_used = memory_devices .iter() .filter(|md| md.installed) .count() .to_string(); let slots = memory_devices.len().to_string(); let speed = memory_devices .iter() .filter(|md| md.installed) .map(|md| md.speed_mts.unwrap_or(0)) .max(); let form_factor = memory_devices.iter().find(|md| md.installed).map_or_else( || i18n("N/A"), |md| md.form_factor.clone().unwrap_or_else(|| i18n("N/A")), ); let r#type = memory_devices.iter().find(|md| md.installed).map_or_else( || i18n("N/A"), |md| md.r#type.clone().unwrap_or_else(|| i18n("N/A")), ); let type_detail = memory_devices.iter().find(|md| md.installed).map_or_else( || i18n("N/A"), |md| md.type_detail.clone().unwrap_or_else(|| i18n("N/A")), ); let total_memory = memory_devices .iter() .map(|md| md.size.unwrap_or(0)) .sum::() as f64; self.set_property( "tab_detail_string", format!( "{} {}", convert_storage(total_memory, false), memory_devices .iter() .find(|md| md.installed) .and_then(|md| md.r#type.clone()) .unwrap_or_default() ), ); imp.memory_devices.replace(memory_devices); imp.slots_used .set_subtitle(&i18n_f("{} of {}", &[slots_used.as_str(), slots.as_str()])); imp.speed.set_subtitle(&i18n_f( "{} MT/s", &[&speed.map_or_else(|| i18n("N/A"), |i| i.to_string())], )); imp.form_factor.set_subtitle(&form_factor); imp.memory_type.set_subtitle(&r#type); imp.type_detail.set_subtitle(&type_detail); } pub fn setup_signals(&self) { trace!("Setting up ResMemory signals…"); let imp = self.imp(); imp.authentication_banner.connect_button_clicked(clone!( #[weak(rename_to = this)] self, move |_| { let imp = this.imp(); if let Ok(memory_devices) = MemoryDevice::pkexec_dmidecode() { this.setup_properties(memory_devices); imp.properties.set_visible(true); } imp.authentication_banner.set_revealed(false); } )); } pub fn refresh_page(&self, memdata: MemoryData) { trace!("Refreshing ResMemory…"); let imp = self.imp(); let MemoryData { total_mem, available_mem, total_swap, free_swap, } = memdata; let used_mem = total_mem.saturating_sub(available_mem); let used_swap = total_swap.saturating_sub(free_swap); let memory_fraction = used_mem as f64 / total_mem as f64; let swap_fraction = (used_swap as f64 / total_swap as f64).finite_or_default(); let formatted_used_mem = convert_storage(used_mem as f64, false); let formatted_total_mem = convert_storage(total_mem as f64, false); imp.memory.graph().push_data_point(memory_fraction); imp.memory.set_subtitle(&format!( "{} / {} · {} %", &formatted_used_mem, &formatted_total_mem, (memory_fraction * 100.0).round() )); if total_swap == 0 { // no swap detected imp.swap.graph().push_data_point(0.0); imp.swap.graph().set_visible(false); imp.swap.set_subtitle(&i18n("N/A")); self.set_property( "tab_usage_string", format!("{} / {}", &formatted_used_mem, &formatted_total_mem), ); } else { imp.swap.graph().push_data_point(swap_fraction); imp.swap.graph().set_visible(true); imp.swap.set_subtitle(&format!( "{} / {} · {} %", &convert_storage(used_swap as f64, false), &convert_storage(total_swap as f64, false), (swap_fraction * 100.0).round() )); self.set_property( "tab_usage_string", i18n_f( // Translators: This will be displayed in the sidebar, so your translation for "Swap" should // preferably be quite short or an abbreviation "{} / {} · Swap: {} %", &[ &formatted_used_mem, &formatted_total_mem, &(swap_fraction * 100.0).round().to_string(), ], ), ); } let memory_devices = imp.memory_devices.borrow(); let total_memory = memory_devices .iter() .map(|md| md.size.unwrap_or(0)) .sum::() as f64; self.set_property( "tab_detail_string", format!( "{} {}", convert_storage(total_memory, false), memory_devices .iter() .find(|md| md.installed) .and_then(|md| md.r#type.clone()) .unwrap_or_default() ), ); self.set_property("usage", memory_fraction); } } resources-1.9.1/src/ui/pages/mod.rs000066400000000000000000000027661510634446000172020ustar00rootroot00000000000000use std::{collections::HashMap, sync::LazyLock}; use process_data::Niceness; use crate::i18n::pi18n; pub mod applications; pub mod battery; pub mod cpu; pub mod drive; pub mod gpu; pub mod memory; pub mod network; pub mod npu; pub mod processes; const APPLICATIONS_PRIMARY_ORD: u32 = 0; const PROCESSES_PRIMARY_ORD: u32 = 1; const CPU_PRIMARY_ORD: u32 = 2; const MEMORY_PRIMARY_ORD: u32 = 3; const GPU_PRIMARY_ORD: u32 = 4; const NPU_PRIMARY_ORD: u32 = 5; const DRIVE_PRIMARY_ORD: u32 = 6; const NETWORK_PRIMARY_ORD: u32 = 7; const BATTERY_PRIMARY_ORD: u32 = 8; pub static NICE_TO_LABEL: LazyLock> = LazyLock::new(|| { let mut hash_map = HashMap::new(); for i in -20..=-8 { hash_map.insert( Niceness::try_new(i).unwrap(), (pi18n("process priority", "Very High"), 0), ); } for i in -7..=-3 { hash_map.insert( Niceness::try_new(i).unwrap(), (pi18n("process priority", "High"), 1), ); } for i in -2..=2 { hash_map.insert( Niceness::try_new(i).unwrap(), (pi18n("process priority", "Normal"), 2), ); } for i in 3..=6 { hash_map.insert( Niceness::try_new(i).unwrap(), (pi18n("process priority", "Low"), 3), ); } for i in 7..=19 { hash_map.insert( Niceness::try_new(i).unwrap(), (pi18n("process priority", "Very Low"), 4), ); } hash_map }); resources-1.9.1/src/ui/pages/network.rs000066400000000000000000000354351510634446000201130ustar00rootroot00000000000000use std::time::{Duration, SystemTime}; use crate::config::PROFILE; use crate::i18n::{i18n, i18n_f}; use crate::utils::link::LinkData; use crate::utils::network::{NetworkData, NetworkInterface}; use crate::utils::units::{convert_speed, convert_speed_bits_decimal, convert_storage}; use adw::{glib::property::PropertySet, prelude::*, subclass::prelude::*}; use gtk::glib; use log::trace; use plotters::prelude::LogScalable; pub const TAB_ID_PREFIX: &str = "network"; mod imp { use std::cell::{Cell, RefCell}; use crate::ui::{pages::NETWORK_PRIMARY_ORD, widgets::graph_box::ResGraphBox}; use super::*; use gtk::{ CompositeTemplate, gio::{Icon, ThemedIcon}, glib::{ParamSpec, Properties, Value}, }; #[derive(CompositeTemplate, Properties)] #[template(resource = "/net/nokyan/Resources/ui/pages/network.ui")] #[properties(wrapper_type = super::ResNetwork)] pub struct ResNetwork { #[template_child] pub receiving: TemplateChild, #[template_child] pub sending: TemplateChild, #[template_child] pub total_received: TemplateChild, #[template_child] pub total_sent: TemplateChild, #[template_child] pub manufacturer: TemplateChild, #[template_child] pub driver: TemplateChild, #[template_child] pub interface: TemplateChild, #[template_child] pub hw_address: TemplateChild, #[template_child] pub network_name: TemplateChild, #[template_child] pub link: TemplateChild, #[template_child] pub link_speed: TemplateChild, pub old_received_bytes: Cell>, pub old_sent_bytes: Cell>, pub last_timestamp: Cell, #[property(get)] uses_progress_bar: Cell, #[property(get)] main_graph_color: glib::Bytes, #[property(get = Self::icon, set = Self::set_icon, type = Icon)] icon: RefCell, #[property(get, set)] usage: Cell, #[property(get = Self::tab_name, set = Self::set_tab_name, type = glib::GString)] tab_name: Cell, #[property(get = Self::tab_detail_string, set = Self::set_tab_detail_string, type = glib::GString )] tab_detail_string: Cell, #[property(get = Self::tab_usage_string, set = Self::set_tab_usage_string, type = glib::GString )] tab_usage_string: Cell, #[property(get = Self::tab_id, set = Self::set_tab_id, type = glib::GString)] tab_id: Cell, #[property(get)] graph_locked_max_y: Cell, #[property(get)] primary_ord: Cell, #[property(get, set)] secondary_ord: Cell, } impl ResNetwork { gstring_getter_setter!(tab_name, tab_detail_string, tab_usage_string, tab_id); pub fn icon(&self) -> Icon { let icon = self.icon.replace_with(|_| NetworkInterface::default_icon()); let result = icon.clone(); self.icon.set(icon); result } pub fn set_icon(&self, icon: &Icon) { self.icon.set(icon.clone()); } } impl Default for ResNetwork { fn default() -> Self { Self { receiving: Default::default(), sending: Default::default(), total_received: Default::default(), total_sent: Default::default(), manufacturer: Default::default(), driver: Default::default(), interface: Default::default(), hw_address: Default::default(), network_name: Default::default(), link: Default::default(), link_speed: Default::default(), uses_progress_bar: Cell::new(true), main_graph_color: glib::Bytes::from_static(&super::ResNetwork::MAIN_GRAPH_COLOR), icon: RefCell::new(ThemedIcon::new("unknown-network-type-symbolic").into()), usage: Default::default(), tab_name: Cell::new(glib::GString::from(i18n("Network Interface"))), tab_detail_string: Cell::new(glib::GString::new()), tab_id: Cell::new(glib::GString::new()), old_received_bytes: Cell::default(), old_sent_bytes: Cell::default(), last_timestamp: Cell::new( SystemTime::now() .checked_sub(Duration::from_secs(1)) .unwrap(), ), tab_usage_string: Cell::new(glib::GString::new()), graph_locked_max_y: Cell::new(false), primary_ord: Cell::new(NETWORK_PRIMARY_ORD), secondary_ord: Default::default(), } } } #[glib::object_subclass] impl ObjectSubclass for ResNetwork { const NAME: &'static str = "ResNetwork"; type Type = super::ResNetwork; type ParentType = adw::Bin; fn class_init(klass: &mut Self::Class) { Self::bind_template(klass); } // You must call `Widget`'s `init_template()` within `instance_init()`. fn instance_init(obj: &glib::subclass::InitializingObject) { obj.init_template(); } } impl ObjectImpl for ResNetwork { fn constructed(&self) { self.parent_constructed(); let obj = self.obj(); // Devel Profile if PROFILE == "Devel" { obj.add_css_class("devel"); } } fn properties() -> &'static [ParamSpec] { Self::derived_properties() } fn set_property(&self, id: usize, value: &Value, pspec: &ParamSpec) { self.derived_set_property(id, value, pspec); } fn property(&self, id: usize, pspec: &ParamSpec) -> Value { self.derived_property(id, pspec) } } impl WidgetImpl for ResNetwork {} impl BinImpl for ResNetwork {} } glib::wrapper! { pub struct ResNetwork(ObjectSubclass) @extends gtk::Widget, adw::Bin, @implements gtk::Buildable, gtk::ConstraintTarget, gtk::Accessible; } impl Default for ResNetwork { fn default() -> Self { Self::new() } } impl ResNetwork { // TODO: this is the color for receiving, but it is also used in sidebar, // which graphs the sum of send+recv. // This does not make much sense, but we probably can't do something // like separate send/receive lines without some refactoring to ResGraph. const MAIN_GRAPH_COLOR: [u8; 3] = [0x25, 0x9a, 0xab]; pub fn new() -> Self { trace!("Creating ResNetwork GObject…"); glib::Object::new::() } pub fn init(&self, network_data: &NetworkData, secondary_ord: u32) { self.set_secondary_ord(secondary_ord); self.setup_widgets(network_data); } pub fn setup_widgets(&self, network_data: &NetworkData) { trace!( "Setting up ResNetwork ({}) widgets…", network_data.inner.sysfs_path.to_string_lossy() ); let imp = self.imp(); let network_interface = &network_data.inner; let link_speed = network_interface.link_speed(); let wifi_link = LinkData::from_wifi_adapter(network_interface); let tab_id = format!( "{}-{}", TAB_ID_PREFIX, network_interface.interface_name.to_str().unwrap() ); imp.set_tab_id(&tab_id); self.imp().set_icon(&network_interface.icon()); imp.set_tab_name(&i18n(&network_interface.interface_type.to_string())); imp.receiving.set_title_label(&i18n("Receiving")); imp.receiving.graph().set_graph_color(0x34, 0xab, 0xaf); imp.receiving.graph().set_locked_max_y(None); imp.sending.set_title_label(&i18n("Sending")); imp.sending.graph().set_graph_color(0x20, 0x81, 0x8f); imp.sending.graph().set_locked_max_y(None); imp.manufacturer.set_subtitle( &network_interface .device .map_or_else(|| i18n("N/A"), |device| device.vendor().name().to_string()), ); imp.driver.set_subtitle( &network_interface .driver_name .clone() .unwrap_or_else(|| i18n("N/A")), ); imp.interface.set_subtitle( network_interface .interface_name .to_str() .unwrap_or(&i18n("N/A")), ); let hw_address = network_interface .hw_address .clone() .unwrap_or_else(|| i18n("N/A")); if hw_address.is_empty() { imp.hw_address.set_subtitle(&i18n("N/A")); } else { imp.hw_address.set_subtitle(&hw_address); } if let Ok(wifi_link) = &wifi_link { imp.network_name.set_visible(true); if let Some(ssid) = &wifi_link.current.ssid { imp.network_name.set_subtitle(ssid); } else { imp.network_name.set_subtitle(&i18n("N/A")); } } else { imp.network_name.set_visible(false); } imp.link.set_subtitle(&wifi_link.as_ref().map_or_else( |_| i18n("N/A"), |network_link_data| network_link_data.to_string(), )); imp.link_speed.set_subtitle( &(if let Ok(wifi_link) = wifi_link { wifi_link.current.link_speed_display() } else if let Ok(link_speed) = link_speed { convert_speed_bits_decimal(link_speed.as_f64()) } else { i18n("N/A") }), ); imp.last_timestamp.set( SystemTime::now() .checked_sub(Duration::from_secs(1)) .unwrap(), ); imp.old_received_bytes .set(network_data.received_bytes.as_ref().ok().copied()); imp.old_sent_bytes .set(network_data.sent_bytes.as_ref().ok().copied()); imp.set_tab_detail_string(&network_data.display_name); } pub fn refresh_page(&self, network_data: NetworkData) { trace!( "Refreshing ResNetwork ({})…", network_data.inner.sysfs_path.to_string_lossy() ); let NetworkData { received_bytes, sent_bytes, inner: _, is_virtual: _, display_name: _, } = network_data; let wifi_link = LinkData::from_wifi_adapter(&network_data.inner); let link_speed = network_data.inner.link_speed(); let imp = self.imp(); let time_passed = SystemTime::now() .duration_since(imp.last_timestamp.get()) .map_or(1.0f64, |timestamp| timestamp.as_secs_f64()); let (received_delta, received_string) = if let (Ok(received_bytes), Some(old_received_bytes)) = (received_bytes, imp.old_received_bytes.get()) { let received_delta = (received_bytes.saturating_sub(old_received_bytes)) as f64 / time_passed; imp.total_received .set_subtitle(&convert_storage(received_bytes as f64, false)); imp.receiving.graph().set_visible(true); imp.receiving.graph().push_data_point(received_delta); let highest_received = imp.receiving.graph().get_highest_value(); let formatted_delta = convert_speed(received_delta, true); imp.receiving.set_subtitle(&format!( "{} · {} {}", &formatted_delta, i18n("Highest:"), convert_speed(highest_received, true) )); imp.old_received_bytes.set(Some(received_bytes)); (received_delta, formatted_delta) } else { imp.total_received.set_subtitle(&i18n("N/A")); imp.receiving.graph().set_visible(false); imp.receiving.set_subtitle(&i18n("N/A")); (0.0, i18n("N/A")) }; let (sent_delta, sent_string) = if let (Ok(sent_bytes), Some(old_sent_bytes)) = (sent_bytes, imp.old_sent_bytes.get()) { let sent_delta = (sent_bytes.saturating_sub(old_sent_bytes)) as f64 / time_passed; imp.total_sent .set_subtitle(&convert_storage(sent_bytes as f64, false)); imp.sending.graph().set_visible(true); imp.sending.graph().push_data_point(sent_delta); let highest_sent = imp.sending.graph().get_highest_value(); let formatted_delta = convert_speed(sent_delta, true); imp.sending.set_subtitle(&format!( "{} · {} {}", &formatted_delta, i18n("Highest:"), convert_speed(highest_sent, true) )); imp.old_sent_bytes.set(Some(sent_bytes)); (sent_delta, formatted_delta) } else { imp.total_sent.set_subtitle(&i18n("N/A")); imp.sending.graph().set_visible(false); imp.sending.set_subtitle(&i18n("N/A")); (0.0, i18n("N/A")) }; if let Ok(wifi_link) = &wifi_link { imp.network_name.set_visible(true); if let Some(ssid) = &wifi_link.current.ssid { imp.network_name.set_subtitle(ssid); } else { imp.network_name.set_subtitle(&i18n("N/A")); } } else { imp.network_name.set_visible(false); } imp.link.set_subtitle(&wifi_link.as_ref().map_or_else( |_| i18n("N/A"), |network_link_data| network_link_data.to_string(), )); imp.link_speed.set_subtitle( &(if let Ok(wifi_link) = wifi_link { wifi_link.current.link_speed_display() } else if let Ok(link_speed) = link_speed { convert_speed_bits_decimal(link_speed.as_f64()) } else { i18n("N/A") }), ); self.set_property("usage", f64::max(received_delta, sent_delta)); self.set_property( "tab_usage_string", i18n_f( // Translators: This is an abbreviation for "Receive" and "Send". This is displayed in the sidebar so // your translation should preferably be quite short or an abbreviation "R: {} · S: {}", &[&received_string, &sent_string], ), ); imp.last_timestamp.set(SystemTime::now()); } } resources-1.9.1/src/ui/pages/npu.rs000066400000000000000000000277341510634446000172270ustar00rootroot00000000000000use adw::{prelude::*, subclass::prelude::*}; use gtk::glib::{self}; use log::trace; use crate::config::PROFILE; use crate::i18n::{i18n, i18n_f}; use crate::utils::FiniteOr; use crate::utils::npu::{Npu, NpuData}; use crate::utils::units::{convert_frequency, convert_power, convert_storage, convert_temperature}; pub const TAB_ID_PREFIX: &str = "npu"; mod imp { use std::cell::{Cell, RefCell}; use crate::ui::{pages::NPU_PRIMARY_ORD, widgets::graph_box::ResGraphBox}; use super::*; use gtk::{ CompositeTemplate, gio::{Icon, ThemedIcon}, glib::{ParamSpec, Properties, Value}, }; #[derive(CompositeTemplate, Properties)] #[template(resource = "/net/nokyan/Resources/ui/pages/npu.ui")] #[properties(wrapper_type = super::ResNPU)] pub struct ResNPU { #[template_child] pub npu_usage: TemplateChild, #[template_child] pub memory_usage: TemplateChild, #[template_child] pub temperature: TemplateChild, #[template_child] pub power_usage: TemplateChild, #[template_child] pub npu_clockspeed: TemplateChild, #[template_child] pub memory_clockspeed: TemplateChild, #[template_child] pub manufacturer: TemplateChild, #[template_child] pub pci_slot: TemplateChild, #[template_child] pub driver_used: TemplateChild, #[template_child] pub max_power_cap: TemplateChild, #[template_child] pub link: TemplateChild, #[property(get)] uses_progress_bar: Cell, #[property(get)] main_graph_color: glib::Bytes, #[property(get)] icon: RefCell, #[property(get, set)] usage: Cell, #[property(get = Self::tab_name, set = Self::set_tab_name, type = glib::GString)] tab_name: Cell, #[property(get = Self::tab_detail_string, set = Self::set_tab_detail_string, type = glib::GString)] tab_detail_string: Cell, #[property(get = Self::tab_usage_string, set = Self::set_tab_usage_string, type = glib::GString)] tab_usage_string: Cell, #[property(get = Self::tab_id, set = Self::set_tab_id, type = glib::GString)] tab_id: Cell, #[property(get)] graph_locked_max_y: Cell, #[property(get)] primary_ord: Cell, #[property(get, set)] secondary_ord: Cell, } impl ResNPU { gstring_getter_setter!(tab_name, tab_detail_string, tab_usage_string, tab_id); } impl Default for ResNPU { fn default() -> Self { Self { npu_usage: Default::default(), memory_usage: Default::default(), temperature: Default::default(), power_usage: Default::default(), npu_clockspeed: Default::default(), memory_clockspeed: Default::default(), manufacturer: Default::default(), pci_slot: Default::default(), driver_used: Default::default(), max_power_cap: Default::default(), link: Default::default(), uses_progress_bar: Cell::new(true), main_graph_color: glib::Bytes::from_static(&super::ResNPU::MAIN_GRAPH_COLOR), icon: RefCell::new(ThemedIcon::new("npu-symbolic").into()), usage: Default::default(), tab_name: Cell::new(glib::GString::from(i18n("NPU"))), tab_detail_string: Cell::new(glib::GString::new()), tab_usage_string: Cell::new(glib::GString::new()), tab_id: Cell::new(glib::GString::new()), graph_locked_max_y: Cell::new(true), primary_ord: Cell::new(NPU_PRIMARY_ORD), secondary_ord: Default::default(), } } } #[glib::object_subclass] impl ObjectSubclass for ResNPU { const NAME: &'static str = "ResNPU"; type Type = super::ResNPU; type ParentType = adw::Bin; fn class_init(klass: &mut Self::Class) { Self::bind_template(klass); } // You must call `Widget`'s `init_template()` within `instance_init()`. fn instance_init(obj: &glib::subclass::InitializingObject) { obj.init_template(); } } impl ObjectImpl for ResNPU { fn constructed(&self) { self.parent_constructed(); let obj = self.obj(); // Devel Profile if PROFILE == "Devel" { obj.add_css_class("devel"); } } fn properties() -> &'static [ParamSpec] { Self::derived_properties() } fn set_property(&self, id: usize, value: &Value, pspec: &ParamSpec) { self.derived_set_property(id, value, pspec); } fn property(&self, id: usize, pspec: &ParamSpec) -> Value { self.derived_property(id, pspec) } } impl WidgetImpl for ResNPU {} impl BinImpl for ResNPU {} } glib::wrapper! { pub struct ResNPU(ObjectSubclass) @extends gtk::Widget, adw::Bin, @implements gtk::Buildable, gtk::ConstraintTarget, gtk::Accessible; } impl Default for ResNPU { fn default() -> Self { Self::new() } } impl ResNPU { const MAIN_GRAPH_COLOR: [u8; 3] = [0xb5, 0x27, 0xe3]; pub fn new() -> Self { trace!("Creating ResNPU GObject…"); glib::Object::new::() } pub fn init(&self, npu: &Npu, secondary_ord: u32) { self.set_secondary_ord(secondary_ord); self.setup_widgets(npu); } pub fn setup_widgets(&self, npu: &Npu) { trace!( "Setting up ResNPU ({}, {}) widgets…", self.tab_detail_string(), npu.pci_slot() ); let imp = self.imp(); let tab_id = format!("{}-{}", TAB_ID_PREFIX, &npu.pci_slot().to_string()); imp.set_tab_id(&tab_id); imp.npu_usage.set_title_label(&i18n("Total Usage")); imp.npu_usage.graph().set_graph_color( Self::MAIN_GRAPH_COLOR[0], Self::MAIN_GRAPH_COLOR[1], Self::MAIN_GRAPH_COLOR[2], ); imp.memory_usage.set_title_label(&i18n("Memory Usage")); imp.memory_usage.graph().set_graph_color(0x9e, 0x1c, 0xcc); imp.temperature.set_title_label(&i18n("Temperature")); imp.temperature.graph().set_graph_color(0x83, 0x1c, 0xac); imp.temperature.graph().set_locked_max_y(None); imp.manufacturer.set_subtitle( &npu.get_vendor() .map_or_else(|_| i18n("N/A"), |vendor| vendor.name().to_string()), ); imp.pci_slot.set_subtitle(&npu.pci_slot().to_string()); imp.driver_used.set_subtitle(npu.driver()); if let Ok(model_name) = npu.name() { imp.set_tab_detail_string(&model_name); } } pub fn refresh_page(&self, npu_data: &NpuData) { trace!( "Refreshing ResNPU ({}, {})…", self.tab_detail_string(), npu_data.pci_slot ); let imp = self.imp(); let NpuData { pci_slot: _, usage_fraction, total_memory, used_memory, clock_speed, vram_speed, temperature, power_usage, power_cap, power_cap_max, link, } = npu_data; let mut usage_percentage_string = usage_fraction.map_or_else( || i18n("N/A"), |fraction| format!("{} %", (fraction * 100.0).round()), ); imp.npu_usage.set_subtitle(&usage_percentage_string); imp.npu_usage .graph() .push_data_point(usage_fraction.unwrap_or(0.0)); imp.npu_usage.graph().set_visible(usage_fraction.is_some()); let memory_subtitle = if let (Some(total_memory), Some(used_memory)) = (total_memory, used_memory) { let used_memory_fraction = (*used_memory as f64 / *total_memory as f64).finite_or_default(); imp.memory_usage .graph() .push_data_point(used_memory_fraction); let memory_percentage_string = format!("{} %", (used_memory_fraction * 100.0).round()); usage_percentage_string.push_str(" · "); // Translators: This will be displayed in the sidebar, please try to keep your translation as short as (or even // shorter than) 'Memory' usage_percentage_string.push_str(&i18n_f("Memory: {}", &[&memory_percentage_string])); format!( "{} / {} · {}", convert_storage(*used_memory as f64, false), convert_storage(*total_memory as f64, false), memory_percentage_string ) } else if let Some(used_memory) = used_memory { imp.memory_usage .graph() .push_data_point(*used_memory as f64); let memory_string = convert_storage(*used_memory as f64, false); let highest_memory_string = convert_storage(imp.memory_usage.graph().get_highest_value(), false); usage_percentage_string.push_str(" · "); // Translators: This will be displayed in the sidebar, please try to keep your translation as short as (or even // shorter than) 'Memory' usage_percentage_string.push_str(&i18n_f("Memory: {}", &[&memory_string])); format!( "{} · {} {}", &memory_string, i18n("Highest:"), highest_memory_string ) } else { i18n("N/A") }; imp.memory_usage.graph().set_visible(used_memory.is_some()); imp.memory_usage.set_subtitle(&memory_subtitle); imp.temperature.graph().set_visible(temperature.is_some()); let mut power_string = power_usage.map_or_else(|| i18n("N/A"), convert_power); if let Some(power_cap) = power_cap { power_string.push_str(&format!(" / {}", convert_power(*power_cap))); } imp.power_usage.set_subtitle(&power_string); if let Some(npu_clockspeed) = clock_speed { imp.npu_clockspeed .set_subtitle(&convert_frequency(*npu_clockspeed)); } else { imp.npu_clockspeed.set_subtitle(&i18n("N/A")); } if let Some(vram_clockspeed) = vram_speed { imp.memory_clockspeed .set_subtitle(&convert_frequency(*vram_clockspeed)); } else { imp.memory_clockspeed.set_subtitle(&i18n("N/A")); } imp.max_power_cap .set_subtitle(&power_cap_max.map_or_else(|| i18n("N/A"), convert_power)); self.set_property("usage", usage_fraction.unwrap_or(0.0)); if let Some(temperature) = temperature { let temperature_string = convert_temperature(*temperature); let highest_temperature_string = convert_temperature(imp.temperature.graph().get_highest_value()); imp.temperature.set_subtitle(&format!( "{} · {} {}", &temperature_string, i18n("Highest:"), highest_temperature_string )); imp.temperature.graph().push_data_point(*temperature); usage_percentage_string.push_str(" · "); usage_percentage_string.push_str(&temperature_string); } else { imp.temperature.set_subtitle(&i18n("N/A")); } if let Some(link) = link { imp.link.set_subtitle(&link.to_string()); } else { imp.link.set_subtitle(&i18n("N/A")); } self.set_property("tab_usage_string", &usage_percentage_string); } } resources-1.9.1/src/ui/pages/processes/000077500000000000000000000000001510634446000200505ustar00rootroot00000000000000resources-1.9.1/src/ui/pages/processes/mod.rs000066400000000000000000002255201510634446000212030ustar00rootroot00000000000000pub mod process_entry; mod process_name_cell; use std::collections::HashSet; use std::sync::LazyLock; use adw::ResponseAppearance; use adw::{prelude::*, subclass::prelude::*}; use async_channel::Sender; use gtk::glib::{self, MainContext, Object, clone, closure}; use gtk::{ BitsetIter, ColumnView, ColumnViewColumn, EventControllerKey, FilterChange, ListItem, NumericSorter, SortType, StringSorter, Widget, gio, }; use process_data::Niceness; use crate::config::PROFILE; use crate::i18n::{i18n, i18n_f, ni18n_f}; use crate::ui::dialogs::process_dialog::ResProcessDialog; use crate::ui::dialogs::process_options_dialog::ResProcessOptionsDialog; use crate::ui::pages::NICE_TO_LABEL; use crate::ui::window::{Action, MainWindow}; use crate::utils::NUM_CPUS; use crate::utils::app::AppsContext; use crate::utils::process::ProcessAction; use crate::utils::settings::SETTINGS; use crate::utils::units::{convert_speed, convert_storage, format_time}; use self::process_entry::ProcessEntry; use self::process_name_cell::ResProcessNameCell; pub const TAB_ID: &str = "processes"; static LONGEST_PRIORITY_LABEL: LazyLock = LazyLock::new(|| { // make sure that no matter how short the longest current locale's translation for a priority may be, a signed // two-digit number (+ 1 for more space) will always fit let min_length = 4; let calulated = NICE_TO_LABEL .values() .map(|(s, _)| s.len()) .max() .unwrap_or(13) as u32; if calulated > min_length { calulated } else { min_length } }); mod imp { use std::{ cell::{Cell, RefCell}, sync::OnceLock, }; use crate::{ ui::{ dialogs::process_options_dialog::ResProcessOptionsDialog, pages::PROCESSES_PRIMARY_ORD, window::Action, }, utils::process::ProcessAction, }; use super::*; use gtk::{ CompositeTemplate, gio::{Icon, ThemedIcon}, glib::{ParamSpec, Properties, Value}, }; #[derive(CompositeTemplate, Properties)] #[properties(wrapper_type = super::ResProcesses)] #[template(resource = "/net/nokyan/Resources/ui/pages/processes.ui")] pub struct ResProcesses { #[template_child] pub toast_overlay: TemplateChild, #[template_child] pub popover_menu: TemplateChild, #[template_child] pub popover_menu_multiple: TemplateChild, #[template_child] pub search_bar: TemplateChild, #[template_child] pub search_entry: TemplateChild, #[template_child] pub processes_scrolled_window: TemplateChild, #[template_child] pub options_button: TemplateChild, #[template_child] pub information_button: TemplateChild, #[template_child] pub end_process_button: TemplateChild, #[template_child] pub end_process_menu: TemplateChild, #[template_child] pub end_process_menu_multiple: TemplateChild, pub store: RefCell, pub selection_model: RefCell, pub filter_model: RefCell, pub sort_model: RefCell, pub column_view: RefCell, pub open_info_dialog: RefCell>, pub open_options_dialog: RefCell>, pub info_dialog_closed: Cell, pub options_dialog_closed: Cell, pub sender: OnceLock>, pub popped_over_process: RefCell>, pub columns: RefCell>, #[property(get)] uses_progress_bar: Cell, #[property(get)] icon: RefCell, #[property(get = Self::tab_name, type = glib::GString)] tab_name: Cell, #[property(get = Self::tab_detail_string, type = glib::GString)] tab_detail_string: Cell, #[property(get = Self::tab_usage_string, set = Self::set_tab_usage_string, type = glib::GString)] tab_usage_string: Cell, #[property(get = Self::tab_id, type = glib::GString)] tab_id: Cell, #[property(get)] graph_locked_max_y: Cell, #[property(get)] primary_ord: Cell, #[property(get)] secondary_ord: Cell, } impl ResProcesses { gstring_getter_setter!(tab_name, tab_detail_string, tab_usage_string, tab_id); } impl Default for ResProcesses { fn default() -> Self { Self { toast_overlay: Default::default(), popover_menu: Default::default(), popover_menu_multiple: Default::default(), search_bar: Default::default(), search_entry: Default::default(), processes_scrolled_window: Default::default(), options_button: Default::default(), information_button: Default::default(), end_process_button: Default::default(), end_process_menu: Default::default(), end_process_menu_multiple: Default::default(), store: gio::ListStore::new::().into(), selection_model: RefCell::new(glib::object::Object::new::()), filter_model: Default::default(), sort_model: Default::default(), column_view: Default::default(), open_info_dialog: Default::default(), open_options_dialog: Default::default(), info_dialog_closed: Default::default(), options_dialog_closed: Default::default(), sender: Default::default(), uses_progress_bar: Cell::new(false), icon: RefCell::new(ThemedIcon::new("generic-process-symbolic").into()), tab_name: Cell::new(glib::GString::from(i18n("Processes"))), tab_detail_string: Cell::new(glib::GString::new()), tab_usage_string: Cell::new(glib::GString::new()), tab_id: Cell::new(glib::GString::from(TAB_ID)), popped_over_process: Default::default(), columns: Default::default(), graph_locked_max_y: Cell::new(true), primary_ord: Cell::new(PROCESSES_PRIMARY_ORD), secondary_ord: Default::default(), } } } #[glib::object_subclass] impl ObjectSubclass for ResProcesses { const NAME: &'static str = "ResProcesses"; type Type = super::ResProcesses; type ParentType = adw::Bin; fn class_init(klass: &mut Self::Class) { klass.install_action( "processes.context-end-process", None, move |res_processes, _, _| { if let Some(process_entry) = res_processes.imp().popped_over_process.borrow().as_ref() { res_processes.open_process_action_dialog( vec![process_entry.clone()], ProcessAction::TERM, ); } }, ); klass.install_action( "processes.context-kill-process", None, move |res_processes, _, _| { if let Some(process_entry) = res_processes.imp().popped_over_process.borrow().as_ref() { res_processes.open_process_action_dialog( vec![process_entry.clone()], ProcessAction::KILL, ); } }, ); klass.install_action( "processes.context-halt-process", None, move |res_processes, _, _| { if let Some(process_entry) = res_processes.imp().popped_over_process.borrow().as_ref() { res_processes.open_process_action_dialog( vec![process_entry.clone()], ProcessAction::STOP, ); } }, ); klass.install_action( "processes.context-continue-process", None, move |res_processes, _, _| { if let Some(process_entry) = res_processes.imp().popped_over_process.borrow().as_ref() { res_processes.open_process_action_dialog( vec![process_entry.clone()], ProcessAction::CONT, ); } }, ); klass.install_action( "processes.context-information", None, move |res_processes, _, _| { if let Some(process_entry) = res_processes.imp().popped_over_process.borrow().as_ref() { res_processes.open_info_dialog(process_entry); } }, ); klass.install_action( "processes.context-options", None, move |res_processes, _, _| { if let Some(process_entry) = res_processes.imp().popped_over_process.borrow().as_ref() { res_processes.open_options_dialog(process_entry); } }, ); klass.install_action("processes.end-process", None, move |res_processes, _, _| { let selected = res_processes.get_selected_process_entries(); if !selected.is_empty() { res_processes.open_process_action_dialog(selected, ProcessAction::TERM); } }); klass.install_action( "processes.kill-process", None, move |res_processes, _, _| { let selected = res_processes.get_selected_process_entries(); if !selected.is_empty() { res_processes.open_process_action_dialog(selected, ProcessAction::KILL); } }, ); klass.install_action( "processes.halt-process", None, move |res_processes, _, _| { let selected = res_processes.get_selected_process_entries(); if !selected.is_empty() { res_processes.open_process_action_dialog(selected, ProcessAction::STOP); } }, ); klass.install_action( "processes.continue-process", None, move |res_processes, _, _| { let selected = res_processes.get_selected_process_entries(); if !selected.is_empty() { res_processes.open_process_action_dialog(selected, ProcessAction::CONT); } }, ); Self::bind_template(klass); } // You must call `Widget`'s `init_template()` within `instance_init()`. fn instance_init(obj: &glib::subclass::InitializingObject) { obj.init_template(); } } impl ObjectImpl for ResProcesses { fn constructed(&self) { self.parent_constructed(); let obj = self.obj(); // Devel Profile if PROFILE == "Devel" { obj.add_css_class("devel"); } } fn properties() -> &'static [ParamSpec] { Self::derived_properties() } fn set_property(&self, id: usize, value: &Value, pspec: &ParamSpec) { self.derived_set_property(id, value, pspec); } fn property(&self, id: usize, pspec: &ParamSpec) -> Value { self.derived_property(id, pspec) } } impl WidgetImpl for ResProcesses {} impl BinImpl for ResProcesses {} } glib::wrapper! { pub struct ResProcesses(ObjectSubclass) @extends gtk::Widget, adw::Bin, @implements gtk::Buildable, gtk::ConstraintTarget, gtk::Accessible; } impl Default for ResProcesses { fn default() -> Self { Self::new() } } impl ResProcesses { pub fn new() -> Self { glib::Object::new::() } pub fn toggle_search(&self) { let imp = self.imp(); imp.search_bar .set_search_mode(!imp.search_bar.is_search_mode()); } pub fn close_search(&self) { let imp = self.imp(); imp.search_bar.set_search_mode(false); } pub fn init(&self, sender: Sender) { let imp = self.imp(); imp.sender.set(sender).unwrap(); self.setup_widgets(); self.setup_signals(); } fn add_gestures(&self, item: &ListItem) { let widget = item.child().unwrap(); let secondary_click = gtk::GestureClick::new(); secondary_click.set_button(3); secondary_click.connect_released(clone!( #[weak] widget, #[weak] item, #[weak(rename_to = this)] self, move |_, _, x, y| { if let Some(entry) = item.item().and_downcast::() { let imp = this.imp(); let selected = this.get_selected_process_entries(); let popover_menu = if selected.len() > 1 { &imp.popover_menu_multiple } else { &imp.popover_menu }; *imp.popped_over_process.borrow_mut() = Some(entry); let position = widget .compute_point(&this, >k::graphene::Point::new(x as _, y as _)) .unwrap(); popover_menu.set_pointing_to(Some(>k::gdk::Rectangle::new( position.x().round() as i32, position.y().round() as i32, 1, 1, ))); popover_menu.popup(); } } )); widget.add_controller(secondary_click); } pub fn setup_widgets(&self) { let imp = self.imp(); // i don't quite get why that's necessary imp.popover_menu.set_parent(self); imp.popover_menu_multiple.set_parent(self); *imp.column_view.borrow_mut() = gtk::ColumnView::new(None::); let column_view = imp.column_view.borrow(); let mut columns = imp.columns.borrow_mut(); columns.push(self.add_name_column(&column_view)); columns.push(self.add_pid_column(&column_view)); columns.push(self.add_user_column(&column_view)); columns.push(self.add_memory_column(&column_view)); columns.push(self.add_cpu_column(&column_view)); columns.push(self.add_read_speed_column(&column_view)); columns.push(self.add_read_total_column(&column_view)); columns.push(self.add_write_speed_column(&column_view)); columns.push(self.add_write_total_column(&column_view)); columns.push(self.add_gpu_column(&column_view)); columns.push(self.add_gpu_mem_column(&column_view)); columns.push(self.add_encoder_column(&column_view)); columns.push(self.add_decoder_column(&column_view)); columns.push(self.add_total_cpu_time_column(&column_view)); columns.push(self.add_user_cpu_time_column(&column_view)); columns.push(self.add_system_cpu_time_column(&column_view)); columns.push(self.add_priority_column(&column_view)); columns.push(self.add_swap_column(&column_view)); columns.push(self.add_combined_memory_column(&column_view)); columns.push(self.add_commandline_column(&column_view)); let store = gio::ListStore::new::(); let filter_model = gtk::FilterListModel::new( Some(store.clone()), Some(gtk::CustomFilter::new(clone!( #[strong(rename_to = this)] self, move |obj| this.search_filter(obj) ))), ); let sort_model = gtk::SortListModel::new(Some(filter_model.clone()), column_view.sorter()); let selection_model = gtk::MultiSelection::new(Some(sort_model.clone())); column_view.set_model(Some(&selection_model)); column_view.sort_by_column( columns .get(SETTINGS.processes_sort_by() as usize) .or_else(|| columns.get(3)), SETTINGS.processes_sort_by_ascending(), ); column_view.add_css_class("resources-columnview"); *imp.store.borrow_mut() = store; *imp.selection_model.borrow_mut() = selection_model; *imp.sort_model.borrow_mut() = sort_model; *imp.filter_model.borrow_mut() = filter_model; imp.processes_scrolled_window.set_child(Some(&*column_view)); } pub fn setup_signals(&self) { let imp = self.imp(); imp.end_process_button .set_menu_model(Some(&imp.end_process_menu.get())); imp.selection_model .borrow() .connect_selection_changed(clone!( #[weak(rename_to = this)] self, move |model, _, _| { let imp = this.imp(); let bitset = model.selection(); imp.information_button.set_sensitive(bitset.size() == 1); imp.options_button.set_sensitive(bitset.size() == 1); imp.end_process_button.set_sensitive(bitset.size() > 0); if bitset.size() <= 1 { imp.end_process_button.set_label(&i18n("End Process")); imp.end_process_button .set_menu_model(Some(&imp.end_process_menu.get())); } else { imp.end_process_button.set_label(&i18n("End Processes")); imp.end_process_button .set_menu_model(Some(&imp.end_process_menu_multiple.get())); } } )); imp.search_bar .set_key_capture_widget(self.parent().as_ref()); imp.search_entry.connect_search_changed(clone!( #[strong(rename_to = this)] self, move |_| { let imp = this.imp(); if let Some(filter) = imp.filter_model.borrow().filter() { filter.changed(FilterChange::Different); } } )); let event_controller = EventControllerKey::new(); event_controller.connect_key_released(clone!( #[weak(rename_to = this)] self, move |_, key, _, _| { if key.name().unwrap_or_default() == "Escape" { this.close_search(); } } )); imp.search_entry.add_controller(event_controller); imp.options_button.connect_clicked(clone!( #[weak(rename_to = this)] self, move |_| { let imp = this.imp(); let bitset = imp.selection_model.borrow().selection(); let selection_option = imp .selection_model .borrow() .item(bitset.maximum()) // the info button is only available when only 1 item is selected, so this should be fine .map(|object| object.downcast::().unwrap()); if let Some(selection) = selection_option { this.open_options_dialog(&selection); } } )); imp.information_button.connect_clicked(clone!( #[weak(rename_to = this)] self, move |_| { let imp = this.imp(); let bitset = imp.selection_model.borrow().selection(); let selection_option = imp .selection_model .borrow() .item(bitset.maximum()) // the info button is only available when only 1 item is selected, so this should be fine .map(|object| object.downcast::().unwrap()); if let Some(selection) = selection_option { this.open_info_dialog(&selection); } } )); imp.end_process_button.connect_clicked(clone!( #[weak(rename_to = this)] self, move |_| { let selected = this.get_selected_process_entries(); if !selected.is_empty() { this.open_process_action_dialog(selected, ProcessAction::TERM); } } )); if let Some(column_view_sorter) = imp.column_view.borrow().sorter() { column_view_sorter.connect_changed(clone!( #[weak(rename_to = this)] self, move |sorter, _| { if let Some(sorter) = sorter.downcast_ref::() { let current_column = sorter .primary_sort_column() .map(|column| column.as_ptr() as usize) .unwrap_or_default(); let current_column_number = this .imp() .columns .borrow() .iter() .enumerate() .find(|(_, column)| column.as_ptr() as usize == current_column) .map_or(3, |(i, _)| i as u32); // 3 corresponds to the memory column if SETTINGS.processes_sort_by() != current_column_number { let _ = SETTINGS.set_processes_sort_by(current_column_number); } if SETTINGS.processes_sort_by_ascending() != sorter.primary_sort_order() { let _ = SETTINGS .set_processes_sort_by_ascending(sorter.primary_sort_order()); } } } )); } } pub fn search_bar(&self) -> >k::SearchBar { &self.imp().search_bar } pub fn open_options_dialog(&self, process: &ProcessEntry) { let imp = self.imp(); if imp.open_info_dialog.borrow().is_some() || imp.open_options_dialog.borrow().is_some() { return; } imp.options_dialog_closed.set(false); let dialog = ResProcessOptionsDialog::new(); dialog.init( process, imp.sender.get().unwrap().clone(), &imp.toast_overlay, ); dialog.connect_closed(clone!( #[weak(rename_to = this)] self, move |_| { this.imp().options_dialog_closed.set(true); } )); adw::prelude::AdwDialogExt::present(&dialog, Some(&MainWindow::default())); *imp.open_options_dialog.borrow_mut() = Some((process.pid(), dialog)); } pub fn open_info_dialog(&self, process: &ProcessEntry) { let imp = self.imp(); if imp.open_info_dialog.borrow().is_some() || imp.open_options_dialog.borrow().is_some() { return; } imp.options_dialog_closed.set(false); let dialog = ResProcessDialog::new(); dialog.init(process, process.user()); dialog.connect_closed(clone!( #[weak(rename_to = this)] self, move |_| { this.imp().info_dialog_closed.set(true); } )); AdwDialogExt::present(&dialog, Some(&MainWindow::default())); *imp.open_info_dialog.borrow_mut() = Some((process.pid(), dialog)); } fn search_filter(&self, obj: &Object) -> bool { let imp = self.imp(); let item = obj.downcast_ref::().unwrap(); let search_string = imp.search_entry.text().to_string().to_lowercase(); !imp.search_bar.is_search_mode() || item.name().to_lowercase().contains(&search_string) || item.commandline().to_lowercase().contains(&search_string) } pub fn get_selected_process_entries(&self) -> Vec { let imp = self.imp(); if let Some((bitset_iter, first)) = BitsetIter::init_first(&imp.selection_model.borrow().selection()) { let mut return_vec: Vec<_> = bitset_iter .filter_map(|position| { imp.selection_model .borrow() .item(position) .map(|object| object.downcast::().unwrap()) }) .collect(); if let Some(first_process) = imp .selection_model .borrow() .item(first) .map(|object| object.downcast::().unwrap()) { return_vec.insert(0, first_process); } return_vec } else { Vec::default() } } pub fn refresh_processes_list(&self, apps_context: &AppsContext) { let imp = self.imp(); if imp.info_dialog_closed.get() { let _ = imp.open_info_dialog.take(); imp.info_dialog_closed.set(false); } if imp.options_dialog_closed.get() { let _ = imp.open_options_dialog.take(); imp.options_dialog_closed.set(false); } let store = imp.store.borrow_mut(); let mut info_dialog_opt = imp.open_info_dialog.borrow_mut(); let mut options_dialog_opt = imp.open_options_dialog.borrow_mut(); let mut pids_to_remove = HashSet::new(); let mut already_existing_pids = HashSet::new(); // change process entries of processes that have existed before store.iter::().flatten().for_each(|object| { let item_pid = object.pid(); if let Some(process) = apps_context.get_process(item_pid) { object.update(process); if let Some((dialog_pid, dialog)) = &*info_dialog_opt { if *dialog_pid == item_pid { dialog.update(&object); } } already_existing_pids.insert(item_pid); } else { // filter out processes that have existed before but don't anymore if let Some((dialog_pid, dialog)) = &*info_dialog_opt { if *dialog_pid == item_pid { AdwDialogExt::close(dialog); *info_dialog_opt = None; } } if let Some((dialog_pid, dialog)) = &*options_dialog_opt { if *dialog_pid == item_pid { AdwDialogExt::close(dialog); *options_dialog_opt = None; } } *imp.popped_over_process.borrow_mut() = None; imp.popover_menu.set_visible(false); pids_to_remove.insert(item_pid); } }); std::mem::drop(info_dialog_opt); std::mem::drop(options_dialog_opt); // remove recently deceased processes store.retain(|object| { !pids_to_remove.contains(&object.clone().downcast::().unwrap().pid()) }); // add the newly started process to the store let items: Vec = apps_context .processes_iter() .filter(|process| { !already_existing_pids.contains(&process.data.pid) && !pids_to_remove.contains(&process.data.pid) }) .map(ProcessEntry::new) .collect(); store.extend_from_slice(&items); if let Some(sorter) = imp.column_view.borrow().sorter() { sorter.changed(gtk::SorterChange::Different); } self.set_tab_usage_string(i18n_f( "Running Processes: {}", &[&(store.n_items()).to_string()], )); } pub fn open_process_action_dialog(&self, processes: Vec, action: ProcessAction) { // Nothing too bad can happen on Continue so dont show the dialog if action == ProcessAction::CONT { let main_context = MainContext::default(); main_context.spawn_local(clone!( #[weak(rename_to = this)] self, #[strong] processes, async move { let imp = this.imp(); let _ = imp .sender .get() .unwrap() .send(Action::ManipulateProcesses( action, processes .iter() .map(process_entry::ProcessEntry::pid) .collect(), imp.toast_overlay.get(), )) .await; } )); return; } let action_name = if processes.len() == 1 { get_action_name(action, &processes[0].name()) } else { get_action_name_multiple(action, processes.len()) }; // Confirmation dialog & warning let dialog = adw::AlertDialog::builder() .heading(action_name) .body(get_action_warning(action)) .build(); dialog.add_response("yes", &get_action_description(action)); dialog.set_response_appearance("yes", ResponseAppearance::Destructive); dialog.add_response("no", &i18n("Cancel")); dialog.set_default_response(Some("no")); dialog.set_close_response("no"); // wtf is this dialog.connect_response( None, clone!( #[weak(rename_to = this)] self, #[strong] processes, move |_, response| { if response == "yes" { let main_context = MainContext::default(); main_context.spawn_local(clone!( #[weak] this, #[strong] processes, async move { let imp = this.imp(); let _ = imp .sender .get() .unwrap() .send(Action::ManipulateProcesses( action, processes .iter() .map(process_entry::ProcessEntry::pid) .collect(), imp.toast_overlay.get(), )) .await; } )); } } ), ); dialog.present(Some(&MainWindow::default())); } fn add_name_column(&self, column_view: &ColumnView) -> ColumnViewColumn { let name_col_factory = gtk::SignalListItemFactory::new(); let name_col = gtk::ColumnViewColumn::new(Some(&i18n("Process")), Some(name_col_factory.clone())); name_col.set_resizable(true); name_col.set_expand(true); name_col_factory.connect_setup(clone!( #[weak(rename_to = this)] self, move |_factory, item| { let item = item.downcast_ref::().unwrap(); let row = ResProcessNameCell::new(); item.set_child(Some(&row)); item.property_expression("item") .chain_property::("name") .bind(&row, "name", Widget::NONE); item.property_expression("item") .chain_property::("icon") .bind(&row, "icon", Widget::NONE); item.property_expression("item") .chain_property::("commandline") .bind(&row, "tooltip", Widget::NONE); item.property_expression("item") .chain_property::("symbolic") .bind(&row, "symbolic", Widget::NONE); this.add_gestures(item); } )); name_col_factory.connect_teardown(move |_factory, item| { let item = item.downcast_ref::().unwrap(); item.set_child(None::<&ResProcessNameCell>); }); let name_col_sorter = StringSorter::builder() .ignore_case(true) .expression(gtk::PropertyExpression::new( ProcessEntry::static_type(), None::<>k::Expression>, "name", )) .build(); name_col.set_sorter(Some(&name_col_sorter)); column_view.append_column(&name_col); name_col } fn add_pid_column(&self, column_view: &ColumnView) -> ColumnViewColumn { let pid_col_factory = gtk::SignalListItemFactory::new(); let pid_col = gtk::ColumnViewColumn::new(Some(&i18n("Process ID")), Some(pid_col_factory.clone())); pid_col.set_resizable(true); pid_col_factory.connect_setup(clone!( #[weak(rename_to = this)] self, move |_factory, item| { let item = item.downcast_ref::().unwrap(); let row = gtk::Inscription::new(None); item.set_child(Some(&row)); item.property_expression("item") .chain_property::("pid") .bind(&row, "text", Widget::NONE); this.add_gestures(item); } )); pid_col_factory.connect_teardown(move |_factory, item| { let item = item.downcast_ref::().unwrap(); item.set_child(None::<>k::Inscription>); }); let pid_col_sorter = NumericSorter::builder() .sort_order(SortType::Ascending) .expression(gtk::PropertyExpression::new( ProcessEntry::static_type(), None::<>k::Expression>, "pid", )) .build(); pid_col.set_sorter(Some(&pid_col_sorter)); pid_col.set_visible(SETTINGS.processes_show_id()); column_view.append_column(&pid_col); SETTINGS.connect_processes_show_id(clone!( #[weak] pid_col, move |visible| pid_col.set_visible(visible) )); pid_col } fn add_user_column(&self, column_view: &ColumnView) -> ColumnViewColumn { let user_col_factory = gtk::SignalListItemFactory::new(); let user_col = gtk::ColumnViewColumn::new(Some(&i18n("User")), Some(user_col_factory.clone())); user_col.set_resizable(true); user_col_factory.connect_setup(clone!( #[weak(rename_to = this)] self, move |_factory, item| { let item = item.downcast_ref::().unwrap(); let row = gtk::Inscription::new(None); item.set_child(Some(&row)); item.property_expression("item") .chain_property::("user") .bind(&row, "text", Widget::NONE); this.add_gestures(item); } )); user_col_factory.connect_teardown(move |_factory, item| { let item = item.downcast_ref::().unwrap(); item.set_child(None::<>k::Inscription>); }); let user_col_sorter = StringSorter::builder() .ignore_case(true) .expression(gtk::PropertyExpression::new( ProcessEntry::static_type(), None::<>k::Expression>, "user", )) .build(); user_col.set_sorter(Some(&user_col_sorter)); user_col.set_visible(SETTINGS.processes_show_user()); column_view.append_column(&user_col); SETTINGS.connect_processes_show_user(clone!( #[weak] user_col, move |visible| user_col.set_visible(visible) )); user_col } fn add_memory_column(&self, column_view: &ColumnView) -> ColumnViewColumn { let memory_col_factory = gtk::SignalListItemFactory::new(); let memory_col = gtk::ColumnViewColumn::new(Some(&i18n("Memory")), Some(memory_col_factory.clone())); memory_col.set_resizable(true); memory_col_factory.connect_setup(clone!( #[weak(rename_to = this)] self, move |_factory, item| { let item = item.downcast_ref::().unwrap(); let row = gtk::Inscription::new(None); row.set_min_chars(9); row.set_xalign(1.0); item.set_child(Some(&row)); item.property_expression("item") .chain_property::("memory_usage") .chain_closure::(closure!(|_: Option, memory_usage: u64| { convert_storage(memory_usage as f64, false) })) .bind(&row, "text", Widget::NONE); this.add_gestures(item); } )); memory_col_factory.connect_teardown(move |_factory, item| { let item = item.downcast_ref::().unwrap(); item.set_child(None::<>k::Inscription>); }); let memory_col_sorter = NumericSorter::builder() .sort_order(SortType::Ascending) .expression(gtk::PropertyExpression::new( ProcessEntry::static_type(), None::<>k::Expression>, "memory_usage", )) .build(); memory_col.set_sorter(Some(&memory_col_sorter)); memory_col.set_visible(SETTINGS.processes_show_memory()); column_view.append_column(&memory_col); SETTINGS.connect_processes_show_memory(clone!( #[weak] memory_col, move |visible| memory_col.set_visible(visible) )); memory_col } fn add_cpu_column(&self, column_view: &ColumnView) -> ColumnViewColumn { let cpu_col_factory = gtk::SignalListItemFactory::new(); let cpu_col = gtk::ColumnViewColumn::new(Some(&i18n("Processor")), Some(cpu_col_factory.clone())); cpu_col.set_resizable(true); cpu_col_factory.connect_setup(clone!( #[weak(rename_to = this)] self, move |_factory, item| { let item = item.downcast_ref::().unwrap(); let row = gtk::Inscription::new(None); row.set_min_chars(7); row.set_xalign(1.0); item.set_child(Some(&row)); item.property_expression("item") .chain_property::("cpu_usage") .chain_closure::(closure!(|_: Option, cpu_usage: f32| { let mut percentage = cpu_usage * 100.0; if !SETTINGS.normalize_cpu_usage() { percentage *= *NUM_CPUS as f32; } format!("{percentage:.1} %") })) .bind(&row, "text", Widget::NONE); this.add_gestures(item); } )); cpu_col_factory.connect_teardown(move |_factory, item| { let item = item.downcast_ref::().unwrap(); item.set_child(None::<>k::Inscription>); }); let cpu_col_sorter = NumericSorter::builder() .sort_order(SortType::Ascending) .expression(gtk::PropertyExpression::new( ProcessEntry::static_type(), None::<>k::Expression>, "cpu_usage", )) .build(); cpu_col.set_sorter(Some(&cpu_col_sorter)); cpu_col.set_visible(SETTINGS.processes_show_cpu()); column_view.append_column(&cpu_col); SETTINGS.connect_processes_show_cpu(clone!( #[weak] cpu_col, move |visible| cpu_col.set_visible(visible) )); cpu_col } fn add_read_speed_column(&self, column_view: &ColumnView) -> ColumnViewColumn { let read_speed_col_factory = gtk::SignalListItemFactory::new(); let read_speed_col = gtk::ColumnViewColumn::new( Some(&i18n("Drive Read")), Some(read_speed_col_factory.clone()), ); read_speed_col.set_resizable(true); read_speed_col_factory.connect_setup(clone!( #[weak(rename_to = this)] self, move |_factory, item| { let item = item.downcast_ref::().unwrap(); let row = gtk::Inscription::new(None); row.set_min_chars(11); row.set_xalign(1.0); item.set_child(Some(&row)); item.property_expression("item") .chain_property::("read_speed") .chain_closure::(closure!(|_: Option, read_speed: f64| { if read_speed == -1.0 { i18n("N/A") } else { convert_speed(read_speed, false) } })) .bind(&row, "text", Widget::NONE); this.add_gestures(item); } )); read_speed_col_factory.connect_teardown(move |_factory, item| { let item = item.downcast_ref::().unwrap(); item.set_child(None::<>k::Inscription>); }); let read_speed_col_sorter = NumericSorter::builder() .sort_order(SortType::Ascending) .expression(gtk::PropertyExpression::new( ProcessEntry::static_type(), None::<>k::Expression>, "read_speed", )) .build(); read_speed_col.set_sorter(Some(&read_speed_col_sorter)); read_speed_col.set_visible(SETTINGS.processes_show_drive_read_speed()); column_view.append_column(&read_speed_col); SETTINGS.connect_processes_show_drive_read_speed(clone!( #[weak] read_speed_col, move |visible| { read_speed_col.set_visible(visible); } )); read_speed_col } fn add_read_total_column(&self, column_view: &ColumnView) -> ColumnViewColumn { let read_total_col_factory = gtk::SignalListItemFactory::new(); let read_total_col = gtk::ColumnViewColumn::new( Some(&i18n("Drive Read Total")), Some(read_total_col_factory.clone()), ); read_total_col.set_resizable(true); read_total_col_factory.connect_setup(clone!( #[weak(rename_to = this)] self, move |_factory, item| { let item = item.downcast_ref::().unwrap(); let row = gtk::Inscription::new(None); row.set_min_chars(9); row.set_xalign(1.0); item.set_child(Some(&row)); item.property_expression("item") .chain_property::("read_total") .chain_closure::(closure!(|_: Option, read_total: i64| { if read_total == -1 { i18n("N/A") } else { convert_storage(read_total as f64, false) } })) .bind(&row, "text", Widget::NONE); this.add_gestures(item); } )); read_total_col_factory.connect_teardown(move |_factory, item| { let item = item.downcast_ref::().unwrap(); item.set_child(None::<>k::Inscription>); }); let read_total_col_sorter = NumericSorter::builder() .sort_order(SortType::Ascending) .expression(gtk::PropertyExpression::new( ProcessEntry::static_type(), None::<>k::Expression>, "read_total", )) .build(); read_total_col.set_sorter(Some(&read_total_col_sorter)); read_total_col.set_visible(SETTINGS.processes_show_drive_read_total()); column_view.append_column(&read_total_col); SETTINGS.connect_processes_show_drive_read_total(clone!( #[weak] read_total_col, move |visible| { read_total_col.set_visible(visible); } )); read_total_col } fn add_write_speed_column(&self, column_view: &ColumnView) -> ColumnViewColumn { let write_speed_col_factory = gtk::SignalListItemFactory::new(); let write_speed_col = gtk::ColumnViewColumn::new( Some(&i18n("Drive Write")), Some(write_speed_col_factory.clone()), ); write_speed_col.set_resizable(true); write_speed_col_factory.connect_setup(clone!( #[weak(rename_to = this)] self, move |_factory, item| { let item = item.downcast_ref::().unwrap(); let row = gtk::Inscription::new(None); row.set_min_chars(11); row.set_xalign(1.0); item.set_child(Some(&row)); item.property_expression("item") .chain_property::("write_speed") .chain_closure::(closure!(|_: Option, write_speed: f64| { if write_speed == -1.0 { i18n("N/A") } else { convert_speed(write_speed, false) } })) .bind(&row, "text", Widget::NONE); this.add_gestures(item); } )); write_speed_col_factory.connect_teardown(move |_factory, item| { let item = item.downcast_ref::().unwrap(); item.set_child(None::<>k::Inscription>); }); let write_speed_col_sorter = NumericSorter::builder() .sort_order(SortType::Ascending) .expression(gtk::PropertyExpression::new( ProcessEntry::static_type(), None::<>k::Expression>, "write_speed", )) .build(); write_speed_col.set_sorter(Some(&write_speed_col_sorter)); write_speed_col.set_visible(SETTINGS.processes_show_drive_write_speed()); column_view.append_column(&write_speed_col); SETTINGS.connect_processes_show_drive_write_speed(clone!( #[weak] write_speed_col, move |visible| { write_speed_col.set_visible(visible); } )); write_speed_col } fn add_write_total_column(&self, column_view: &ColumnView) -> ColumnViewColumn { let write_total_col_factory = gtk::SignalListItemFactory::new(); let write_total_col = gtk::ColumnViewColumn::new( Some(&i18n("Drive Write Total")), Some(write_total_col_factory.clone()), ); write_total_col.set_resizable(true); write_total_col_factory.connect_setup(clone!( #[weak(rename_to = this)] self, move |_factory, item| { let item = item.downcast_ref::().unwrap(); let row = gtk::Inscription::new(None); row.set_min_chars(9); row.set_xalign(1.0); item.set_child(Some(&row)); item.property_expression("item") .chain_property::("write_total") .chain_closure::(closure!(|_: Option, write_total: i64| { if write_total == -1 { i18n("N/A") } else { convert_storage(write_total as f64, false) } })) .bind(&row, "text", Widget::NONE); this.add_gestures(item); } )); write_total_col_factory.connect_teardown(move |_factory, item| { let item = item.downcast_ref::().unwrap(); item.set_child(None::<>k::Inscription>); }); let write_total_col_sorter = NumericSorter::builder() .sort_order(SortType::Ascending) .expression(gtk::PropertyExpression::new( ProcessEntry::static_type(), None::<>k::Expression>, "write_total", )) .build(); write_total_col.set_sorter(Some(&write_total_col_sorter)); write_total_col.set_visible(SETTINGS.processes_show_drive_write_total()); column_view.append_column(&write_total_col); SETTINGS.connect_processes_show_drive_write_total(clone!( #[weak] write_total_col, move |visible| { write_total_col.set_visible(visible); } )); write_total_col } fn add_gpu_column(&self, column_view: &ColumnView) -> ColumnViewColumn { let gpu_col_factory = gtk::SignalListItemFactory::new(); let gpu_col = gtk::ColumnViewColumn::new(Some(&i18n("GPU")), Some(gpu_col_factory.clone())); gpu_col.set_resizable(true); gpu_col_factory.connect_setup(clone!( #[weak(rename_to = this)] self, move |_factory, item| { let item = item.downcast_ref::().unwrap(); let row = gtk::Inscription::new(None); row.set_min_chars(7); row.set_xalign(1.0); item.set_child(Some(&row)); item.property_expression("item") .chain_property::("gpu_usage") .chain_closure::(closure!(|_: Option, gpu_usage: f32| { format!("{:.1} %", gpu_usage * 100.0) })) .bind(&row, "text", Widget::NONE); this.add_gestures(item); } )); gpu_col_factory.connect_teardown(move |_factory, item| { let item = item.downcast_ref::().unwrap(); item.set_child(None::<>k::Inscription>); }); let gpu_col_sorter = NumericSorter::builder() .sort_order(SortType::Ascending) .expression(gtk::PropertyExpression::new( ProcessEntry::static_type(), None::<>k::Expression>, "gpu_usage", )) .build(); gpu_col.set_sorter(Some(&gpu_col_sorter)); gpu_col.set_visible(SETTINGS.processes_show_gpu()); column_view.append_column(&gpu_col); SETTINGS.connect_processes_show_gpu(clone!( #[weak] gpu_col, move |visible| gpu_col.set_visible(visible) )); gpu_col } fn add_encoder_column(&self, column_view: &ColumnView) -> ColumnViewColumn { let encoder_col_factory = gtk::SignalListItemFactory::new(); let encoder_col = gtk::ColumnViewColumn::new( Some(&i18n("Video Encoder")), Some(encoder_col_factory.clone()), ); encoder_col.set_resizable(true); encoder_col_factory.connect_setup(clone!( #[weak(rename_to = this)] self, move |_factory, item| { let item = item.downcast_ref::().unwrap(); let row = gtk::Inscription::new(None); row.set_min_chars(7); row.set_xalign(1.0); item.set_child(Some(&row)); item.property_expression("item") .chain_property::("enc_usage") .chain_closure::(closure!(|_: Option, enc_usage: f32| { format!("{:.1} %", enc_usage * 100.0) })) .bind(&row, "text", Widget::NONE); this.add_gestures(item); } )); encoder_col_factory.connect_teardown(move |_factory, item| { let item = item.downcast_ref::().unwrap(); item.set_child(None::<>k::Inscription>); }); let encoder_col_sorter = NumericSorter::builder() .sort_order(SortType::Ascending) .expression(gtk::PropertyExpression::new( ProcessEntry::static_type(), None::<>k::Expression>, "enc_usage", )) .build(); encoder_col.set_sorter(Some(&encoder_col_sorter)); encoder_col.set_visible(SETTINGS.processes_show_encoder()); column_view.append_column(&encoder_col); SETTINGS.connect_processes_show_encoder(clone!( #[weak] encoder_col, move |visible| encoder_col.set_visible(visible) )); encoder_col } fn add_decoder_column(&self, column_view: &ColumnView) -> ColumnViewColumn { let decoder_col_factory = gtk::SignalListItemFactory::new(); let decoder_col = gtk::ColumnViewColumn::new( Some(&i18n("Video Decoder")), Some(decoder_col_factory.clone()), ); decoder_col.set_resizable(true); decoder_col_factory.connect_setup(clone!( #[weak(rename_to = this)] self, move |_factory, item| { let item = item.downcast_ref::().unwrap(); let row = gtk::Inscription::new(None); row.set_min_chars(7); row.set_xalign(1.0); item.set_child(Some(&row)); item.property_expression("item") .chain_property::("dec_usage") .chain_closure::(closure!(|_: Option, dec_usage: f32| { format!("{:.1} %", dec_usage * 100.0) })) .bind(&row, "text", Widget::NONE); this.add_gestures(item); } )); decoder_col_factory.connect_teardown(move |_factory, item| { let item = item.downcast_ref::().unwrap(); item.set_child(None::<>k::Inscription>); }); let decoder_col_sorter = NumericSorter::builder() .sort_order(SortType::Ascending) .expression(gtk::PropertyExpression::new( ProcessEntry::static_type(), None::<>k::Expression>, "dec_usage", )) .build(); decoder_col.set_sorter(Some(&decoder_col_sorter)); decoder_col.set_visible(SETTINGS.processes_show_decoder()); column_view.append_column(&decoder_col); SETTINGS.connect_processes_show_decoder(clone!( #[weak] decoder_col, move |visible| decoder_col.set_visible(visible) )); decoder_col } fn add_gpu_mem_column(&self, column_view: &ColumnView) -> ColumnViewColumn { let gpu_mem_col_factory = gtk::SignalListItemFactory::new(); let gpu_mem_col = gtk::ColumnViewColumn::new( Some(&i18n("Video Memory")), Some(gpu_mem_col_factory.clone()), ); gpu_mem_col.set_resizable(true); gpu_mem_col_factory.connect_setup(clone!( #[weak(rename_to = this)] self, move |_factory, item| { let item = item.downcast_ref::().unwrap(); let row = gtk::Inscription::new(None); row.set_min_chars(9); row.set_xalign(1.0); item.set_child(Some(&row)); item.property_expression("item") .chain_property::("gpu_mem_usage") .chain_closure::(closure!(|_: Option, gpu_mem: u64| { convert_storage(gpu_mem as f64, false) })) .bind(&row, "text", Widget::NONE); this.add_gestures(item); } )); gpu_mem_col_factory.connect_teardown(move |_factory, item| { let item = item.downcast_ref::().unwrap(); item.set_child(None::<>k::Inscription>); }); let gpu_mem_col_sorter = NumericSorter::builder() .sort_order(SortType::Ascending) .expression(gtk::PropertyExpression::new( ProcessEntry::static_type(), None::<>k::Expression>, "gpu_mem_usage", )) .build(); gpu_mem_col.set_sorter(Some(&gpu_mem_col_sorter)); gpu_mem_col.set_visible(SETTINGS.processes_show_gpu_memory()); column_view.append_column(&gpu_mem_col); SETTINGS.connect_processes_show_gpu_memory(clone!( #[weak] gpu_mem_col, move |visible| gpu_mem_col.set_visible(visible) )); gpu_mem_col } fn add_total_cpu_time_column(&self, column_view: &ColumnView) -> ColumnViewColumn { let total_cpu_time_col_factory = gtk::SignalListItemFactory::new(); let total_cpu_time_col = gtk::ColumnViewColumn::new( Some(&i18n("Total CPU Time")), Some(total_cpu_time_col_factory.clone()), ); total_cpu_time_col.set_resizable(true); total_cpu_time_col_factory.connect_setup(clone!( #[weak(rename_to = this)] self, move |_factory, item| { let item = item.downcast_ref::().unwrap(); let row = gtk::Inscription::new(None); row.set_min_chars(9); item.set_child(Some(&row)); item.property_expression("item") .chain_property::("total_cpu_time") .chain_closure::(closure!(|_: Option, total_cpu_time: f64| { format_time(total_cpu_time) })) .bind(&row, "text", Widget::NONE); this.add_gestures(item); } )); total_cpu_time_col_factory.connect_teardown(move |_factory, item| { let item = item.downcast_ref::().unwrap(); item.set_child(None::<>k::Inscription>); }); let total_cpu_time_col_sorter = NumericSorter::builder() .sort_order(SortType::Ascending) .expression(gtk::PropertyExpression::new( ProcessEntry::static_type(), None::<>k::Expression>, "total_cpu_time", )) .build(); total_cpu_time_col.set_sorter(Some(&total_cpu_time_col_sorter)); total_cpu_time_col.set_visible(SETTINGS.processes_show_total_cpu_time()); column_view.append_column(&total_cpu_time_col); SETTINGS.connect_processes_show_total_cpu_time(clone!( #[weak] total_cpu_time_col, move |visible| total_cpu_time_col.set_visible(visible) )); total_cpu_time_col } fn add_user_cpu_time_column(&self, column_view: &ColumnView) -> ColumnViewColumn { let user_cpu_time_col_factory = gtk::SignalListItemFactory::new(); let user_cpu_time_col = gtk::ColumnViewColumn::new( Some(&i18n("User CPU Time")), Some(user_cpu_time_col_factory.clone()), ); user_cpu_time_col.set_resizable(true); user_cpu_time_col_factory.connect_setup(clone!( #[weak(rename_to = this)] self, move |_factory, item| { let item = item.downcast_ref::().unwrap(); let row = gtk::Inscription::new(None); row.set_min_chars(9); item.set_child(Some(&row)); item.property_expression("item") .chain_property::("user_cpu_time") .chain_closure::(closure!(|_: Option, user_cpu_time: f64| { format_time(user_cpu_time) })) .bind(&row, "text", Widget::NONE); this.add_gestures(item); } )); user_cpu_time_col_factory.connect_teardown(move |_factory, item| { let item = item.downcast_ref::().unwrap(); item.set_child(None::<>k::Inscription>); }); let user_cpu_time_col_sorter = NumericSorter::builder() .sort_order(SortType::Ascending) .expression(gtk::PropertyExpression::new( ProcessEntry::static_type(), None::<>k::Expression>, "user_cpu_time", )) .build(); user_cpu_time_col.set_sorter(Some(&user_cpu_time_col_sorter)); user_cpu_time_col.set_visible(SETTINGS.processes_show_user_cpu_time()); column_view.append_column(&user_cpu_time_col); SETTINGS.connect_processes_show_user_cpu_time(clone!( #[weak] user_cpu_time_col, move |visible| user_cpu_time_col.set_visible(visible) )); user_cpu_time_col } fn add_system_cpu_time_column(&self, column_view: &ColumnView) -> ColumnViewColumn { let system_cpu_time_col_factory = gtk::SignalListItemFactory::new(); let system_cpu_time_col = gtk::ColumnViewColumn::new( Some(&i18n("System CPU Time")), Some(system_cpu_time_col_factory.clone()), ); system_cpu_time_col.set_resizable(true); system_cpu_time_col_factory.connect_setup(clone!( #[weak(rename_to = this)] self, move |_factory, item| { let item = item.downcast_ref::().unwrap(); let row = gtk::Inscription::new(None); row.set_min_chars(9); item.set_child(Some(&row)); item.property_expression("item") .chain_property::("system_cpu_time") .chain_closure::(closure!(|_: Option, system_cpu_time: f64| { format_time(system_cpu_time) })) .bind(&row, "text", Widget::NONE); this.add_gestures(item); } )); system_cpu_time_col_factory.connect_teardown(move |_factory, item| { let item = item.downcast_ref::().unwrap(); item.set_child(None::<>k::Inscription>); }); let system_cpu_time_col_sorter = NumericSorter::builder() .sort_order(SortType::Ascending) .expression(gtk::PropertyExpression::new( ProcessEntry::static_type(), None::<>k::Expression>, "system_cpu_time", )) .build(); system_cpu_time_col.set_sorter(Some(&system_cpu_time_col_sorter)); system_cpu_time_col.set_visible(SETTINGS.processes_show_system_cpu_time()); column_view.append_column(&system_cpu_time_col); SETTINGS.connect_processes_show_system_cpu_time(clone!( #[weak] system_cpu_time_col, move |visible| system_cpu_time_col.set_visible(visible) )); system_cpu_time_col } fn add_priority_column(&self, column_view: &ColumnView) -> ColumnViewColumn { let priority_col_factory = gtk::SignalListItemFactory::new(); let priority_col = gtk::ColumnViewColumn::new(Some(&i18n("Priority")), Some(priority_col_factory.clone())); priority_col.set_resizable(true); priority_col_factory.connect_setup(clone!( #[weak(rename_to = this)] self, move |_factory, item| { let item = item.downcast_ref::().unwrap(); let row = gtk::Inscription::new(None); row.set_min_chars(*LONGEST_PRIORITY_LABEL); item.set_child(Some(&row)); item.property_expression("item") .chain_property::("niceness") .chain_closure::(closure!(|_: Option, niceness: i8| { if SETTINGS.detailed_priority() { niceness.to_string() } else if let Ok(niceness) = Niceness::try_from(niceness) { NICE_TO_LABEL .get(&niceness) .map(|(s, _)| s) .cloned() .unwrap_or_else(|| i18n("N/A")) } else { i18n("N/A") } })) .bind(&row, "text", Widget::NONE); this.add_gestures(item); } )); priority_col_factory.connect_teardown(move |_factory, item| { let item = item.downcast_ref::().unwrap(); item.set_child(None::<>k::Inscription>); }); let priority_col_sorter = NumericSorter::builder() .sort_order(SortType::Ascending) .expression(gtk::PropertyExpression::new( ProcessEntry::static_type(), None::<>k::Expression>, "niceness", )) .build(); priority_col.set_sorter(Some(&priority_col_sorter)); priority_col.set_visible(SETTINGS.processes_show_priority()); column_view.append_column(&priority_col); SETTINGS.connect_processes_show_priority(clone!( #[weak] priority_col, move |visible| priority_col.set_visible(visible) )); priority_col } fn add_swap_column(&self, column_view: &ColumnView) -> ColumnViewColumn { let swap_col_factory = gtk::SignalListItemFactory::new(); let swap_col = gtk::ColumnViewColumn::new(Some(&i18n("Swap")), Some(swap_col_factory.clone())); swap_col.set_resizable(true); swap_col_factory.connect_setup(clone!( #[weak(rename_to = this)] self, move |_factory, item| { let item = item.downcast_ref::().unwrap(); let row = gtk::Inscription::new(None); row.set_min_chars(9); row.set_xalign(1.0); item.set_child(Some(&row)); item.property_expression("item") .chain_property::("swap_usage") .chain_closure::(closure!(|_: Option, swap_usage: u64| { convert_storage(swap_usage as f64, false) })) .bind(&row, "text", Widget::NONE); this.add_gestures(item); } )); swap_col_factory.connect_teardown(move |_factory, item| { let item = item.downcast_ref::().unwrap(); item.set_child(None::<>k::Inscription>); }); let swap_col_sorter = NumericSorter::builder() .sort_order(SortType::Ascending) .expression(gtk::PropertyExpression::new( ProcessEntry::static_type(), None::<>k::Expression>, "swap_usage", )) .build(); swap_col.set_sorter(Some(&swap_col_sorter)); swap_col.set_visible(SETTINGS.processes_show_swap()); column_view.append_column(&swap_col); SETTINGS.connect_processes_show_swap(clone!( #[weak] swap_col, move |visible| swap_col.set_visible(visible) )); swap_col } fn add_combined_memory_column(&self, column_view: &ColumnView) -> ColumnViewColumn { let combined_memory_col_factory = gtk::SignalListItemFactory::new(); let combined_memory_col = gtk::ColumnViewColumn::new( Some(&i18n("Combined Memory")), Some(combined_memory_col_factory.clone()), ); combined_memory_col.set_resizable(true); combined_memory_col_factory.connect_setup(clone!( #[weak(rename_to = this)] self, move |_factory, item| { let item = item.downcast_ref::().unwrap(); let row = gtk::Inscription::new(None); row.set_min_chars(9); row.set_xalign(1.0); item.set_child(Some(&row)); item.property_expression("item") .chain_property::("combined_memory_usage") .chain_closure::(closure!(|_: Option, swap_usage: u64| { convert_storage(swap_usage as f64, false) })) .bind(&row, "text", Widget::NONE); this.add_gestures(item); } )); combined_memory_col_factory.connect_teardown(move |_factory, item| { let item = item.downcast_ref::().unwrap(); item.set_child(None::<>k::Inscription>); }); let combined_memory_col_sorter = NumericSorter::builder() .sort_order(SortType::Ascending) .expression(gtk::PropertyExpression::new( ProcessEntry::static_type(), None::<>k::Expression>, "combined_memory_usage", )) .build(); combined_memory_col.set_sorter(Some(&combined_memory_col_sorter)); combined_memory_col.set_visible(SETTINGS.processes_show_combined_memory()); column_view.append_column(&combined_memory_col); SETTINGS.connect_processes_show_combined_memory(clone!( #[weak] combined_memory_col, move |visible| combined_memory_col.set_visible(visible) )); combined_memory_col } fn add_commandline_column(&self, column_view: &ColumnView) -> ColumnViewColumn { let commandline_col_factory = gtk::SignalListItemFactory::new(); let commandline_col = gtk::ColumnViewColumn::new( Some(&i18n("Commandline")), Some(commandline_col_factory.clone()), ); commandline_col.set_resizable(true); commandline_col_factory.connect_setup(clone!( #[weak(rename_to = this)] self, move |_factory, item| { let item = item.downcast_ref::().unwrap(); let row = gtk::Inscription::new(None); row.set_min_chars(32); item.set_child(Some(&row)); item.property_expression("item") .chain_property::("commandline") .bind(&row, "text", Widget::NONE); this.add_gestures(item); } )); commandline_col_factory.connect_teardown(move |_factory, item| { let item = item.downcast_ref::().unwrap(); item.set_child(None::<>k::Inscription>); }); let commandline_col_sorter = StringSorter::builder() .ignore_case(true) .expression(gtk::PropertyExpression::new( ProcessEntry::static_type(), None::<>k::Expression>, "commandline", )) .build(); commandline_col.set_sorter(Some(&commandline_col_sorter)); commandline_col.set_visible(SETTINGS.processes_show_commandline()); column_view.append_column(&commandline_col); SETTINGS.connect_processes_show_commandline(clone!( #[weak] commandline_col, move |visible| commandline_col.set_visible(visible) )); commandline_col } } fn get_action_name(action: ProcessAction, name: &str) -> String { match action { ProcessAction::TERM => i18n_f("End {}?", &[name]), ProcessAction::STOP => i18n_f("Halt {}?", &[name]), ProcessAction::KILL => i18n_f("Kill {}?", &[name]), ProcessAction::CONT => i18n_f("Continue {}?", &[name]), } } fn get_action_name_multiple(action: ProcessAction, count: usize) -> String { match action { ProcessAction::TERM => ni18n_f( "End process?", "End {} processes?", count as u32, &[&count.to_string()], ), ProcessAction::STOP => ni18n_f( "Halt process?", "Halt {} processes?", count as u32, &[&count.to_string()], ), ProcessAction::KILL => ni18n_f( "Kill process?", "Kill {} processes?", count as u32, &[&count.to_string()], ), ProcessAction::CONT => ni18n_f( "Kill process?", "Kill {} processes?", count as u32, &[&count.to_string()], ), } } fn get_action_warning(action: ProcessAction) -> String { match action { ProcessAction::TERM => i18n("Unsaved work might be lost."), ProcessAction::STOP => i18n( "Halting a process can come with serious risks such as losing data and security implications. Use with caution.", ), ProcessAction::KILL => i18n( "Killing a process can come with serious risks such as losing data and security implications. Use with caution.", ), ProcessAction::CONT => String::new(), } } fn get_action_description(action: ProcessAction) -> String { match action { ProcessAction::TERM => i18n("End Process"), ProcessAction::STOP => i18n("Halt Process"), ProcessAction::KILL => i18n("Kill Process"), ProcessAction::CONT => i18n("Continue Process"), } } resources-1.9.1/src/ui/pages/processes/process_entry.rs000066400000000000000000000215161510634446000233220ustar00rootroot00000000000000use gtk::{ glib::{self, GString}, subclass::prelude::ObjectSubclassIsExt, }; use log::trace; use process_data::Containerization; use crate::{ i18n::i18n, utils::{TICK_RATE, process::Process}, }; mod imp { use std::cell::{Cell, RefCell}; use gtk::{ gio::{Icon, ThemedIcon}, glib::{ParamSpec, Properties, Value}, prelude::{Cast, ObjectExt}, subclass::prelude::{DerivedObjectProperties, ObjectImpl, ObjectImplExt, ObjectSubclass}, }; use super::*; #[derive(Properties)] #[properties(wrapper_type = super::ProcessEntry)] pub struct ProcessEntry { #[property(get = Self::name, set = Self::set_name, type = glib::GString)] name: Cell, #[property(get = Self::commandline, set = Self::set_commandline, type = glib::GString)] commandline: Cell, #[property(get = Self::user, set = Self::set_user, type = glib::GString)] user: Cell, #[property(get = Self::icon, set = Self::set_icon, type = Icon)] icon: Cell, #[property(get, set)] pid: Cell, #[property(get, set)] cpu_usage: Cell, #[property(get, set)] memory_usage: Cell, #[property(get, set)] swap_usage: Cell, #[property(get, set)] combined_memory_usage: Cell, #[property(get, set)] read_speed: Cell, // will be -1.0 if read data is not available #[property(get, set)] read_total: Cell, // will be -1 if read data is not available #[property(get, set)] write_speed: Cell, // will be -1.0 if write data is not available #[property(get, set)] write_total: Cell, // will be -1 if write data is not available #[property(get, set)] gpu_usage: Cell, #[property(get, set)] enc_usage: Cell, #[property(get, set)] dec_usage: Cell, #[property(get, set)] gpu_mem_usage: Cell, #[property(get, set)] total_cpu_time: Cell, #[property(get, set)] user_cpu_time: Cell, #[property(get, set)] system_cpu_time: Cell, #[property(get, set)] niceness: Cell, #[property(get = Self::cgroup, set = Self::set_cgroup)] cgroup: Cell>, #[property(get = Self::containerization, set = Self::set_containerization)] containerization: Cell, #[property(get = Self::running_since, set = Self::set_running_since)] running_since: Cell>, // TODO: Make this properly dynamic, don't use a variable that's never read #[property(get = Self::symbolic)] #[allow(dead_code)] symbolic: Cell, pub affinity: RefCell>, } impl Default for ProcessEntry { fn default() -> Self { Self { name: Cell::new(glib::GString::default()), commandline: Cell::new(glib::GString::default()), user: Cell::new(glib::GString::default()), icon: Cell::new(ThemedIcon::new("generic-process").into()), pid: Cell::new(0), cpu_usage: Cell::new(0.0), memory_usage: Cell::new(0), swap_usage: Cell::new(0), combined_memory_usage: Cell::new(0), read_speed: Cell::new(0.0), read_total: Cell::new(0), write_speed: Cell::new(0.0), write_total: Cell::new(0), gpu_usage: Cell::new(0.0), enc_usage: Cell::new(0.0), dec_usage: Cell::new(0.0), gpu_mem_usage: Cell::new(0), total_cpu_time: Cell::new(0.0), user_cpu_time: Cell::new(0.0), system_cpu_time: Cell::new(0.0), niceness: Cell::new(0), cgroup: Cell::new(None), containerization: Cell::new(glib::GString::default()), running_since: Cell::new(None), symbolic: Cell::new(false), affinity: Default::default(), } } } impl ProcessEntry { gstring_getter_setter!(user, commandline, name, containerization); gstring_option_getter_setter!(cgroup, running_since); pub fn icon(&self) -> Icon { let icon = self.icon.replace(ThemedIcon::new("generic-process").into()); self.icon.set(icon.clone()); icon } pub fn set_icon(&self, icon: &Icon) { self.icon.set(icon.clone()); } pub fn symbolic(&self) -> bool { let icon = self.icon.replace(ThemedIcon::new("generic-process").into()); self.icon.set(icon.clone()); icon.downcast_ref::() .is_some_and(|themed_icon| { themed_icon .names() .iter() .all(|name| name.ends_with("-symbolic")) || themed_icon .names() .iter() .all(|name| name.contains("system-processes")) || themed_icon .names() .iter() .all(|name| name.contains("generic-process")) }) } } #[glib::object_subclass] impl ObjectSubclass for ProcessEntry { const NAME: &'static str = "ProcessEntry"; type Type = super::ProcessEntry; } impl ObjectImpl for ProcessEntry { fn constructed(&self) { self.parent_constructed(); } fn properties() -> &'static [ParamSpec] { Self::derived_properties() } fn set_property(&self, id: usize, value: &Value, pspec: &ParamSpec) { self.derived_set_property(id, value, pspec); } fn property(&self, id: usize, pspec: &ParamSpec) -> Value { self.derived_property(id, pspec) } } } glib::wrapper! { pub struct ProcessEntry(ObjectSubclass); } impl ProcessEntry { pub fn new(process: &Process) -> Self { trace!("Creating ProcessEntry GObject ({})…", process.data.pid); let containerization = match process.data.containerization { Containerization::None => i18n("No"), Containerization::Flatpak => i18n("Yes (Flatpak)"), Containerization::Snap => i18n("Yes (Snap)"), }; let this: Self = glib::Object::builder() .property("name", &process.display_name) .property("commandline", process.data.commandline.replace('\0', " ")) .property("user", &process.data.user) .property("icon", &process.icon) .property("pid", process.data.pid) .property("cgroup", process.data.cgroup.clone().map(GString::from)) .property("containerization", containerization) .property("running_since", process.running_since().ok()) .build(); this.update(process); this } pub fn update(&self, process: &Process) { trace!("Refreshing ProcessEntry ({})…", process.data.pid); self.set_cpu_usage(process.cpu_time_ratio()); self.set_memory_usage(process.data.memory_usage as u64); self.set_swap_usage(process.data.swap_usage as u64); self.set_combined_memory_usage( process .data .memory_usage .saturating_add(process.data.swap_usage) as u64, ); self.set_read_speed(process.read_speed().unwrap_or(-1.0)); self.set_read_total( process .data .read_bytes .map_or(-1, |read_total| read_total as i64), ); self.set_write_speed(process.write_speed().unwrap_or(-1.0)); self.set_write_total( process .data .write_bytes .map_or(-1, |write_total| write_total as i64), ); self.set_gpu_usage(process.gpu_usage()); self.set_enc_usage(process.enc_usage()); self.set_dec_usage(process.dec_usage()); self.set_gpu_mem_usage(process.gpu_mem_usage()); self.set_user_cpu_time((process.data.user_cpu_time as f64) / (*TICK_RATE as f64)); self.set_system_cpu_time((process.data.system_cpu_time as f64) / (*TICK_RATE as f64)); self.set_total_cpu_time(self.user_cpu_time() + self.system_cpu_time()); self.set_niceness(*process.data.niceness); (*self.imp().affinity.borrow_mut()).clone_from(&process.data.affinity); } pub fn affinity(&self) -> Vec { self.imp().affinity.borrow().clone() } } resources-1.9.1/src/ui/pages/processes/process_name_cell.rs000066400000000000000000000112241510634446000240730ustar00rootroot00000000000000use adw::{glib::property::PropertySet, prelude::*, subclass::prelude::*}; use gtk::{gio::Icon, glib}; use log::trace; mod imp { use std::cell::{Cell, RefCell}; use super::*; use gtk::{ Box, CompositeTemplate, gio::ThemedIcon, glib::{ParamSpec, Properties, Value}, }; #[derive(CompositeTemplate, Properties)] #[template(resource = "/net/nokyan/Resources/ui/widgets/process_name_cell.ui")] #[properties(wrapper_type = super::ResProcessNameCell)] pub struct ResProcessNameCell { #[template_child] pub image: TemplateChild, #[template_child] pub inscription: TemplateChild, #[property(get = Self::name, set = Self::set_name, type = glib::GString)] name: Cell, #[property(get = Self::tooltip, set = Self::set_tooltip, type = glib::GString)] tooltip: Cell, #[property(get = Self::icon, set = Self::set_icon, type = Icon)] icon: RefCell, #[property(get, set = Self::set_symbolic)] symbolic: Cell, } impl Default for ResProcessNameCell { fn default() -> Self { Self { image: Default::default(), inscription: Default::default(), name: Default::default(), tooltip: Default::default(), icon: RefCell::new(ThemedIcon::new("generic-process").into()), symbolic: Default::default(), } } } impl ResProcessNameCell { pub fn name(&self) -> glib::GString { let name = self.name.take(); self.name.set(name.clone()); name } pub fn set_name(&self, name: &str) { self.name.set(glib::GString::from(name)); self.inscription.set_text(Some(name)); } pub fn tooltip(&self) -> glib::GString { let tooltip = self.tooltip.take(); self.tooltip.set(tooltip.clone()); tooltip } pub fn set_tooltip(&self, tooltip: &str) { self.tooltip.set(glib::GString::from(tooltip)); self.inscription.set_tooltip_text(Some(tooltip)); } pub fn icon(&self) -> Icon { let icon = self .icon .replace_with(|_| ThemedIcon::new("generic-process").into()); self.icon.set(icon.clone()); icon } pub fn set_icon(&self, icon: &Icon) { let current_icon = self .icon .replace_with(|_| ThemedIcon::new("generic-process").into()); if ¤t_icon == icon { self.icon.set(current_icon); return; } self.image.set_from_gicon(icon); self.icon.set(icon.clone()); } pub fn set_symbolic(&self, symbolic: bool) { self.symbolic.set(symbolic); if symbolic { self.image.set_css_classes(&[]); } else { self.image.set_css_classes(&["lowres-icon"]); } } } #[glib::object_subclass] impl ObjectSubclass for ResProcessNameCell { const NAME: &'static str = "ResProcessNameCell"; type Type = super::ResProcessNameCell; type ParentType = Box; fn class_init(klass: &mut Self::Class) { Self::bind_template(klass); } // You must call `Widget`'s `init_template()` within `instance_init()`. fn instance_init(obj: &glib::subclass::InitializingObject) { obj.init_template(); } } impl ObjectImpl for ResProcessNameCell { fn constructed(&self) { self.parent_constructed(); } fn properties() -> &'static [ParamSpec] { Self::derived_properties() } fn set_property(&self, id: usize, value: &Value, pspec: &ParamSpec) { self.derived_set_property(id, value, pspec); } fn property(&self, id: usize, pspec: &ParamSpec) -> Value { self.derived_property(id, pspec) } } impl WidgetImpl for ResProcessNameCell {} impl BoxImpl for ResProcessNameCell {} } glib::wrapper! { pub struct ResProcessNameCell(ObjectSubclass) @extends gtk::Widget, gtk::Box, @implements gtk::Buildable, gtk::ConstraintTarget, gtk::Accessible; } impl Default for ResProcessNameCell { fn default() -> Self { Self::new() } } impl ResProcessNameCell { pub fn new() -> Self { trace!("Creating ResProcessNameCell GObject…"); glib::Object::new::() } } resources-1.9.1/src/ui/widgets/000077500000000000000000000000001510634446000164115ustar00rootroot00000000000000resources-1.9.1/src/ui/widgets/double_graph_box.rs000066400000000000000000000067251510634446000222740ustar00rootroot00000000000000use adw::{prelude::*, subclass::prelude::*}; use gtk::glib; use log::trace; use crate::config::PROFILE; use super::graph::ResGraph; mod imp { use crate::ui::widgets::graph::ResGraph; use super::*; use gtk::CompositeTemplate; #[derive(Debug, CompositeTemplate, Default)] #[template(resource = "/net/nokyan/Resources/ui/widgets/double_graph_box.ui")] pub struct ResDoubleGraphBox { #[template_child] pub start_graph: TemplateChild, #[template_child] pub start_title_label: TemplateChild, #[template_child] pub start_info_label: TemplateChild, #[template_child] pub end_graph: TemplateChild, #[template_child] pub end_title_label: TemplateChild, #[template_child] pub end_info_label: TemplateChild, } #[glib::object_subclass] impl ObjectSubclass for ResDoubleGraphBox { const NAME: &'static str = "ResDoubleGraphBox"; type Type = super::ResDoubleGraphBox; type ParentType = adw::PreferencesRow; fn class_init(klass: &mut Self::Class) { Self::bind_template(klass); } // You must call `Widget`'s `init_template()` within `instance_init()`. fn instance_init(obj: &glib::subclass::InitializingObject) { obj.init_template(); } } impl ObjectImpl for ResDoubleGraphBox { fn constructed(&self) { self.parent_constructed(); let obj = self.obj(); // Devel Profile if PROFILE == "Devel" { obj.add_css_class("devel"); } } } impl WidgetImpl for ResDoubleGraphBox {} impl ListBoxRowImpl for ResDoubleGraphBox {} impl PreferencesRowImpl for ResDoubleGraphBox {} } glib::wrapper! { pub struct ResDoubleGraphBox(ObjectSubclass) @extends gtk::Widget, gtk::ListBoxRow, adw::PreferencesRow, @implements gtk::Buildable, gtk::ConstraintTarget, gtk::Accessible, gtk::Actionable; } impl Default for ResDoubleGraphBox { fn default() -> Self { Self::new() } } impl ResDoubleGraphBox { pub fn new() -> Self { trace!("Creating ResDoubleGraphBox GObject…"); glib::Object::new::() } pub fn set_graphs_visible(&self, visible: bool) { let imp = self.imp(); imp.start_graph.set_visible(visible); imp.end_graph.set_visible(visible); } pub fn start_graph(&self) -> ResGraph { self.imp().start_graph.get() } pub fn set_start_title_label(&self, str: &str) { let imp = self.imp(); imp.start_title_label.set_label(str); } pub fn set_start_subtitle(&self, str: &str) { let imp = self.imp(); imp.start_info_label.set_label(str); } pub fn set_start_tooltip(&self, str: Option<&str>) { let imp = self.imp(); imp.start_info_label.set_tooltip_text(str); } pub fn end_graph(&self) -> ResGraph { self.imp().end_graph.get() } pub fn set_end_title_label(&self, str: &str) { let imp = self.imp(); imp.end_title_label.set_label(str); } pub fn set_end_subtitle(&self, str: &str) { let imp = self.imp(); imp.end_info_label.set_label(str); } pub fn set_end_tooltip(&self, str: Option<&str>) { let imp = self.imp(); imp.end_info_label.set_tooltip_text(str); } } resources-1.9.1/src/ui/widgets/graph.rs000066400000000000000000000145571510634446000200740ustar00rootroot00000000000000use adw::prelude::WidgetExt; use gtk::glib::{self}; use gtk::prelude::GtkWindowExt; use gtk::subclass::prelude::*; use log::trace; use plotters::style::RGBColor; use std::f64; use crate::application::Application; use crate::utils::settings::SETTINGS; const MAX_DATA_POINTS: u32 = 600; mod imp { use std::{ cell::{Cell, RefCell}, collections::VecDeque, error::Error, }; use adw::prelude::SnapshotExt; use adw::prelude::WidgetExt; use gtk::{ glib, subclass::{ prelude::{ObjectImpl, ObjectSubclass, ObjectSubclassExt}, widget::WidgetImpl, }, }; use plotters::{ prelude::*, series::AreaSeries, style::{Color, RGBColor}, }; use plotters_cairo::CairoBackend; use crate::utils::settings::SETTINGS; use super::MAX_DATA_POINTS; #[derive(Debug)] pub struct ResGraph { pub data_points: RefCell>, pub max_y: Cell>, pub graph_color: Cell, } impl Default for ResGraph { fn default() -> Self { let mut empty_deque = VecDeque::with_capacity(MAX_DATA_POINTS as usize); for _ in 0..MAX_DATA_POINTS { empty_deque.push_back(0.0); } Self { data_points: RefCell::new(empty_deque), max_y: Cell::new(Some(1.0)), graph_color: Cell::default(), } } } #[glib::object_subclass] impl ObjectSubclass for ResGraph { const NAME: &'static str = "ResGraph"; type Type = super::ResGraph; type ParentType = gtk::Widget; } impl ObjectImpl for ResGraph {} impl WidgetImpl for ResGraph { fn snapshot(&self, snapshot: >k::Snapshot) { let width = self.obj().width() as u32; let height = self.obj().height() as u32; if width == 0 || height == 0 { return; } let bounds = gtk::graphene::Rect::new(0.0, 0.0, width as f32, height as f32); let cr: gtk::cairo::Context = snapshot.append_cairo(&bounds); let backend = CairoBackend::new(&cr, (width, height)).unwrap(); self.plot_graph(backend).unwrap(); } } impl ResGraph { pub fn plot_graph<'a, DB>(&self, backend: DB) -> Result<(), Box> where DB: DrawingBackend + 'a, { let data_points = self.data_points.borrow(); let color = self.graph_color.get(); let start_point = (MAX_DATA_POINTS.saturating_sub(SETTINGS.graph_data_points())) as usize; let root = backend.into_drawing_area(); root.fill(&self.graph_color.get().mix(0.1))?; let y_max = self.max_y.get().unwrap_or_else(|| { let max = *data_points .range(start_point..(MAX_DATA_POINTS as usize)) .max_by(|x, y| x.total_cmp(y)) .unwrap_or(&0.0); if max == 0.0 { f64::EPSILON } else { max } }); let mut chart = ChartBuilder::on(&root).build_cartesian_2d( 0f64..(f64::from(SETTINGS.graph_data_points()) - 1.0), 0f64..y_max, )?; if SETTINGS.show_graph_grids() { chart .configure_mesh() .disable_axes() .max_light_lines(0) .bold_line_style(color.mix(0.4)) .draw()?; } chart.draw_series( AreaSeries::new( (0..) .zip(data_points.range(start_point..(MAX_DATA_POINTS as usize))) .map(|(x, y)| (f64::from(x), *y)), 0.0, color.mix(0.4), ) .border_style(color), )?; root.present()?; Ok(()) } } } glib::wrapper! { pub struct ResGraph(ObjectSubclass) @extends gtk::Widget, @implements gtk::Buildable, gtk::ConstraintTarget, gtk::Accessible; } impl Default for ResGraph { fn default() -> Self { Self::new() } } impl ResGraph { pub fn new() -> Self { trace!("Creating ResGraph GObject…"); glib::Object::new::() } pub fn set_graph_color(&self, r: u8, g: u8, b: u8) { let imp = self.imp(); imp.graph_color.set(RGBColor(r, g, b)); self.queue_draw_if_not_suspended(); } pub fn set_locked_max_y(&self, y_max: Option) { let imp = self.imp(); imp.max_y.set(y_max); self.queue_draw_if_not_suspended(); } pub fn get_highest_value(&self) -> f64 { let imp = self.imp(); let start_point = (MAX_DATA_POINTS.saturating_sub(SETTINGS.graph_data_points())) as usize; *imp.data_points .borrow() .range(start_point..(MAX_DATA_POINTS as usize)) .max_by(|x, y| x.total_cmp(y)) .unwrap_or(&0.0) } pub fn push_data_point(&self, data: f64) { let imp = self.imp(); let mut data_points = imp.data_points.borrow_mut(); if data_points.len() >= MAX_DATA_POINTS as usize { data_points.pop_front(); } data_points.push_back(data); self.queue_draw_if_not_suspended(); } pub fn data_points(&self) -> Vec { self.imp().data_points.borrow().iter().copied().collect() } pub fn push_data_points(&self, data: &[f64]) { let imp = self.imp(); let mut data_points = imp.data_points.borrow_mut(); for data_point in data { if data_points.len() >= MAX_DATA_POINTS as usize { data_points.pop_front(); } data_points.push_back(*data_point); } self.queue_draw_if_not_suspended(); } pub fn clear_data_points(&self) { self.imp().data_points.borrow_mut().clear(); } pub fn queue_draw_if_not_suspended(&self) { if Application::try_default() .and_then(|app| app.try_main_window()) .map(|main_window| main_window.is_suspended()) .unwrap_or_default() { trace!("Graph refresh skipped due to app being suspended"); } else { self.imp().obj().queue_draw(); } } } resources-1.9.1/src/ui/widgets/graph_box.rs000066400000000000000000000046661510634446000207440ustar00rootroot00000000000000use adw::{prelude::*, subclass::prelude::*}; use gtk::glib; use log::trace; use crate::config::PROFILE; use super::graph::ResGraph; mod imp { use crate::ui::widgets::graph::ResGraph; use super::*; use gtk::CompositeTemplate; #[derive(Debug, CompositeTemplate, Default)] #[template(resource = "/net/nokyan/Resources/ui/widgets/graph_box.ui")] pub struct ResGraphBox { #[template_child] pub graph: TemplateChild, #[template_child] pub title_label: TemplateChild, #[template_child] pub info_label: TemplateChild, } #[glib::object_subclass] impl ObjectSubclass for ResGraphBox { const NAME: &'static str = "ResGraphBox"; type Type = super::ResGraphBox; type ParentType = adw::PreferencesRow; fn class_init(klass: &mut Self::Class) { Self::bind_template(klass); } // You must call `Widget`'s `init_template()` within `instance_init()`. fn instance_init(obj: &glib::subclass::InitializingObject) { obj.init_template(); } } impl ObjectImpl for ResGraphBox { fn constructed(&self) { self.parent_constructed(); let obj = self.obj(); // Devel Profile if PROFILE == "Devel" { obj.add_css_class("devel"); } } } impl WidgetImpl for ResGraphBox {} impl ListBoxRowImpl for ResGraphBox {} impl PreferencesRowImpl for ResGraphBox {} } glib::wrapper! { pub struct ResGraphBox(ObjectSubclass) @extends gtk::Widget, gtk::ListBoxRow, adw::PreferencesRow, @implements gtk::Buildable, gtk::ConstraintTarget, gtk::Accessible, gtk::Actionable; } impl Default for ResGraphBox { fn default() -> Self { Self::new() } } impl ResGraphBox { pub fn new() -> Self { trace!("Creating ResGraphBox GObject…"); glib::Object::new::() } pub fn graph(&self) -> ResGraph { self.imp().graph.get() } pub fn set_title_label(&self, str: &str) { let imp = self.imp(); imp.title_label.set_label(str); } pub fn set_subtitle(&self, str: &str) { let imp = self.imp(); imp.info_label.set_label(str); } pub fn set_tooltip(&self, str: Option<&str>) { let imp = self.imp(); imp.info_label.set_tooltip_text(str); } } resources-1.9.1/src/ui/widgets/mod.rs000066400000000000000000000001571510634446000175410ustar00rootroot00000000000000pub mod double_graph_box; pub mod graph; pub mod graph_box; pub mod stack_sidebar; pub mod stack_sidebar_item; resources-1.9.1/src/ui/widgets/stack_sidebar.rs000066400000000000000000000242371510634446000215650ustar00rootroot00000000000000use std::rc::Rc; use adw::{prelude::*, subclass::prelude::*}; use gtk::{ Ordering, glib::{self, GString, clone}, }; use log::trace; use std::collections::HashMap; use crate::utils::settings::{SETTINGS, SidebarMeterType}; use super::stack_sidebar_item::ResStackSidebarItem; mod imp { use std::{ cell::{Cell, RefCell}, collections::HashMap, rc::Rc, }; use super::*; use gtk::{CompositeTemplate, SingleSelection, gio}; #[derive(CompositeTemplate)] #[template(resource = "/net/nokyan/Resources/ui/widgets/stack_sidebar.ui")] pub struct ResStackSidebar { #[template_child] pub list_box: TemplateChild, pub stack: RefCell>, pub pages: RefCell>, pub rows: RefCell>, pub populating: Cell, } impl Default for ResStackSidebar { fn default() -> Self { Self { list_box: Default::default(), stack: Default::default(), pages: RefCell::new(Rc::new(SingleSelection::new(None::).into())), rows: Default::default(), populating: Default::default(), } } } #[glib::object_subclass] impl ObjectSubclass for ResStackSidebar { const NAME: &'static str = "ResStackSidebar"; type Type = super::ResStackSidebar; type ParentType = adw::Bin; fn class_init(klass: &mut Self::Class) { Self::bind_template(klass); } // You must call `Widget`'s `init_template()` within `instance_init()`. fn instance_init(obj: &glib::subclass::InitializingObject) { obj.init_template(); } } impl ObjectImpl for ResStackSidebar { fn constructed(&self) { self.parent_constructed(); } } impl WidgetImpl for ResStackSidebar {} impl BinImpl for ResStackSidebar {} } glib::wrapper! { pub struct ResStackSidebar(ObjectSubclass) @extends gtk::Widget, adw::Bin, adw::PreferencesRow, @implements gtk::Buildable, gtk::ConstraintTarget, gtk::Accessible; } impl Default for ResStackSidebar { fn default() -> Self { Self::new() } } impl ResStackSidebar { pub fn new() -> Self { trace!("Creating ResStackSidebar GObject…"); glib::Object::new::() } pub fn stack(&self) -> Rc { self.imp().stack.borrow().clone() } fn clear(&self) -> HashMap> { let imp = self.imp(); let mut return_map = HashMap::with_capacity(imp.rows.borrow().len()); for item in imp.rows.borrow().keys() { let child = item.child().and_downcast::(); if let Some(child) = child { return_map.insert(child.property("tab_id"), child.graph().data_points()); } imp.list_box.remove(item); } imp.rows.borrow_mut().clear(); return_map.keys(); return_map } fn populate_list(&self, last_data_points: &HashMap>) { let imp = self.imp(); imp.populating.set(true); for page in imp .stack .borrow() .pages() .iter::() .flatten() { let child = page .child() .downcast::() .unwrap() .content() .unwrap(); let sidebar_item = ResStackSidebarItem::new( child.property("tab_name"), child.property("icon"), child.property("tab_detail_string"), child.property("tab_usage_string"), child.property("graph_locked_max_y"), child.property("tab_id"), child.property("primary_ord"), child.property("secondary_ord"), ); child .bind_property("tab_name", &sidebar_item, "name") .sync_create() .build(); child .bind_property("icon", &sidebar_item, "icon") .sync_create() .build(); child .bind_property("tab_usage_string", &sidebar_item, "subtitle") .sync_create() .build(); child .bind_property("tab_detail_string", &sidebar_item, "detail") .sync_create() .build(); sidebar_item.set_usage_label_visible(SETTINGS.sidebar_details()); SETTINGS.connect_sidebar_details(clone!( #[weak(rename_to = item)] sidebar_item, move |sidebar_details| { item.set_usage_label_visible(sidebar_details); } )); sidebar_item.set_detail_label_visible( SETTINGS.sidebar_description() && !child.property::("tab_detail_string").is_empty(), ); SETTINGS.connect_sidebar_description(clone!( #[weak(rename_to = item)] sidebar_item, #[weak] child, move |sidebar_details| { // if the view doesn't provide a description, disable it regardless of the setting item.set_detail_label_visible( sidebar_details && !child.property::("tab_detail_string").is_empty(), ); } )); // TODO: generalize to "uses_meter"? if child.property::("uses_progress_bar") { if child.has_property("main_graph_color") { let b = child.property::("main_graph_color"); sidebar_item.graph().set_graph_color(b[0], b[1], b[2]); } sidebar_item.set_progress_bar_visible( SETTINGS.sidebar_meter_type() == SidebarMeterType::ProgressBar, ); sidebar_item .graph() .set_visible(SETTINGS.sidebar_meter_type() == SidebarMeterType::Graph); SETTINGS.connect_sidebar_meter_type(clone!( #[weak(rename_to = item)] sidebar_item, move |sidebar_meter_type| { item.set_progress_bar_visible( sidebar_meter_type == SidebarMeterType::ProgressBar, ); item.graph() .set_visible(sidebar_meter_type == SidebarMeterType::Graph); } )); child .bind_property("usage", &sidebar_item, "usage") .sync_create() .build(); if let Some(data) = last_data_points.get(&child.property::("tab_id")) { sidebar_item.graph().clear_data_points(); sidebar_item.graph().push_data_points(data); } } else { sidebar_item.set_progress_bar_visible(false); sidebar_item.graph().set_visible(false); } let row = gtk::ListBoxRow::builder() .child(&sidebar_item) .selectable(true) .can_focus(true) .can_target(true) .build(); imp.list_box.append(&row); row.set_focus_on_click(false); if let Some(visible_page) = imp.stack.borrow().visible_child() { if visible_page == page.child() { imp.list_box.select_row(Some(&row)); } } imp.rows.borrow_mut().insert(row, page); } imp.populating.set(false); } pub fn set_selected_list_item_by_tab_id>(&self, id: S) { let imp = self.imp(); let id = id.as_ref(); for (row, page) in imp.rows.borrow().iter() { let child = page .child() .downcast::() .unwrap() .content() .unwrap(); if child.property::("tab_id").as_str() == id { imp.list_box.select_row(Some(row)); break; } } } pub fn set_stack(&self, stack: >k::Stack) { let imp = self.imp(); *imp.stack.borrow_mut() = Rc::from(stack.clone()); *imp.pages.borrow_mut() = Rc::from(stack.clone().pages()); imp.pages.borrow().connect_items_changed(clone!( #[weak(rename_to = this)] self, move |_, _, _, _| { this.populate_list(&this.clear()); } )); imp.list_box.set_sort_func(|a, b| { let a_item = a.child().and_downcast::(); let b_item = b.child().and_downcast::(); if let (Some(a_item), Some(b_item)) = (a_item, b_item) { a_item.ord(&b_item) } else { Ordering::Equal } }); imp.list_box.connect_selected_rows_changed(clone!( #[weak(rename_to = this)] self, move |list_box| { let imp = this.imp(); if let Some(selected) = list_box.selected_row() { if !imp.populating.get() { let child = imp.rows.borrow().get(&selected).unwrap().child(); imp.stack.borrow().set_visible_child(&child); if let Some(page) = child .downcast_ref::() .and_then(adw::ToolbarView::content) { let _ = SETTINGS .set_last_viewed_page(page.property::("tab-id").as_str()); } } } } )); } } resources-1.9.1/src/ui/widgets/stack_sidebar_item.rs000066400000000000000000000202741510634446000226000ustar00rootroot00000000000000use adw::{glib::property::PropertySet, prelude::*, subclass::prelude::*}; use gtk::{ Ordering, gio::Icon, glib::{self}, }; use log::trace; use super::graph::ResGraph; mod imp { use std::cell::{Cell, RefCell}; use crate::ui::widgets::graph::ResGraph; use super::*; use gtk::{ CompositeTemplate, gio::{Icon, ThemedIcon}, glib::{ParamSpec, Properties, Value}, }; #[derive(CompositeTemplate, Properties)] #[template(resource = "/net/nokyan/Resources/ui/widgets/stack_sidebar_item.ui")] #[properties(wrapper_type = super::ResStackSidebarItem)] pub struct ResStackSidebarItem { #[template_child] pub image: TemplateChild, #[template_child] pub label: TemplateChild, #[template_child] pub detail_label: TemplateChild, #[template_child] pub usage_label: TemplateChild, #[template_child] pub progress_bar: TemplateChild, #[template_child] pub graph: TemplateChild, #[property(get = Self::name, set = Self::set_name, type = glib::GString)] name: Cell, #[property(get = Self::detail, set = Self::set_detail, type = glib::GString)] detail: Cell, #[property(get = Self::subtitle, set = Self::set_subtitle, type = glib::GString)] subtitle: Cell, #[property(get = Self::icon, set = Self::set_icon, type = Icon)] icon: RefCell, #[property(get, set = Self::set_usage)] usage: Cell, #[property(get = Self::tab_id, set = Self::set_tab_id, type = glib::GString)] tab_id: Cell, pub primary_ord: Cell, pub secondary_ord: Cell, } impl ResStackSidebarItem { pub fn name(&self) -> glib::GString { let name = self.name.take(); self.name.set(name.clone()); name } pub fn set_name(&self, name: &str) { let current_name = self.name.take(); if current_name.as_str() == name { self.name.set(current_name); return; } self.name.set(glib::GString::from(name)); self.label.set_label(name); } pub fn subtitle(&self) -> glib::GString { let subtitle = self.subtitle.take(); self.subtitle.set(subtitle.clone()); subtitle } pub fn set_subtitle(&self, usage_string: &str) { let current_usage_string = self.subtitle.take(); if current_usage_string.as_str() == usage_string { self.subtitle.set(current_usage_string); return; } self.usage_label.set_label(usage_string); } pub fn detail(&self) -> glib::GString { let detail = self.detail.take(); self.detail.set(detail.clone()); detail } pub fn set_detail(&self, detail: &str) { let current_detail = self.detail.take(); if current_detail.as_str() == detail { self.detail.set(current_detail); return; } self.detail_label.set_label(detail); } pub fn icon(&self) -> Icon { let icon = self .icon .replace_with(|_| ThemedIcon::new("generic-process").into()); self.icon.set(icon.clone()); icon } pub fn set_icon(&self, icon: &Icon) { self.image.set_from_gicon(icon); self.icon.set(icon.clone()); } pub fn set_usage(&self, usage: f64) { self.usage.set(usage); let mut highest_value = self.graph.get_highest_value(); if highest_value < 1.0 { highest_value = 1.0; } self.progress_bar.set_fraction(usage / highest_value); self.graph.push_data_point(usage); } gstring_getter_setter!(tab_id); } impl Default for ResStackSidebarItem { fn default() -> Self { Self { image: Default::default(), label: Default::default(), progress_bar: Default::default(), graph: Default::default(), detail_label: Default::default(), usage_label: Default::default(), name: Default::default(), detail: Default::default(), subtitle: Default::default(), icon: RefCell::new(ThemedIcon::new("generic-process").into()), usage: Default::default(), tab_id: Default::default(), primary_ord: Default::default(), secondary_ord: Default::default(), } } } #[glib::object_subclass] impl ObjectSubclass for ResStackSidebarItem { const NAME: &'static str = "ResStackSidebarItem"; type Type = super::ResStackSidebarItem; type ParentType = adw::Bin; fn class_init(klass: &mut Self::Class) { Self::bind_template(klass); } // You must call `Widget`'s `init_template()` within `instance_init()`. fn instance_init(obj: &glib::subclass::InitializingObject) { obj.init_template(); } } impl ObjectImpl for ResStackSidebarItem { fn constructed(&self) { self.parent_constructed(); } fn properties() -> &'static [ParamSpec] { Self::derived_properties() } fn set_property(&self, id: usize, value: &Value, pspec: &ParamSpec) { self.derived_set_property(id, value, pspec); } fn property(&self, id: usize, pspec: &ParamSpec) -> Value { self.derived_property(id, pspec) } } impl WidgetImpl for ResStackSidebarItem {} impl BinImpl for ResStackSidebarItem {} } glib::wrapper! { pub struct ResStackSidebarItem(ObjectSubclass) @extends adw::Bin, gtk::Widget, @implements gtk::Buildable, gtk::ConstraintTarget, gtk::Accessible; } impl ResStackSidebarItem { pub fn new( name: String, icon: Icon, detail: Option, usage_string: String, locked_max_y: bool, tab_id: String, primary_ord: u32, secondary_ord: u32, ) -> Self { trace!("Creating ResStackSidebarItem GObject…"); let detail = detail.unwrap_or_default(); let this: Self = glib::Object::builder() .property("name", name) .property("icon", icon) .property("detail", &detail) .property("subtitle", usage_string) .build(); this.imp() .graph .set_locked_max_y(locked_max_y.then_some(1.0)); this.imp().graph.set_height_request(64); this.imp().detail_label.set_visible(!detail.is_empty()); this.imp().set_tab_id(&tab_id); this.imp().primary_ord.set(primary_ord); this.imp().secondary_ord.set(secondary_ord); this } pub fn set_progress_bar_visible(&self, visible: bool) { self.imp().progress_bar.set_visible(visible); } pub fn graph(&self) -> ResGraph { self.imp().graph.get() } pub fn set_usage_label_visible(&self, visible: bool) { self.imp().usage_label.set_visible(visible); } pub fn set_detail_label_visible(&self, visible: bool) { self.imp().detail_label.set_visible(visible); } pub fn primary_ord(&self) -> u32 { self.imp().primary_ord.clone().take() } pub fn secondary_ord(&self) -> u32 { self.imp().secondary_ord.clone().take() } pub fn ord(&self, other: &Self) -> Ordering { if self.primary_ord() > other.primary_ord() { Ordering::Larger } else if self.primary_ord() < other.primary_ord() { Ordering::Smaller } else if self.secondary_ord() > other.secondary_ord() { Ordering::Larger } else if self.secondary_ord() < other.secondary_ord() { Ordering::Smaller } else { Ordering::Equal } } } resources-1.9.1/src/ui/window.rs000066400000000000000000001302711510634446000166240ustar00rootroot00000000000000use process_data::{Niceness, ProcessData}; use std::path::PathBuf; use std::time::{Duration, Instant}; use adw::{Toast, ToastOverlay}; use adw::{ToolbarView, prelude::*, subclass::prelude::*}; use anyhow::{Context, Result}; use gtk::glib::{GString, MainContext, clone, timeout_future}; use gtk::{Widget, gdk, gio, glib}; use log::{debug, info, trace, warn}; use crate::application::Application; use crate::config::PROFILE; use crate::gui::ARGS; use crate::i18n::{i18n, i18n_f, ni18n_f}; use crate::ui::pages::applications::ResApplications; use crate::ui::pages::battery::ResBattery; use crate::ui::pages::drive::ResDrive; use crate::ui::pages::processes::ResProcesses; use crate::utils::app::AppsContext; use crate::utils::battery::{Battery, BatteryData}; use crate::utils::cpu::{self, CpuData}; use crate::utils::drive::{Drive, DriveData}; use crate::utils::gpu::{Gpu, GpuData}; use crate::utils::memory::MemoryData; use crate::utils::network::{NetworkData, NetworkInterface}; use crate::utils::npu::{Npu, NpuData}; use crate::utils::process::{Process, ProcessAction}; use crate::utils::settings::SETTINGS; use super::pages::applications; use super::pages::gpu::ResGPU; use super::pages::network::ResNetwork; use super::pages::npu::ResNPU; #[derive(Debug, Clone)] pub enum Action { ManipulateProcesses(ProcessAction, Vec, ToastOverlay), ManipulateApp(ProcessAction, String, ToastOverlay), AdjustProcess(libc::pid_t, Niceness, Vec, String, ToastOverlay), } mod imp { use std::{ cell::{Cell, RefCell}, collections::HashMap, }; use crate::{ config::VERSION, ui::{ pages::{ applications::ResApplications, cpu::ResCPU, memory::ResMemory, processes::ResProcesses, }, widgets::stack_sidebar::ResStackSidebar, }, utils::app::AppsContext, }; use super::*; use async_channel::{Receiver, Sender, unbounded}; use gtk::CompositeTemplate; use log::debug; use process_data::{gpu_usage::GpuIdentifier, pci_slot::PciSlot}; #[derive(Debug, CompositeTemplate)] #[template(resource = "/net/nokyan/Resources/ui/window.ui")] pub struct MainWindow { #[template_child] pub split_view: TemplateChild, #[template_child] pub processor_window_title: TemplateChild, #[template_child] pub resources_sidebar: TemplateChild, #[template_child] pub content_stack: TemplateChild, #[template_child] pub cpu: TemplateChild, #[template_child] pub cpu_page: TemplateChild, #[template_child] pub apps: TemplateChild, #[template_child] pub apps_page: TemplateChild, #[template_child] pub apps_search_button: TemplateChild, #[template_child] pub processes: TemplateChild, #[template_child] pub processes_page: TemplateChild, #[template_child] pub processes_search_button: TemplateChild, #[template_child] pub memory: TemplateChild, #[template_child] pub memory_page: TemplateChild, pub drive_pages: RefCell>, pub network_pages: RefCell>, pub battery_pages: RefCell>, pub gpu_pages: RefCell>, pub npu_pages: RefCell>, pub apps_context: RefCell, pub pause_updates: Cell, pub sender: Sender, pub receiver: RefCell>>, } impl Default for MainWindow { fn default() -> Self { let (sender, r) = unbounded(); let receiver = RefCell::new(Some(r)); Self { drive_pages: RefCell::default(), network_pages: RefCell::default(), battery_pages: RefCell::default(), split_view: TemplateChild::default(), resources_sidebar: TemplateChild::default(), content_stack: TemplateChild::default(), apps: TemplateChild::default(), apps_page: TemplateChild::default(), apps_search_button: TemplateChild::default(), processes: TemplateChild::default(), processes_page: TemplateChild::default(), processes_search_button: TemplateChild::default(), cpu: TemplateChild::default(), cpu_page: TemplateChild::default(), memory: TemplateChild::default(), memory_page: TemplateChild::default(), apps_context: Default::default(), pause_updates: Default::default(), sender, receiver, processor_window_title: TemplateChild::default(), gpu_pages: RefCell::default(), npu_pages: RefCell::default(), } } } #[glib::object_subclass] impl ObjectSubclass for MainWindow { const NAME: &'static str = "MainWindow"; type Type = super::MainWindow; type ParentType = adw::ApplicationWindow; fn class_init(klass: &mut Self::Class) { Self::bind_template(klass); } // You must call `Widget`'s `init_template()` within `instance_init()`. fn instance_init(obj: &glib::subclass::InitializingObject) { obj.init_template(); } } impl ObjectImpl for MainWindow { fn constructed(&self) { self.parent_constructed(); let obj = self.obj(); // Devel Profile if PROFILE == "Devel" { obj.add_css_class("devel"); obj.set_title(Some( format!("{} ({})", obj.title().unwrap_or_default(), VERSION).trim(), )); } // Load latest window state obj.load_window_size(); } } impl WidgetImpl for MainWindow {} impl WindowImpl for MainWindow { // Save window state on delete event fn close_request(&self) -> glib::Propagation { debug!("Closing the application…"); if let Err(err) = self.obj().save_window_size() { warn!("Failed to save window state, {}", &err); } // Pass close request on to the parent self.parent_close_request() } } impl ApplicationWindowImpl for MainWindow {} impl AdwApplicationWindowImpl for MainWindow {} } glib::wrapper! { pub struct MainWindow(ObjectSubclass) @extends gtk::Widget, gtk::Window, gtk::ApplicationWindow, adw::ApplicationWindow, @implements gio::ActionMap, gio::ActionGroup, gtk::Root, gtk::Buildable, gtk::ConstraintTarget, gtk::Native, gtk::ShortcutManager, gtk::Accessible; } struct RefreshData { cpu_data: Option, mem_data: Option>, gpu_data: Vec, npu_data: Vec, drive_paths: Vec, drive_data: Vec, network_paths: Vec, network_data: Vec, battery_paths: Vec, battery_data: Vec, process_data: Vec, } impl MainWindow { pub fn new(app: &Application) -> Self { trace!("Creating MainWindow GObject…"); let window = glib::Object::builder::() .property("application", app) .build(); if let Some(receiver) = &*window.imp().receiver.borrow() { let main_context = MainContext::default(); main_context.spawn_local(clone!( #[strong] receiver, #[weak] window, async move { while let Ok(action) = receiver.recv().await { window.process_action(action); } } )); } window.setup_widgets(); window.setup_signals(); window } fn setup_widgets(&self) { trace!("Setting up Application widgets…"); let imp = self.imp(); let gpus = Gpu::get_gpus().unwrap_or_default(); if !ARGS.disable_gpu_monitoring { self.init_gpu_pages(&gpus); } imp.resources_sidebar.set_stack(&imp.content_stack); if ARGS.disable_process_monitoring { self.remove_page(imp.apps_page.child().downcast_ref().unwrap()); self.remove_page(imp.processes_page.child().downcast_ref().unwrap()); } else { *imp.apps_context.borrow_mut() = AppsContext::new( gpus.iter() .filter(|gpu| gpu.combined_media_engine().unwrap_or_default()) .map(|gpu| gpu.gpu_identifier()) .collect(), ); imp.apps.init(imp.sender.clone()); imp.processes.init(imp.sender.clone()); } if ARGS.disable_cpu_monitoring { self.remove_page(imp.cpu_page.child().downcast_ref().unwrap()); } else { let cpu_info = cpu::CpuInfo::get() .context("unable to get CPUInfo") .unwrap(); if let Some(model_name) = cpu_info.model_name.as_deref() { imp.processor_window_title.set_title(model_name); imp.processor_window_title.set_subtitle(&i18n("Processor")); } imp.cpu.init(cpu_info); } if ARGS.disable_memory_monitoring { self.remove_page(imp.memory_page.child().downcast_ref().unwrap()); } else { imp.memory.init(); } if !ARGS.disable_npu_monitoring { self.init_npu_pages(); } let main_context = MainContext::default(); main_context.spawn_local(clone!( #[weak(rename_to = this)] self, async move { this.periodic_refresh_all().await; } )); } fn setup_signals(&self) { let imp = self.imp(); imp.apps .search_bar() .bind_property( "search-mode-enabled", &imp.apps_search_button.get(), "active", ) .sync_create() .bidirectional() .build(); imp.processes .search_bar() .bind_property( "search-mode-enabled", &imp.processes_search_button.get(), "active", ) .sync_create() .bidirectional() .build(); imp.content_stack.connect_visible_child_notify(clone!( #[weak] imp, move |_| { // close the split view if we're in "mobile layout" and the user has clicked on an element if imp.split_view.is_collapsed() { imp.split_view.set_show_sidebar(false); } } )); // if CTRL is held, don't update apps and processes like Windows Task Manager let event_controller = gtk::EventControllerKey::new(); event_controller.connect_key_pressed(clone!( #[strong(rename_to = this)] self, move |_, key, _, _| { if key == gdk::Key::Control_L { debug!("Ctrl is being held, halting apps and processes updates"); this.imp().pause_updates.set(true); } glib::Propagation::Proceed } )); event_controller.connect_key_released(clone!( #[weak] imp, move |_, key, _, _| { if key == gdk::Key::Control_L { debug!("Ctrl has been released, resuming apps and processes updates"); imp.pause_updates.set(false); }; } )); self.add_controller(event_controller); self.connect_suspended_notify(clone!( #[weak] imp, move |window| { imp.pause_updates.set(window.is_suspended()); if window.is_suspended() { debug!("Resources has been suspended, halting graphical updates"); } else { debug!("Resources is not suspended anymore, resuming graphical updates"); } } )); } fn get_selected_page(&self) -> Option { self.imp() .content_stack .visible_child() .and_downcast::() .and_then(|toolbar| toolbar.content()) } pub fn shortcut_toggle_search(&self) { let imp = self.imp(); let selected_page = self.get_selected_page().unwrap(); if selected_page.is::() { imp.apps.toggle_search(); } else if selected_page.is::() { imp.processes.toggle_search(); } } pub fn shortcut_manipulate_app_process(&self, process_action: ProcessAction) { let imp = self.imp(); let selected_page = self.get_selected_page().unwrap(); if selected_page.is::() { if let Some(app_item) = imp.apps.get_selected_app_entry() { imp.apps.open_app_action_dialog(&app_item, process_action); } } else if selected_page.is::() { let selected = imp.processes.get_selected_process_entries(); if !selected.is_empty() { imp.processes .open_process_action_dialog(selected, process_action); } } } pub fn shortcut_information_app_process(&self) { let imp = self.imp(); let selected_page = self.get_selected_page().unwrap(); if selected_page.is::() { if let Some(app_item) = imp.apps.get_selected_app_entry() { imp.apps.open_info_dialog(&app_item); } } else if selected_page.is::() { let selected = imp.processes.get_selected_process_entries(); if selected.len() == 1 { imp.processes.open_info_dialog(&selected[0]); } } } pub fn shortcut_process_options(&self) { let imp = self.imp(); let selected_page = self.get_selected_page().unwrap(); if selected_page.is::() { let selected = imp.processes.get_selected_process_entries(); if selected.len() == 1 { imp.processes.open_options_dialog(&selected[0]); } } } fn init_gpu_pages(self: &MainWindow, gpus: &[Gpu]) { let imp = self.imp(); for (i, gpu) in gpus.iter().enumerate() { let page = ResGPU::new(); let tab_name = if gpus.len() > 1 { i18n_f("GPU {}", &[&(i + 1).to_string()]) } else { i18n("GPU") }; page.set_tab_name(&*tab_name); let added_page = if let Ok(gpu_name) = gpu.name() { self.add_page(&page, &gpu_name, &tab_name) } else { self.add_page(&page, &tab_name, &tab_name) }; page.init(gpu, i as u32); imp.gpu_pages .borrow_mut() .insert(gpu.gpu_identifier(), (gpu.clone(), added_page)); } } fn init_npu_pages(self: &MainWindow) -> Vec { let imp = self.imp(); let npus = Npu::get_npus().unwrap_or_default(); for (i, npu) in npus.iter().enumerate() { let page = ResNPU::new(); let tab_name = if npus.len() > 1 { i18n_f("NPU {}", &[&(i + 1).to_string()]) } else { i18n("NPU") }; page.set_tab_name(&*tab_name); let added_page = if let Ok(npu_name) = npu.name() { self.add_page(&page, &npu_name, &tab_name) } else { self.add_page(&page, &tab_name, &tab_name) }; page.init(npu, i as u32); imp.npu_pages .borrow_mut() .insert(npu.pci_slot(), (npu.clone(), added_page)); } npus } fn gather_refresh_data(logical_cpus: usize, gpus: &[Gpu], npus: &[Npu]) -> RefreshData { let start = Instant::now(); trace!("Gathering refresh data of all devices…"); let cpu_data = if ARGS.disable_cpu_monitoring { None } else { Some(CpuData::new(logical_cpus)) }; let mem_data = if ARGS.disable_memory_monitoring { None } else { Some(MemoryData::new()) }; let mut gpu_data = Vec::with_capacity(gpus.len()); for gpu in gpus { let data = GpuData::new(gpu); gpu_data.push(data); } let mut npu_data = Vec::with_capacity(npus.len()); for npu in npus { let data = NpuData::new(npu); npu_data.push(data); } let drive_paths = if ARGS.disable_drive_monitoring { Vec::new() } else { Drive::get_sysfs_paths().unwrap_or_default() }; let mut drive_data = Vec::with_capacity(drive_paths.len()); for path in &drive_paths { drive_data.push(DriveData::new(path)); } let network_paths = if ARGS.disable_network_interface_monitoring { Vec::new() } else { NetworkInterface::get_sysfs_paths().unwrap_or_default() }; let mut network_data = Vec::with_capacity(network_paths.len()); for path in &network_paths { network_data.push(NetworkData::new(path)); } let battery_paths = if ARGS.disable_battery_monitoring { Vec::new() } else { Battery::get_sysfs_paths().unwrap_or_default() }; let mut battery_data = Vec::with_capacity(battery_paths.len()); for path in &battery_paths { battery_data.push(BatteryData::new(path)); } let process_data = if ARGS.disable_process_monitoring { Vec::new() } else { Process::all_data() .inspect_err(|e| { warn!( "Unable to update process and app data! Is resources-processes running?\n{e}\n{}", e.backtrace() ); }) .unwrap_or_default() }; let refresh_data = RefreshData { cpu_data, mem_data, gpu_data, npu_data, drive_paths, drive_data, network_paths, network_data, battery_paths, battery_data, process_data, }; trace!("Finished gathering refresh data in {:.2?}", start.elapsed()); refresh_data } fn refresh_ui(&self, refresh_data: RefreshData) { let start = Instant::now(); trace!("Refreshing UI using gathered data…"); let imp = self.imp(); let RefreshData { cpu_data, mem_data, gpu_data, npu_data, drive_paths, drive_data, network_paths, network_data, battery_paths, battery_data, process_data, } = refresh_data; /* * Apps and processes */ let mut apps_context = imp.apps_context.borrow_mut(); apps_context.refresh(process_data); // if CTRL is held, don't update apps and processes like Windows Task Manager if !imp.pause_updates.get() { trace!("Skipping visual apps and processes updates"); imp.apps.refresh_apps_list(&apps_context); imp.processes.refresh_processes_list(&apps_context); } /* * Gpu */ let gpu_pages = imp.gpu_pages.borrow(); for ((_, page), mut gpu_data) in gpu_pages.values().zip(gpu_data) { let page = page.content().and_downcast::().unwrap(); if !gpu_data.nvidia { // for non-NVIDIA GPUs, we prefer getting the fractions from the processes because they represent the // average usage during now and the last refresh, while gpu_busy_percent is a snapshot of the current // usage, which might not be what we want trace!( "{} ({}) is not an NVIDIA GPU, adjusting usage values using process-based statistics", page.tab_detail_string(), gpu_data.gpu_identifier ); let drm_gpu_fraction = gpu_data.usage_fraction.unwrap_or(0.0); let processes_gpu_fraction = apps_context.gpu_fraction(gpu_data.gpu_identifier); let highest_gpu_fraction = f64::max(drm_gpu_fraction, processes_gpu_fraction.into()); trace!( "DRM usage: {drm_gpu_fraction} · Process-based usage: {processes_gpu_fraction} · Using {highest_gpu_fraction}" ); gpu_data.usage_fraction = Some(highest_gpu_fraction); let drm_encode_fraction = gpu_data.encode_fraction.unwrap_or(0.0); let processes_encode_fraction = apps_context.encoder_fraction(gpu_data.gpu_identifier); let highest_encode_fraction = f64::max(drm_encode_fraction, processes_encode_fraction.into()); trace!( "DRM encode: {drm_encode_fraction} · Process-based encode: {processes_encode_fraction} · Using {highest_encode_fraction}" ); gpu_data.encode_fraction = Some(highest_encode_fraction); let drm_decode_fraction = gpu_data.decode_fraction.unwrap_or(0.0); let processes_decode_fraction = apps_context.decoder_fraction(gpu_data.gpu_identifier); let highest_decode_fraction = f64::max(drm_decode_fraction, processes_decode_fraction.into()); trace!( "DRM decode: {drm_decode_fraction} · Process-based decode: {processes_decode_fraction} · Using {highest_decode_fraction}" ); gpu_data.decode_fraction = Some(highest_decode_fraction); if gpu_data.used_vram.is_none() { gpu_data.used_vram = Some(apps_context.vram_usage(gpu_data.gpu_identifier)); trace!( "Couldn't read sysfs VRAM usage, falling back to summing up per-process usage…" ) } } page.refresh_page(&gpu_data); } std::mem::drop(apps_context); /* * Npu */ let npu_pages = imp.npu_pages.borrow(); for ((_, page), npu_data) in npu_pages.values().zip(npu_data) { let page = page.content().and_downcast::().unwrap(); page.refresh_page(&npu_data); } /* * Cpu */ if let Some(cpu_data) = cpu_data { imp.cpu.refresh_page(&cpu_data); } /* * Memory */ if let Some(mem_data_result) = mem_data { if let Ok(mem_data) = mem_data_result { imp.memory.refresh_page(mem_data); } else if let Err(error) = mem_data_result { warn!("Unable to update memory data, reason: {error}"); } } /* * Drives */ // Make sure there is a page for every drive that is shown self.refresh_drive_pages(drive_paths, &drive_data); // Update drive pages for drive_data in drive_data { if drive_data.is_virtual && !SETTINGS.show_virtual_drives() { continue; } let drive_pages = imp.drive_pages.borrow(); let page = drive_pages.get(&drive_data.inner.sysfs_path).unwrap(); let page = page.content().and_downcast::().unwrap(); page.refresh_page(drive_data); } /* * Network */ // Make sure there is a page for every network interface that is shown self.refresh_network_pages(network_paths, &network_data); // Update network pages for network_data in network_data { if network_data.is_virtual && !SETTINGS.show_virtual_network_interfaces() { continue; } let network_pages = imp.network_pages.borrow(); let page = network_pages.get(&network_data.inner.sysfs_path).unwrap(); let page = page.content().and_downcast::().unwrap(); page.refresh_page(network_data); } /* * Batteries */ // Make sure there is a page for every battery that is shown self.refresh_battery_pages(battery_paths, &battery_data); // Update battery pages for battery_data in battery_data { let battery_pages = imp.battery_pages.borrow(); let page = battery_pages.get(&battery_data.inner.sysfs_path).unwrap(); let page = page.content().and_downcast::().unwrap(); page.refresh_page(battery_data); } trace!("UI refresh done in {:.2?}", start.elapsed()); } pub async fn periodic_refresh_all(&self) { let imp = self.imp(); let gpus = if ARGS.disable_gpu_monitoring { Vec::new() } else { imp.gpu_pages .borrow() .values() .map(|(gpu, _)| gpu) .cloned() .collect::>() }; let npus = if ARGS.disable_npu_monitoring { Vec::new() } else { imp.npu_pages .borrow() .values() .map(|(npu, _)| npu) .cloned() .collect::>() }; let logical_cpus = imp.cpu.imp().logical_cpus_amount.get(); let (tx_data, rx_data) = std::sync::mpsc::sync_channel(1); let (tx_wait, rx_wait) = std::sync::mpsc::sync_channel(1); std::thread::spawn(move || { trace!("Spawning refresh thread"); loop { let data = Self::gather_refresh_data(logical_cpus, &gpus, &npus); tx_data.send(data).unwrap(); // Wait on delay so we don't gather data multiple times in a short time span // Which usually just yields the same data and makes changes appear delayed by (up to) multiple refreshes rx_wait.recv().unwrap(); } }); let mut first_refresh = true; trace!("Going into refresh loop"); loop { // gather_refresh_data() let refresh_data = rx_data.recv().unwrap(); self.refresh_ui(refresh_data); // if this is our first refresh, we want to set the opening view to what it was when the last session was // ended or whatever the user has supplied via CLI arg if first_refresh { let page_to_open = ARGS .open_tab_id .clone() .unwrap_or_else(|| SETTINGS.last_viewed_page()); // yes, this is bad and O(n). for page in imp.content_stack.pages().iter::().flatten() { let toolbar = page.child().downcast::().unwrap(); let child_id = toolbar.content().unwrap().property::("tab_id"); if child_id == page_to_open { imp.content_stack.set_visible_child(&toolbar); imp.resources_sidebar .set_selected_list_item_by_tab_id(&child_id); break; } } first_refresh = false; } // Total time before next ui refresh let total_delay = SETTINGS.refresh_speed().ui_refresh_interval(); // Reasonable timespan before total_delay ends to gather all data let gather_time = 0.2; timeout_future(Duration::from_secs_f32(total_delay - gather_time)).await; // Tell other threads to start gathering data tx_wait.send(()).unwrap(); timeout_future(Duration::from_secs_f32(gather_time)).await; } } /// Wrapper to remove page, and check if removed page was visible with global default behavior fn remove_page(&self, page: &ToolbarView) { trace!("Removing page {page:?}…"); let imp = self.imp(); // no visible child exists if let Some(visible_child) = imp.content_stack.visible_child() { if visible_child == *page.upcast_ref::() { imp.resources_sidebar .set_selected_list_item_by_tab_id(applications::TAB_ID); } } imp.content_stack.remove(page); } /// Create page for every drive that is shown fn refresh_drive_pages(&self, mut paths: Vec, drive_data: &[DriveData]) { trace!("Refreshing drive pages…"); let imp = self.imp(); let mut drive_pages = imp.drive_pages.borrow_mut(); let mut highest_secondary_ord = drive_pages .values() .filter_map(adw::ToolbarView::content) .map(|widget| widget.property::("secondary_ord")) .max() .unwrap_or_default(); let old_page_paths: Vec = drive_pages.keys().map(ToOwned::to_owned).collect(); // Filter hidden drives for data in drive_data { if data.is_virtual && !SETTINGS.show_virtual_drives() { let idx = paths .iter() .position(|p| **p == data.inner.sysfs_path) .unwrap(); paths.remove(idx); } } // paths now contains all the (paths to) drives we want to show // Delete hidden old drive pages for page_path in &old_page_paths { if !paths.contains(page_path) { // A drive has been removed info!( "A drive has been removed (or turned invisible): {}", page_path.display() ); let page = drive_pages.remove(page_path).unwrap(); self.remove_page(&page); } } // Add new drive pages for path in paths { drive_pages.entry(path.clone()).or_insert_with(|| { // A drive has been added info!( "A drive has been added (or turned visible): {}", path.display() ); highest_secondary_ord = highest_secondary_ord.saturating_add(1); let drive = drive_data .iter() .find(|d| d.inner.sysfs_path == path) .unwrap(); let display_name = drive.inner.display_name(); let page = ResDrive::new(); page.init(drive, highest_secondary_ord); if let Some(model) = &drive.inner.model { self.add_page(&page, model, &display_name) } else { self.add_page(&page, &drive.inner.block_device, &display_name) } }); } } /// Create page for every network interface that is shown fn refresh_network_pages(&self, mut paths: Vec, network_data: &[NetworkData]) { trace!("Refreshing network pages…"); let imp = self.imp(); let mut network_pages = imp.network_pages.borrow_mut(); let mut highest_secondary_ord = network_pages .values() .filter_map(adw::ToolbarView::content) .map(|widget| widget.property::("secondary_ord")) .max() .unwrap_or_default(); let old_page_paths: Vec = network_pages.keys().map(ToOwned::to_owned).collect(); // Filter hidden networks for data in network_data { if data.is_virtual && !SETTINGS.show_virtual_network_interfaces() { let idx = paths .iter() .position(|p| **p == data.inner.sysfs_path) .unwrap(); paths.remove(idx); } } // paths now contains all the (paths to) network interfaces we want to show // Delete hidden old network pages for page_path in &old_page_paths { if !paths.contains(page_path) { // A network interface has been removed info!( "A network interface has been removed (or turned invisible): {}", page_path.display() ); let page = network_pages.remove(page_path).unwrap(); self.remove_page(&page); } } // Add new network pages for path in paths { network_pages.entry(path.clone()).or_insert_with(|| { // A network interface has been added info!( "A network interface has been added (or turned visible): {}", path.display() ); highest_secondary_ord = highest_secondary_ord.saturating_add(1); let network_interface = network_data .iter() .find(|d| d.inner.sysfs_path == path) .unwrap(); // Insert stub page, values will be updated in refresh_page() let page = ResNetwork::new(); page.init(network_interface, highest_secondary_ord); self.add_page( &page, &network_interface.inner.display_name(), &network_interface.inner.interface_type.to_string(), ) }); } } /// Create page for every battery that is shown fn refresh_battery_pages(&self, paths: Vec, battery_data: &[BatteryData]) { trace!("Refreshing battery pages…"); let imp = self.imp(); let mut battery_pages = imp.battery_pages.borrow_mut(); let mut highest_secondary_ord = battery_pages .values() .filter_map(adw::ToolbarView::content) .map(|widget| widget.property::("secondary_ord")) .max() .unwrap_or_default(); let old_page_paths: Vec = battery_pages .keys() .map(std::borrow::ToOwned::to_owned) .collect(); // Delete hidden old battery pages for page_path in &old_page_paths { if !paths.contains(page_path) { // A battery has been removed info!("A battery has been removed: {}", page_path.display()); let page = battery_pages.remove(page_path).unwrap(); self.remove_page(&page); } } // Add new battery pages for path in paths { battery_pages.entry(path.clone()).or_insert_with(|| { // A battery has been added info!("A battery has been added: {}", path.display()); highest_secondary_ord = highest_secondary_ord.saturating_add(1); let battery = battery_data .iter() .find(|d| d.inner.sysfs_path == path) .unwrap(); // Insert stub page, values will be updated in refresh_page() let page = ResBattery::new(); page.init(battery, highest_secondary_ord); self.add_page( &page, &battery .inner .sysfs_path .file_name() .unwrap() .to_string_lossy(), &battery.inner.display_name(), ) }); } } fn process_action(&self, action: Action) { let apps_context = self.imp().apps_context.borrow(); match action { Action::ManipulateProcesses(action, pids, toast_overlay) => { let mut processes_unsuccessful: usize = 0; let mut first_process = None; for (i, pid) in pids.iter().enumerate() { if let Some(process) = apps_context.get_process(*pid) { if i == 0 { first_process = Some(process); } if process.execute_process_action(action).is_err() { processes_unsuccessful += 1; } } } let toast_message = if processes_unsuccessful > 0 { if pids.len() == 1 { if let Some(display_name) = first_process.map(|process| &process.display_name) { get_named_action_failure(action, display_name) } else { // this should never happen get_action_failure(action, 1) } } else { get_action_failure(action, processes_unsuccessful) } } else if pids.len() == 1 { if let Some(display_name) = first_process.map(|process| &process.display_name) { get_action_success(action, display_name) } else { // this should never happen get_processes_success(action, 1) } } else { get_processes_success(action, pids.len()) }; toast_overlay.add_toast(Toast::new(&toast_message)); } Action::ManipulateApp(action, id, toast_overlay) => { let app = apps_context.get_app(&Some(id.clone())).unwrap(); let result = app.execute_process_action(&apps_context, action); let processes_tried = result.len(); let processes_successful = result.iter().flatten().count(); let processes_unsuccessful = processes_tried - processes_successful; let toast_message = if processes_unsuccessful > 0 { get_action_failure(action, processes_unsuccessful) } else { get_action_success(action, &app.display_name) }; toast_overlay.add_toast(Toast::new(&toast_message)); } Action::AdjustProcess(pid, niceness, affinity, display_name, toast_overlay) => { if let Some(process) = apps_context.get_process(pid) { let result = process.adjust(niceness, affinity); let toast_message = match result { Ok(()) => i18n_f("Successfully adjusted {}", &[&display_name]), Err(_) => i18n_f("There was a problem adjusting {}", &[&display_name]), }; toast_overlay.add_toast(Toast::new(&toast_message)); } } } } fn save_window_size(&self) -> Result<(), glib::BoolError> { let (width, height) = self.default_size(); SETTINGS.set_window_width(width)?; SETTINGS.set_window_height(height)?; SETTINGS.set_maximized(self.is_maximized())?; Ok(()) } fn load_window_size(&self) { let width = SETTINGS.window_width(); let height = SETTINGS.window_height(); let is_maximized = SETTINGS.maximized(); self.set_default_size(width, height); if is_maximized { self.maximize(); } } fn add_page( &self, widget: &impl IsA, window_title: &str, window_subtitle: &str, ) -> adw::ToolbarView { trace!("Adding page {window_title} ({window_subtitle})…"); let imp = self.imp(); let title_widget = adw::WindowTitle::new(window_title, window_subtitle); let sidebar_button = gtk::ToggleButton::new(); sidebar_button.set_icon_name("sidebar-show-symbolic"); imp.split_view .bind_property("collapsed", &sidebar_button, "visible") .sync_create() .build(); imp.split_view .bind_property("show-sidebar", &sidebar_button, "active") .sync_create() .bidirectional() .build(); let header_bar = adw::HeaderBar::new(); header_bar.add_css_class("flat"); header_bar.set_title_widget(Some(&title_widget)); header_bar.pack_start(&sidebar_button); let toolbar = adw::ToolbarView::new(); toolbar.add_top_bar(&header_bar); toolbar.set_content(Some(widget)); imp.content_stack.add_child(&toolbar); toolbar } } impl Default for MainWindow { fn default() -> Self { Application::default() .active_window() .unwrap() .downcast() .unwrap() } } fn get_action_success(action: ProcessAction, name: &str) -> String { match action { ProcessAction::TERM => i18n_f("Successfully ended {}", &[name]), ProcessAction::STOP => i18n_f("Successfully halted {}", &[name]), ProcessAction::KILL => i18n_f("Successfully killed {}", &[name]), ProcessAction::CONT => i18n_f("Successfully continued {}", &[name]), } } fn get_processes_success(action: ProcessAction, count: usize) -> String { match action { ProcessAction::TERM => ni18n_f( "Successfully ended the process", "Successfully ended {} processes", count as u32, &[&count.to_string()], ), ProcessAction::STOP => ni18n_f( "Successfully halted the process", "Successfully halted {} processes", count as u32, &[&count.to_string()], ), ProcessAction::KILL => ni18n_f( "Successfully killed the process", "Successfully killed {} processes", count as u32, &[&count.to_string()], ), ProcessAction::CONT => ni18n_f( "Successfully continued the process", "Successfully continued {} processes", count as u32, &[&count.to_string()], ), } } fn get_action_failure(action: ProcessAction, count: usize) -> String { match action { ProcessAction::TERM => ni18n_f( "There was a problem ending a process", "There were problems ending {} processes", count as u32, &[&count.to_string()], ), ProcessAction::STOP => ni18n_f( "There was a problem halting a process", "There were problems halting {} processes", count as u32, &[&count.to_string()], ), ProcessAction::KILL => ni18n_f( "There was a problem killing a process", "There were problems killing {} processes", count as u32, &[&count.to_string()], ), ProcessAction::CONT => ni18n_f( "There was a problem continuing a process", "There were problems continuing {} processes", count as u32, &[&count.to_string()], ), } } pub fn get_named_action_failure(action: ProcessAction, name: &str) -> String { match action { ProcessAction::TERM => i18n_f("There was a problem ending {}", &[name]), ProcessAction::STOP => i18n_f("There was a problem halting {}", &[name]), ProcessAction::KILL => i18n_f("There was a problem killing {}", &[name]), ProcessAction::CONT => i18n_f("There was a problem continuing {}", &[name]), } } resources-1.9.1/src/utils/000077500000000000000000000000001510634446000154665ustar00rootroot00000000000000resources-1.9.1/src/utils/app.rs000066400000000000000000000774561510634446000166370ustar00rootroot00000000000000use std::{ collections::{HashMap, HashSet}, path::{Path, PathBuf}, sync::LazyLock, time::Instant, }; use anyhow::{Context, Result, bail}; use gtk::{ gio::{File, FileIcon, Icon, ThemedIcon}, glib::GString, }; use lazy_regex::{Lazy, Regex, lazy_regex}; use log::{debug, info, trace}; use process_data::{ Containerization, ProcessData, gpu_usage::{GpuIdentifier, GpuUsageStats}, }; use crate::{i18n::i18n, utils::read_parsed}; use super::{ boot_time, process::{Process, ProcessAction}, }; /// This contains the cgroups of desktop environments. If a process has this as its cgroup, its parent's cgroup will be /// considered instead to enhance app detection const DESKTOP_ENVIRONMENT_CGROUPS: &[&str] = &["org.gnome.Shell"]; // This contains executable names that are blocklisted from being recognized as applications const DESKTOP_EXEC_BLOCKLIST: &[&str] = &["bash", "zsh", "fish", "sh", "ksh", "flatpak"]; // This contains IDs of desktop files that shouldn't be counted as applications for whatever reason static APP_ID_BLOCKLIST: LazyLock> = LazyLock::new(|| { HashMap::from([ ( "org.gnome.Terminal.Preferences", "Prevents the actual Terminal app \"org.gnome.Terminal\" from being shown", ), ( "org.freedesktop.IBus.Panel.Extension.Gtk3", "Technical application", ), ("org.gnome.RemoteDesktop.Handover", "Technical application"), ( "gnome-software-local-file-packagekit", "Technical application", ), ("snap-handle-link", "Technical application"), ("gnome-about-panel", "Technical application"), ("gnome-applications-panel", "Technical application"), ("gnome-background-panel", "Technical application"), ("gnome-bluetooth-panel", "Technical application"), ("gnome-color-panel", "Technical application"), ("gnome-datetime-panel", "Technical application"), ("gnome-display-panel", "Technical application"), ("gnome-keyboard-panel", "Technical application"), ("gnome-mouse-panel", "Technical application"), ("gnome-multitasking-panel", "Technical application"), ("gnome-network-panel", "Technical application"), ("gnome-notifications-panel", "Technical application"), ("gnome-online-accounts-panel", "Technical application"), ("gnome-power-panel", "Technical application"), ("gnome-printers-panel", "Technical application"), ("gnome-privacy-panel", "Technical application"), ("gnome-region-panel", "Technical application"), ("gnome-search-panel", "Technical application"), ("gnome-sharing-panel", "Technical application"), ("gnome-sound-panel", "Technical application"), ("gnome-system-panel", "Technical application"), ("gnome-universal-access-panel", "Technical application"), ("gnome-users-panel", "Technical application"), ("gnome-wacom-panel", "Technical application"), ("gnome-wifi-panel", "Technical application"), ("gnome-wwan-panel", "Technical application"), ]) }); static RE_ENV_FILTER: Lazy = lazy_regex!(r"env\s*\S*=\S*\s*(.*)"); static RE_FLATPAK_FILTER: Lazy = lazy_regex!(r"flatpak run .* --command=(\S*)"); fn format_path(path: &str) -> String { if path.starts_with("~/") { // $HOME may not include a trailing /, so we must not remove the extra trailing / path.replace( '~', &std::env::var("HOME").unwrap_or_else(|_| "/".to_string()), ) } else { path.parse().unwrap() } } // Adapted from Mission Center: https://gitlab.com/mission-center-devs/mission-center/ pub static DATA_DIRS: LazyLock> = LazyLock::new(|| { let local_share = format_path("~/.local/share"); let mut data_dirs: Vec = std::env::var("XDG_DATA_DIRS") .unwrap_or_else(|_| format!("/usr/share:{local_share}")) .split(':') .map(format_path) .map(PathBuf::from) .collect(); data_dirs.push(PathBuf::from(local_share)); data_dirs }); // This contains known occurrences of processes having a too distinct name from the actual app // The HashMap is used like this: // Key: The name of the executable of the process // Value: What it should be replaced with when finding out to which app it belongs static KNOWN_EXECUTABLE_NAME_EXCEPTIONS: LazyLock> = LazyLock::new(|| { HashMap::from([ ("firefox-bin", "firefox"), ("oosplash", "libreoffice"), ("soffice.bin", "libreoffice"), ("resources-processes", "resources"), ("gnome-terminal-server", "gnome-terminal"), ("chrome", "google-chrome-stable"), ]) }); static MESSAGE_LOCALES: LazyLock> = LazyLock::new(|| { let envs = ["LC_MESSAGES", "LANGUAGE", "LANG", "LC_ALL"]; let mut return_vec: Vec = Vec::new(); for env in &envs { if let Ok(locales) = std::env::var(env) { // split because LANGUAGE may contain multiple languages for locale in locales.split(':') { let locale = locale.to_string(); if !return_vec.contains(&locale) { return_vec.push(locale.clone()); } if let Some(no_character_encoding) = locale.split_once('.') { let no_character_encoding = no_character_encoding.0.to_string(); if !return_vec.contains(&no_character_encoding) { return_vec.push(no_character_encoding); } } if let Some(no_country_code) = locale.split_once('_') { let no_country_code = no_country_code.0.to_string(); if !return_vec.contains(&no_country_code) { return_vec.push(no_country_code); } } } } } debug!( "Using the following locales for app names and descriptions: {:?}", &return_vec ); return_vec }); #[derive(Debug, Clone, Default)] pub struct AppsContext { apps: HashMap, App>, processes: HashMap, gpus_with_combined_media_engine: Vec, } /// Represents an application installed on the system. It doesn't /// have to be running (i.e. have alive processes). #[derive(Debug, Clone)] pub struct App { processes: Vec, pub commandline: Option, pub executable_name: Option, pub display_name: String, pub description: Option, pub icon: Icon, pub id: Option, pub read_bytes_from_dead_processes: u64, pub write_bytes_from_dead_processes: u64, pub containerization: Containerization, } impl App { pub fn all() -> Vec { debug!("Detecting installed apps"); let start = Instant::now(); let applications_dir: Vec<_> = DATA_DIRS .iter() .map(|path| path.join("applications")) .collect(); debug!("Using the following directories for app detection: {applications_dir:?}",); let mut apps: Vec<_> = applications_dir .iter() .filter_map(|applications_path| { applications_path.read_dir().ok().map(|read| { read.filter_map(|file_res| { file_res .ok() .and_then(|file| Self::from_desktop_file(file.path()).ok()) }) }) }) .flatten() .collect(); let elapsed = start.elapsed(); info!("Detected {} apps within {elapsed:.2?}", apps.len()); apps.push(App { processes: Vec::new(), commandline: None, executable_name: None, display_name: i18n("System Processes"), description: None, icon: ThemedIcon::new("system-processes").into(), id: None, read_bytes_from_dead_processes: 0, write_bytes_from_dead_processes: 0, containerization: Containerization::None, }); apps } pub fn from_desktop_file>(file_path: P) -> Result { let file_path = file_path.as_ref(); let ini = ini::Ini::load_from_str(&read_parsed::(file_path)?)?; let desktop_entry = ini .section(Some("Desktop Entry")) .context("no desktop entry section")?; let id = desktop_entry .get("X-Flatpak") // is there a X-Flatpak section? .or_else(|| desktop_entry.get("X-SnapInstanceName")) // if not, maybe there is a X-SnapInstanceName .map(str::to_string) .or_else(|| { // if not, presume that the ID is in the file name Some(file_path.file_stem()?.to_string_lossy().to_string()) }) .context("unable to get ID of desktop file") .inspect_err(|_| trace!("Unable to get an ID for this .desktop file"))?; if let Some(reason) = APP_ID_BLOCKLIST.get(id.as_str()) { debug!("Skipping {id} because it's blocklisted ({reason})"); bail!("{id} is blocklisted (reason: {reason})") } let exec = desktop_entry.get("Exec"); let is_flatpak = exec.is_some_and(|exec| exec.starts_with("/usr/bin/flatpak run")); let commandline = exec .and_then(|exec| { RE_ENV_FILTER .captures(exec) .and_then(|captures| captures.get(1)) .map(|capture| capture.as_str()) .or(Some(exec)) }) .map(str::to_string); let executable_name = commandline.clone().map(|cmdline| { RE_FLATPAK_FILTER // filter flatpak stuff (e. g. from "/usr/bin/flatpak run … --command=inkscape …" to "inkscape") .captures(&cmdline) .and_then(|captures| captures.get(1)) .map(|capture| capture.as_str().to_string()) .unwrap_or(cmdline) // if there's no flatpak stuff, return the bare cmdline .split(' ') // filter any arguments (e. g. from "/usr/bin/firefox %u" to "/usr/bin/firefox") .nth(0) .unwrap_or_default() .split('/') // filter the executable path (e. g. from "/usr/bin/firefox" to "firefox") .nth_back(0) .unwrap_or_default() .to_string() }); if let Some(executable_name) = &executable_name { if DESKTOP_EXEC_BLOCKLIST.contains(&executable_name.as_str()) { debug!("Skipping {id} because its executable {executable_name} blocklisted…"); bail!("{id}'s executable {executable_name} is blocklisted") } } let icon = if let Some(desktop_icon) = desktop_entry.get("Icon") { if Path::new(&format_path(desktop_icon)).exists() { FileIcon::new(&File::for_path(desktop_icon)).into() } else { ThemedIcon::new(desktop_icon).into() } } else { ThemedIcon::new("generic-process").into() }; let mut display_name_opt = None; let mut description_opt = None; for locale in MESSAGE_LOCALES.iter() { if let Some(name) = desktop_entry.get(format!("Name[{locale}]")) { display_name_opt = Some(name); break; } } for locale in MESSAGE_LOCALES.iter() { if let Some(comment) = desktop_entry.get(format!("Comment[{locale}]")) { description_opt = Some(comment); break; } } let display_name = display_name_opt .or_else(|| desktop_entry.get("Name")) .unwrap_or(&id) .to_string(); let description = description_opt .or_else(|| desktop_entry.get("Comment")) .map(str::to_string); let is_snap = desktop_entry.get("X-SnapInstanceName").is_some(); let containerization = if is_flatpak { debug!( "Found Flatpak app \"{display_name}\" (ID: {id:?}) at {} with commandline `{}` (detected executable name: {})", file_path.to_string_lossy(), commandline.as_ref().unwrap_or(&"".into()), executable_name.as_ref().unwrap_or(&"".into()), ); Containerization::Flatpak } else if is_snap { debug!( "Found Snap app \"{display_name}\" (ID: {id:?}) at {} with commandline `{}` (detected executable name: {})", file_path.to_string_lossy(), commandline.as_ref().unwrap_or(&"".into()), executable_name.as_ref().unwrap_or(&"".into()), ); Containerization::Snap } else { debug!( "Found native app \"{display_name}\" (ID: {id:?}) at {} with commandline `{}` (detected executable name: {})", file_path.to_string_lossy(), commandline.as_ref().unwrap_or(&"".into()), executable_name.as_ref().unwrap_or(&"".into()), ); Containerization::None }; let id = Some(id); Ok(App { processes: Vec::new(), commandline, executable_name, display_name, description, icon, id, read_bytes_from_dead_processes: 0, write_bytes_from_dead_processes: 0, containerization, }) } /// Adds a process to the processes `HashMap` and also /// updates the `Process`' icon to the one of this /// `App` pub fn add_process(&mut self, process: &mut Process) { process.icon = self.icon.clone(); self.processes.push(process.data.pid); } pub fn remove_process(&mut self, process: &Process) { self.processes.retain(|p| *p != process.data.pid); } #[must_use] pub fn is_running(&self) -> bool { !self.processes.is_empty() } pub fn processes_iter<'a>( &'a self, apps: &'a AppsContext, ) -> impl Iterator { apps.processes_iter() .filter(move |process| self.processes.contains(&process.data.pid)) } pub fn processes_iter_mut<'a>( &'a mut self, apps: &'a mut AppsContext, ) -> impl Iterator { apps.processes_iter_mut() .filter(move |process| self.processes.contains(&process.data.pid)) } #[must_use] pub fn memory_usage(&self, apps: &AppsContext) -> usize { self.processes_iter(apps) .map(|process| process.data.memory_usage) .sum() } #[must_use] pub fn swap_usage(&self, apps: &AppsContext) -> usize { self.processes_iter(apps) .map(|process| process.data.swap_usage) .sum() } #[must_use] pub fn cpu_time_ratio(&self, apps: &AppsContext) -> f32 { self.processes_iter(apps).map(Process::cpu_time_ratio).sum() } #[must_use] pub fn read_speed(&self, apps: &AppsContext) -> f64 { self.processes_iter(apps) .filter_map(Process::read_speed) .sum() } #[must_use] pub fn read_total(&self, apps: &AppsContext) -> u64 { self.read_bytes_from_dead_processes.saturating_add( self.processes_iter(apps) .filter_map(|process| process.data.read_bytes) .sum::(), ) } #[must_use] pub fn write_speed(&self, apps: &AppsContext) -> f64 { self.processes_iter(apps) .filter_map(Process::write_speed) .sum() } #[must_use] pub fn write_total(&self, apps: &AppsContext) -> u64 { self.write_bytes_from_dead_processes.saturating_add( self.processes_iter(apps) .filter_map(|process| process.data.write_bytes) .sum::(), ) } #[must_use] pub fn gpu_usage(&self, apps: &AppsContext) -> f32 { self.processes_iter(apps).map(Process::gpu_usage).sum() } #[must_use] pub fn enc_usage(&self, apps: &AppsContext) -> f32 { self.processes_iter(apps).map(Process::enc_usage).sum() } #[must_use] pub fn dec_usage(&self, apps: &AppsContext) -> f32 { self.processes_iter(apps).map(Process::dec_usage).sum() } #[must_use] pub fn gpu_mem_usage(&self, apps: &AppsContext) -> u64 { self.processes_iter(apps).map(Process::gpu_mem_usage).sum() } #[must_use] pub fn starttime(&self, apps: &AppsContext) -> f64 { self.processes_iter(apps) .map(Process::starttime) .min_by(|a, b| a.partial_cmp(b).unwrap_or(std::cmp::Ordering::Equal)) .unwrap_or_default() } pub fn execute_process_action( &self, apps: &AppsContext, action: ProcessAction, ) -> Vec> { self.processes_iter(apps) .map(|process| process.execute_process_action(action)) .collect() } pub fn running_since(&self, apps: &AppsContext) -> Result { boot_time() .and_then(|boot_time| { boot_time .add_seconds(self.starttime(apps)) .context("unable to add seconds to boot time") }) .and_then(|time| time.format("%c").context("unable to format running_since")) } pub fn running_processes(&self) -> usize { self.processes.len() } } impl AppsContext { /// Creates a new `AppsContext` object, this operation is quite expensive /// so try to do it only one time during the lifetime of the program. /// Please call `refresh()` immediately after this function. pub fn new(gpus_with_combined_media_engine: Vec) -> AppsContext { let apps: HashMap, App> = App::all() .into_iter() .map(|app| (app.id.clone(), app)) .collect(); AppsContext { apps, processes: HashMap::new(), gpus_with_combined_media_engine, } } pub fn gpu_fraction(&self, gpu_identifier: GpuIdentifier) -> f32 { self.processes_iter() .map(|process| { ( &process.data.gpu_usage_stats, &process.gpu_usage_stats_last, process.data.timestamp, process.timestamp_last, ) }) .map(|(new, old, timestamp, timestamp_last)| { ( new.get(&gpu_identifier), old.get(&gpu_identifier), timestamp, timestamp_last, ) }) .filter_map(|(new, old, timestamp, timestamp_last)| match (new, old) { (Some(new), Some(old)) => Some((new, old, timestamp, timestamp_last)), _ => None, }) .map(|(new, old, timestamp, timestamp_last)| { let time_delta = timestamp.saturating_sub(timestamp_last); new.gfx_fraction(old, time_delta).unwrap_or_default() }) .sum::() .clamp(0.0, 1.0) } pub fn encoder_fraction(&self, gpu_identifier: GpuIdentifier) -> f32 { self.processes_iter() .map(|process| { ( &process.data.gpu_usage_stats, &process.gpu_usage_stats_last, process.data.timestamp, process.timestamp_last, ) }) .map(|(new, old, timestamp, timestamp_last)| { ( new.get(&gpu_identifier), old.get(&gpu_identifier), timestamp, timestamp_last, ) }) .filter_map(|(new, old, timestamp, timestamp_last)| match (new, old) { (Some(new), Some(old)) => Some((new, old, timestamp, timestamp_last)), _ => None, }) .map(|(new, old, timestamp, timestamp_last)| { let time_delta = timestamp.saturating_sub(timestamp_last); new.enc_fraction(old, time_delta).unwrap_or_default() }) .sum::() .clamp(0.0, 1.0) } pub fn decoder_fraction(&self, gpu_identifier: GpuIdentifier) -> f32 { self.processes_iter() .map(|process| { ( &process.data.gpu_usage_stats, &process.gpu_usage_stats_last, process.data.timestamp, process.timestamp_last, ) }) .map(|(new, old, timestamp, timestamp_last)| { ( new.get(&gpu_identifier), old.get(&gpu_identifier), timestamp, timestamp_last, ) }) .filter_map(|(new, old, timestamp, timestamp_last)| match (new, old) { (Some(new), Some(old)) => Some((new, old, timestamp, timestamp_last)), _ => None, }) .map(|(new, old, timestamp, timestamp_last)| { let time_delta = timestamp.saturating_sub(timestamp_last); new.dec_fraction(old, time_delta).unwrap_or_default() }) .sum::() .clamp(0.0, 1.0) } pub fn vram_usage(&self, gpu_identifier: GpuIdentifier) -> u64 { self.processes_iter() .flat_map(|process| { process .data .gpu_usage_stats .get(&gpu_identifier) .and_then(|gpu_identifier| gpu_identifier.mem()) }) .sum() } fn app_associated_with_process(&self, process: &Process) -> Option { // TODO: tidy this up // ↓ look for whether we can find an ID in the cgroup if DESKTOP_ENVIRONMENT_CGROUPS.contains(&process.data.cgroup.as_deref().unwrap_or_default()) { if let Some(parent) = self .apps .values() .find(|app| app.processes.contains(&process.data.parent_pid)) { return parent.id.clone(); } } if let Some(app) = self .apps .get(&Some(process.data.cgroup.clone().unwrap_or_default())) { debug!( "Associating process {} with app {:?} (ID: {:?}) based on process cgroup matching with app ID", process.data.pid, app.display_name, app.id.as_deref().unwrap_or("N/A") ); app.id.clone() } else if let Some(app) = self.apps.get(&Some(process.executable_path.clone())) { // ↑ look for whether we can find an ID in the executable path of the process debug!( "Associating process {} with app {:?} (ID: {:?}) based on process executable path matching with app ID", process.data.pid, app.display_name, app.id.as_deref().unwrap_or("N/A") ); app.id.clone() } else if let Some(app) = self.apps.get(&Some(process.executable_name.clone())) { // ↑ look for whether we can find an ID in the executable name of the process debug!( "Associating process {} with app {:?} (ID: {:?}) based on process executable name matching with app ID", process.data.pid, app.display_name, app.id.as_deref().unwrap_or("N/A") ); app.id.clone() } else { self.apps .values() .find(|app| { // ↓ probably most expensive lookup, therefore only last resort: look if the process' commandline // can be found in the app's commandline if app .commandline .as_ref() .is_some_and(|commandline| commandline == &process.executable_path) { debug!( "Associating process {} with app {:?} (ID: {:?}) based on process executable path matching with app commandline ({})", process.data.pid, app.display_name, app.id.as_deref().unwrap_or("N/A"), process.executable_path ); true } else if app .executable_name .as_ref() .is_some_and(|executable_name| executable_name == &process.executable_name) { debug!( "Associating process {} with app {:?} (ID: {:?}) based on process executable name matching with app executable name ({})", process.data.pid, app.display_name, app.id.as_deref().unwrap_or("N/A"), process.executable_name ); true } else if app .executable_name .as_ref() .and_then(|executable_name| { KNOWN_EXECUTABLE_NAME_EXCEPTIONS .get(process.executable_name.as_str()) .map(|substituted_executable_name| { substituted_executable_name == executable_name }) }) .unwrap_or(false) { debug!( "Associating process {} with app {:?} (ID: {:?}) based on match in KNOWN_EXECUTABLE_NAME_EXCEPTIONS", process.data.pid, app.display_name, app.id.as_deref().unwrap_or("N/A") ); true } else { false } }) .and_then(|app| app.id.clone()) } } pub fn get_process(&self, pid: i32) -> Option<&Process> { self.processes.get(&pid) } pub fn get_app(&self, id: &Option) -> Option<&App> { self.apps.get(id) } #[must_use] pub fn processes_iter(&self) -> impl Iterator { self.processes.values() } #[must_use] pub fn processes_iter_mut(&mut self) -> impl Iterator { self.processes.values_mut() } pub fn apps_iter(&self) -> impl Iterator { self.apps.values() } pub fn running_apps_iter(&self) -> impl Iterator { self.apps_iter().filter(|app| { app.is_running() && !app .id .as_ref() .is_some_and(|id| id.starts_with("xdg-desktop-portal")) }) } /// Refreshes the statistics about the running applications and processes. pub fn refresh(&mut self, new_process_data: Vec) { trace!("Refreshing AppsContext…"); let start = Instant::now(); let mut updated_processes = HashSet::new(); for mut process_data in new_process_data { trace!("Refreshing process {}…", process_data.pid); updated_processes.insert(process_data.pid); // this is awkward: since AppsContext is the only object around that knows what GPUs have combined media // engines, it is here where we have to manipulate the GpuUsageStats objects with PciSlots of those GPUs // whose media engine is combined (i.e. no discrimination between enc and dec stats) process_data .gpu_usage_stats .iter_mut() .filter(|(pci_slot, _)| self.gpus_with_combined_media_engine.contains(pci_slot)) .for_each(|(pci_slot, stats)| { trace!("Manually adjusting GPU stats of {} for {pci_slot} due to combined media engine", process_data.pid); if let GpuUsageStats::AmdgpuStats { gfx_ns: _, enc_ns, dec_ns, mem_bytes: _ } = stats { *enc_ns = u64::max(*enc_ns, *dec_ns); *dec_ns = u64::max(*enc_ns, *dec_ns); } }); // refresh our old processes if let Some(old_process) = self.processes.get_mut(&process_data.pid) { trace!("{} has been there before, updating it", process_data.pid); old_process.cpu_time_last = old_process .data .user_cpu_time .saturating_add(old_process.data.system_cpu_time); old_process.timestamp_last = old_process.data.timestamp; old_process.read_bytes_last = old_process.data.read_bytes; old_process.write_bytes_last = old_process.data.write_bytes; old_process.gpu_usage_stats_last = old_process.data.gpu_usage_stats.clone(); old_process.data = process_data.clone(); } else { // this is a new process, see if it belongs to a graphical app trace!("{} is a new process", process_data.pid); let mut new_process = Process::from_process_data(process_data); self.apps .get_mut(&self.app_associated_with_process(&new_process)) .unwrap() .add_process(&mut new_process); self.processes.insert(new_process.data.pid, new_process); } } // collect the I/O stats for died app processes so an app doesn't suddenly have less total disk I/O self.apps.values_mut().for_each(|app| { let (read_dead, write_dead) = app .processes .iter() .filter(|pid| !updated_processes.contains(*pid)) // only dead processes .filter_map(|pid| self.processes.get(pid)) // ignore about non-existing processes .map(|process| (process.data.read_bytes, process.data.write_bytes)) // get their read_bytes and write_bytes .filter_map( // filter out any processes whose IO stats we were not allowed to see |(read_bytes, write_bytes)| match (read_bytes, write_bytes) { (Some(read), Some(write)) => Some((read, write)), _ => None, }, ) .reduce(|sum, current| { // sum them up ( sum.0.saturating_add(current.0), sum.1.saturating_add(current.1), ) }) .unwrap_or((0, 0)); // if there were no processes, it's 0 for both app.read_bytes_from_dead_processes += read_dead; app.write_bytes_from_dead_processes += write_dead; if read_dead > 0 || write_dead > 0 { trace!( "{} has a process which died earlier, keeping I/O stats", app.display_name ); } app.processes.retain(|pid| updated_processes.contains(pid)); if !app.is_running() { app.read_bytes_from_dead_processes = 0; app.write_bytes_from_dead_processes = 0; } }); // all the not-updated processes have unfortunately died, probably self.processes .retain(|pid, _| updated_processes.contains(pid)); trace!("AppsContext refresh done within {:.2?}", start.elapsed()); } } resources-1.9.1/src/utils/battery.rs000066400000000000000000000274611510634446000175200ustar00rootroot00000000000000use std::{ fmt::Display, path::{Path, PathBuf}, str::{self, FromStr}, }; use crate::{ i18n::{i18n, i18n_f}, utils::read_parsed, }; use anyhow::{Context, Result, bail}; use lazy_regex::{Lazy, Regex, lazy_regex}; use log::trace; use super::units::convert_energy; // For (at least) Lenovo Yoga 6 13ALC7 static HEX_ENCODED_REGEX: Lazy = lazy_regex!(r"^(0x[0-9a-fA-F]{2}\s*)*$"); #[derive(Debug)] pub struct BatteryData { pub inner: Battery, pub charge: Result, pub power_usage: Result, pub health: Result, pub state: Result, pub charge_cycles: Result, } impl BatteryData { pub fn new>(path: P) -> Self { let path = path.as_ref(); trace!("Gathering battery data for {path:?}…"); let inner = Battery::from_sysfs(path); let charge = inner.charge(); let power_usage = inner.power_usage(); let health = inner.health(); let state = inner.state(); let charge_cycles = inner.charge_cycles(); let battery_data = Self { inner, charge, power_usage, health, state, charge_cycles, }; trace!( "Gathered battery data for {}: {battery_data:?}", path.to_string_lossy() ); battery_data } } #[derive(Debug, Eq, PartialEq, Copy, Clone, Default)] pub enum State { Charging, Discharging, Empty, Full, #[default] Unknown, } impl str::FromStr for State { type Err = anyhow::Error; fn from_str(s: &str) -> Result { let state = match s.to_ascii_lowercase().as_str() { "charging" => State::Charging, "discharging" => State::Discharging, "empty" => State::Empty, "full" => State::Full, _ => State::Unknown, }; Ok(state) } } impl Display for State { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!( f, "{}", match self { State::Charging => i18n("Charging"), State::Discharging => i18n("Discharging"), State::Empty => i18n("Empty"), State::Full => i18n("Full"), State::Unknown => i18n("Unknown"), } ) } } #[derive(Debug, Eq, PartialEq, Copy, Clone, Default)] pub enum Technology { NickelMetalHydride, NickelCadmium, NickelZinc, LeadAcid, LithiumIon, LithiumIronPhosphate, LithiumPolymer, RechargeableAlkalineManganese, #[default] Unknown, } impl str::FromStr for Technology { type Err = anyhow::Error; fn from_str(s: &str) -> Result { let tech = match s.to_ascii_lowercase().as_str() { "nimh" => Technology::NickelMetalHydride, "nicd" => Technology::NickelCadmium, "nizn" => Technology::NickelZinc, "pb" | "pbac" => Technology::LeadAcid, "li-i" | "li-ion" | "lion" => Technology::LithiumIon, "life" => Technology::LithiumIronPhosphate, "lip" | "lipo" | "li-poly" => Technology::LithiumPolymer, "ram" => Technology::RechargeableAlkalineManganese, _ => Technology::Unknown, }; Ok(tech) } } impl Display for Technology { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!( f, "{}", match self { Technology::NickelMetalHydride => i18n("Nickel-Metal Hydride"), Technology::NickelCadmium => i18n("Nickel-Cadmium"), Technology::NickelZinc => i18n("Nickel-Zinc"), Technology::LeadAcid => i18n("Lead-Acid"), Technology::LithiumIon => i18n("Lithium-Ion"), Technology::LithiumIronPhosphate => i18n("Lithium Iron Phosphate"), Technology::LithiumPolymer => i18n("Lithium Polymer"), Technology::RechargeableAlkalineManganese => i18n("Rechargeable Alkaline Managanese"), Technology::Unknown => i18n("N/A"), } ) } } #[derive(Debug, Clone, Default, PartialEq)] pub struct Battery { pub sysfs_path: PathBuf, pub manufacturer: Option, pub model_name: Option, pub design_capacity: Option, pub technology: Technology, } impl Battery { pub fn get_sysfs_paths() -> Result> { let mut list = Vec::new(); let entries = std::fs::read_dir("/sys/class/power_supply")?; for entry in entries { let entry = entry?; let path = entry.path(); if Self::is_valid_power_supply(&path) { list.push(path); } } Ok(list) } pub fn is_valid_power_supply>(path: P) -> bool { let path = path.as_ref(); //type == "Battery" //scope != "Device" (HID device batteries) let power_supply_type_is_battery = read_parsed::(path.join("type")) .is_ok_and(|ps_type| ps_type.trim() == "Battery"); let power_supply_scope_is_not_device = read_parsed::(path.join("scope")) .map(|ps_scope| ps_scope.trim() != "Device") .unwrap_or(true); power_supply_type_is_battery && power_supply_scope_is_not_device } pub fn from_sysfs>(sysfs_path: P) -> Battery { let sysfs_path = sysfs_path.as_ref().to_path_buf(); trace!("Creating Battery object of {sysfs_path:?}…"); let manufacturer = read_parsed::(sysfs_path.join("manufacturer")) .map(|s| Self::untangle_weird_encoding(s.replace('\n', ""))) .ok(); let model_name = read_parsed::(sysfs_path.join("model_name")) .map(|s| Self::untangle_weird_encoding(s.replace('\n', ""))) .ok(); let technology = Technology::from_str( &read_parsed(sysfs_path.join("technology")) .map(|s: String| s.replace('\n', "")) .unwrap_or_default(), ) .unwrap_or_default(); let design_capacity = read_parsed::(sysfs_path.join("energy_full_design")) .context("unable to find any energy_full_design") .map(|capacity| capacity / 1_000_000.0) .ok(); let battery = Battery { sysfs_path: sysfs_path.clone(), manufacturer, model_name, design_capacity, technology, }; trace!("Created Battery object of {sysfs_path:?}: {battery:?}"); battery } // apparently some manufacturers like to for whatever reason reencode the manufacturer and model name in hex or // similar, this function will try to untangle it fn untangle_weird_encoding>(s: S) -> String { if HEX_ENCODED_REGEX.is_match(s.as_ref()) { String::from_utf8_lossy( &s.as_ref() .split_whitespace() .flat_map(|hex| u8::from_str_radix(&hex.replace("0x", ""), 16)) .map(|byte| if byte == 0x0 { b' ' } else { byte }) // gtk will crash when encountering NUL .collect::>(), ) .to_string() } else { s.as_ref().to_string() } } pub fn display_name(&self) -> String { if let Some(design_capacity) = self.design_capacity { let converted_energy = convert_energy(design_capacity, true); i18n_f("{} Battery", &[&converted_energy]) } else { i18n("Battery") } } pub fn charge(&self) -> Result { read_parsed::(self.sysfs_path.join("capacity")) .context("unable to read capacity sysfs file") .map(|percent| f64::from(percent) / 100.0) .or_else(|_| self.charge_from_energy()) } pub fn charge_from_energy(&self) -> Result { let energy_now = read_parsed::(self.sysfs_path.join("energy_now")) .context("unable to read energy_now sysfs file"); let energy_full = read_parsed::(self.sysfs_path.join("energy_full")) .context("unable to read energy_full sysfs file"); if let (Ok(energy_now), Ok(energy_full)) = (energy_now, energy_full) { Ok(energy_now as f64 / energy_full as f64) } else { bail!("no charge from energy information found"); } } pub fn health(&self) -> Result { let energy_full = read_parsed::(self.sysfs_path.join("energy_full")) .context("unable to read energy_full sysfs file"); let energy_full_design = read_parsed::(self.sysfs_path.join("energy_full_design")) .context("unable to read energy_full_design sysfs file"); if let (Ok(energy_full), Ok(energy_full_design)) = (energy_full, energy_full_design) { Ok(energy_full as f64 / energy_full_design as f64) } else { let charge_full = read_parsed::(self.sysfs_path.join("charge_full")) .context("unabread_parsed(ysfs file"); let charge_full_design = read_parsed::(self.sysfs_path.join("charge_full_design")) .context("unable to read charge_full_design sysfs file"); if let (Ok(charge_full), Ok(charge_full_design)) = (charge_full, charge_full_design) { Ok(charge_full as f64 / charge_full_design as f64) } else { bail!("no health information found") } } } pub fn power_usage(&self) -> Result { read_parsed::(self.sysfs_path.join("power_now")) .context("unable to read power_now file") .map(|microwatts| microwatts.abs() / 1_000_000.0) .or_else(|_| self.power_usage_from_voltage_and_current()) } fn power_usage_from_voltage_and_current(&self) -> Result { let voltage = read_parsed::(self.sysfs_path.join("voltage_now")) .map(|microvolts| microvolts / 1_000_000.0) .context("unable to parse voltage_now sysfs file")?; let current = read_parsed::(self.sysfs_path.join("current_now")) .map(|microamps| microamps / 1_000_000.0) .context("unable to parse current_now sysfs file")?; Ok(f64::abs(voltage * current)) } pub fn state(&self) -> Result { State::from_str(&read_parsed::(self.sysfs_path.join("status"))?) } pub fn charge_cycles(&self) -> Result { read_parsed(self.sysfs_path.join("cycle_count")) .context("unable to parse cycle_count sysfs file") } } #[cfg(test)] mod test { use super::Battery; use pretty_assertions::assert_eq; #[test] fn dont_untangle_untangled_string() { let untangled_string = String::from("This is a normal string"); assert_eq!( Battery::untangle_weird_encoding(untangled_string), String::from("This is a normal string") ) } #[test] fn dont_untangle_non_hex_bytes() { let non_hex_bytes = String::from("0xxy 0x4g"); assert_eq!( Battery::untangle_weird_encoding(non_hex_bytes), String::from("0xxy 0x4g") ) } #[test] fn untangle_tangled_string() { let tangled_string = String::from("0x41 0x42 0x43 0x58 0x59 0x5A"); assert_eq!( Battery::untangle_weird_encoding(tangled_string), String::from("ABCXYZ") ); } #[test] fn untangle_tangled_string_with_nul() { let tangled_string = String::from("0x41 0x42 0x43 0x00 0x44"); assert_eq!( Battery::untangle_weird_encoding(tangled_string), String::from("ABC D") ); } } resources-1.9.1/src/utils/cpu.rs000066400000000000000000000300741510634446000166270ustar00rootroot00000000000000use anyhow::{Context, Result, anyhow, bail}; use glob::glob; use lazy_regex::{Lazy, Regex, lazy_regex}; use log::{debug, trace, warn}; use std::{ collections::HashMap, path::{Path, PathBuf}, sync::LazyLock, }; use crate::utils::read_parsed; const PROC_STAT: &str = "/proc/stat"; const KNOWN_HWMONS: &[&str] = &["zenpower", "coretemp", "k10temp"]; const KNOWN_THERMAL_ZONES: &[&str] = &["cpu-thermal", "x86_pkg_temp", "acpitz"]; static RE_LSCPU_MODEL_NAME: Lazy = lazy_regex!(r"Model name:\s*(.*)"); static RE_LSCPU_ARCHITECTURE: Lazy = lazy_regex!(r"Architecture:\s*(.*)"); static RE_LSCPU_CPUS: Lazy = lazy_regex!(r"CPU\(s\):\s*(.*)"); static RE_LSCPU_SOCKETS: Lazy = lazy_regex!(r"Socket\(s\):\s*(.*)"); static RE_LSCPU_CORES: Lazy = lazy_regex!(r"Core\(s\) per socket:\s*(.*)"); static RE_LSCPU_VIRTUALIZATION: Lazy = lazy_regex!(r"Virtualization:\s*(.*)"); static RE_LSCPU_MAX_MHZ: Lazy = lazy_regex!(r"CPU max MHz:\s*(.*)"); static RE_PROC_STAT: Lazy = lazy_regex!( r"cpu\d+ *(?P\d*) *(?P\d*) *(?P\d*) *(?P\d*) *(?P\d*) *(?P\d*) *(?P\d*) *(?P\d*) *(?P\d*) *(?P\d*)" ); static CPU_TEMPERATURE_PATH: LazyLock> = LazyLock::new(|| { search_for_hwmons(KNOWN_HWMONS) .or_else(|| search_for_thermal_zones(KNOWN_THERMAL_ZONES)) .or_else(|| { warn!("No CPU temperature sensor found!"); None }) }); fn search_for_first_temp>(base_path: S) -> Option { glob(&format!("{}/temp*_input", base_path.as_ref())) .unwrap() .flatten() .next() } fn search_for_hwmons(names: &[&'static str]) -> Option { let mut hwmon_map = HashMap::new(); trace!("Collecting hwmons for CPU temperature…"); for path in (glob("/sys/class/hwmon/hwmon*").unwrap()).flatten() { trace!("Found hwmon {path:?}"); if let Ok(read_name) = read_parsed::(path.join("name")) { let read_name = read_name.to_string(); trace!("{path:?} is a hwmon for {read_name}"); if let Some(first_temp) = search_for_first_temp(path.to_string_lossy()) { hwmon_map.insert(read_name, first_temp); } } } for name in names { if let Some(hwmon) = hwmon_map.remove(*name) { debug!("CPU temperature sensor located at {hwmon:?} ({name}, type: hwmon)"); return Some(hwmon); } } trace!("No hwmon CPU temperature sensor found"); None } fn search_for_thermal_zones(types: &[&'static str]) -> Option { let mut thermal_zone_map = HashMap::new(); trace!("Collecting thermal zones for CPU temperature…"); for path in (glob("/sys/class/thermal/thermal_zone*").unwrap()).flatten() { trace!("Found thermal zone {path:?}"); if let Ok(read_type) = read_parsed::(path.join("type")) { let read_type = read_type.trim_end().to_string(); trace!("{path:?} is a thermal zone for {read_type}"); thermal_zone_map.insert(read_type, path.join("temp")); } } for r#type in types { if let Some(hwmon) = thermal_zone_map.remove(*r#type) { debug!("CPU temperature sensor located at {hwmon:?} ({type}, type: thermal zone)"); return Some(hwmon); } } trace!("No thermal zone CPU temperature sensor found"); None } #[derive(Debug)] pub struct CpuData { pub new_thread_usages: Vec>, pub temperature: Result, pub frequencies: Vec>, } impl CpuData { pub fn new(logical_cpus: usize) -> Self { trace!("Gathering CPU data…"); let new_thread_usages = get_cpu_usage(); let temperature = get_temperature(); let mut frequencies = Vec::with_capacity(logical_cpus); for i in 0..logical_cpus { let freq = get_cpu_freq(i); frequencies.push(freq.ok()); } let cpu_data = Self { new_thread_usages, temperature, frequencies, }; trace!("Gathered CPU data: {cpu_data:?}"); cpu_data } } #[derive(Debug, Clone, Default, PartialEq)] pub struct CpuInfo { pub model_name: Option, pub architecture: Option, pub logical_cpus: Option, pub physical_cpus: Option, pub sockets: Option, pub virtualization: Option, pub max_speed: Option, } impl CpuInfo { fn parse_lscpu>(lscpu_output: S) -> Self { let lscpu_output = lscpu_output.as_ref(); let model_name = RE_LSCPU_MODEL_NAME .captures(lscpu_output) .and_then(|captures| { captures .get(1) .map(|capture| Self::trade_mark_symbols(capture.as_str())) }); let architecture = RE_LSCPU_ARCHITECTURE .captures(lscpu_output) .and_then(|captures| captures.get(1).map(|capture| capture.as_str().into())); let sockets = RE_LSCPU_SOCKETS .captures(lscpu_output) .and_then(|captures| { captures .get(1) .and_then(|capture| capture.as_str().parse().ok()) }); let logical_cpus = RE_LSCPU_CPUS.captures(lscpu_output).and_then(|captures| { captures .get(1) .and_then(|capture| capture.as_str().parse().ok()) }); let physical_cpus = RE_LSCPU_CORES.captures(lscpu_output).and_then(|captures| { captures .get(1) .and_then(|capture| capture.as_str().parse::().ok()) .map(|int| int.saturating_mul(sockets.unwrap_or(1))) }); let virtualization = RE_LSCPU_VIRTUALIZATION .captures(lscpu_output) .and_then(|captures| captures.get(1).map(|capture| capture.as_str().into())); let max_speed = RE_LSCPU_MAX_MHZ .captures(lscpu_output) .and_then(|captures| { captures.get(1).and_then(|capture| { capture .as_str() .parse::() .ok() .map(|float| float * 1_000_000.0) }) }); Self { model_name, architecture, logical_cpus, physical_cpus, sockets, virtualization, max_speed, } } fn trade_mark_symbols>(s: S) -> String { s.as_ref() .replace("(R)", "®") .replace("(tm)", "™") .replace("(TM)", "™") } /// Returns a `CPUInfo` struct populated with values gathered from `lscpu`. /// /// # Errors /// /// Will return `Err` if the are problems during reading or parsing /// of the `lscpu` command pub fn get() -> Result { String::from_utf8( std::process::Command::new("lscpu") .env("LC_ALL", "C") .output() .context("unable to run lscpu, is util-linux installed?")? .stdout, ) .context("unable to parse lscpu output to UTF-8") .map(Self::parse_lscpu) } } /// Returns the frequency of the given CPU `core` /// /// # Errors /// /// Will return `Err` if the are problems during reading or parsing /// of the corresponding file in sysfs pub fn get_cpu_freq(core: usize) -> Result { trace!("Finding CPU frequency for core {core}…"); read_parsed::(format!( "/sys/devices/system/cpu/cpu{core}/cpufreq/scaling_cur_freq" )) .map(|x| x * 1000) .inspect(|freq| trace!("Frequency of core {core}: {freq} Hz")) } fn parse_proc_stat_line>(line: S) -> Result<(u64, u64)> { let captures = RE_PROC_STAT .captures(line.as_ref()) .context("using regex to parse /proc/stat failed")?; let idle = captures .name("idle") .and_then(|x| x.as_str().parse::().ok()) .context("unable to get idle time")?; let iowait = captures .name("iowait") .and_then(|x| x.as_str().parse::().ok()) .context("unable to get idle time")?; let total = captures .iter() .skip(1) .flat_map(|cap| { cap.and_then(|x| x.as_str().parse::().ok()) .ok_or_else(|| anyhow!("unable to sum CPU times from /proc/stat")) }) .sum(); Ok((idle.saturating_add(iowait), total)) } fn parse_proc_stat>(stat: S) -> Vec> { trace!("Parsing {PROC_STAT}…"); stat.as_ref() .lines() .skip(1) .filter(|line| line.starts_with("cpu")) .map(parse_proc_stat_line) .collect() } /// Returns the CPU usage of either all cores combined (if supplied argument is `None`), /// or of a specific thread (taken from the supplied argument starting at 0) /// Please keep in mind that this is the total CPU time since boot, you have to do delta /// calculations yourself. The tuple's layout is: `(idle_time, total_time)` /// /// # Errors /// /// Will return `Err` if the are problems during reading or parsing /// of /proc/stat pub fn get_cpu_usage() -> Vec> { trace!("Reading {PROC_STAT}…"); let raw = read_parsed::("/proc/stat") .context("unable to read /proc/stat") .unwrap_or_default(); parse_proc_stat(raw) } /// Returns the CPU temperature. /// /// # Errors /// /// Will return `Err` if there was no way to read the CPU temperature. pub fn get_temperature() -> Result { if let Some(path) = CPU_TEMPERATURE_PATH.as_ref() { read_sysfs_thermal(path) } else { bail!("no CPU temperature sensor found") } } fn read_sysfs_thermal>(path: P) -> Result { let path = path.as_ref(); read_parsed::(path) .map(|t| t / 1000f32) .with_context(|| format!("unable to read {}", path.display())) } #[cfg(test)] mod test { use pretty_assertions::assert_eq; use crate::utils::cpu::CpuInfo; const LSCPU_OUTPUT: &str = concat!( "Architecture: x86_64\n", " CPU op-mode(s): 32-bit, 64-bit\n", " Address sizes: 48 bits physical, 48 bits virtual\n", " Byte Order: Little Endian\n", "CPU(s): 16\n", " On-line CPU(s) list: 0-7\n", "Vendor ID: UnauthenticIngenuineManufacturer\n", " Model name: UIM(R) Abacus(tm) 10\n", " CPU family: 1\n", " Model: 2\n", " Thread(s) per core: 2\n", " Core(s) per socket: 4\n", " Socket(s): 2\n", " Stepping: 2\n", " Frequency boost: enabled\n", " CPU(s) scaling MHz: 100%\n", " CPU max MHz: 3.0000\n", " CPU min MHz: 2.0000\n", " BogoMIPS: 0.0\n", "Virtualization features: \n", " Virtualization: Abacus-V\n", "Caches (sum of all): \n", " L1d: 256 KiB (8 instances)\n", " L1i: 256 KiB (8 instances)\n", " L2: 4 MiB (8 instances)\n", " L3: 32 MiB (1 instance)\n", "NUMA: \n", " NUMA node(s): 1\n", " NUMA node0 CPU(s): 0-15\n", ); #[test] fn lscpu_complex() { let parsed = CpuInfo::parse_lscpu(LSCPU_OUTPUT); let expected = CpuInfo { model_name: Some("UIM® Abacus™ 10".into()), architecture: Some("x86_64".into()), logical_cpus: Some(16), physical_cpus: Some(8), sockets: Some(2), virtualization: Some("Abacus-V".into()), max_speed: Some(3000000.0), }; assert_eq!(parsed, expected) } } resources-1.9.1/src/utils/drive.rs000066400000000000000000000371761510634446000171630ustar00rootroot00000000000000use super::units::convert_storage; use crate::i18n::{i18n, i18n_f}; use crate::utils::link::{Link, LinkData}; use crate::utils::read_parsed; use anyhow::{Context, Result, bail}; use gtk::gio::{Icon, ThemedIcon}; use lazy_regex::{Lazy, Regex, lazy_regex}; use log::trace; use path_dedot::ParseDot; use process_data::pci_slot::PciSlot; use std::{ collections::HashMap, fmt::Display, path::{Path, PathBuf}, str::FromStr, }; const PATH_SYSFS: &str = "/sys/block"; static RE_DRIVE: Lazy = lazy_regex!( r" *(?P[0-9]*) *(?P[0-9]*) *(?P[0-9]*) *(?P[0-9]*) *(?P[0-9]*) *(?P[0-9]*) *(?P[0-9]*) *(?P[0-9]*) *(?P[0-9]*) *(?P[0-9]*) *(?P[0-9]*) *(?P[0-9]*) *(?P[0-9]*) *(?P[0-9]*) *(?P[0-9]*) *(?P[0-9]*) *(?P[0-9]*)" ); static RE_ATA_LINK: Lazy = lazy_regex!(r"(^link(\d+))$"); static RE_ATA_SLOT: Lazy = lazy_regex!(r"(^.+?/ata(\d+))/"); static RE_USB_SLOT: Lazy = lazy_regex!(r"(^.+?/usb(\d+))/(.+?)/"); #[derive(Debug)] pub struct DriveData { pub inner: Drive, pub is_virtual: bool, pub writable: Result, pub removable: Result, pub disk_stats: HashMap, pub capacity: Result, pub link: Result, } impl DriveData { pub fn new>(path: P) -> Self { let path = path.as_ref(); trace!("Gathering drive data for {path:?}…"); let inner = Drive::from_sysfs(path); let is_virtual = inner.is_virtual(); let writable = inner.writable(); let removable = inner.removable(); let disk_stats = inner.sys_stats().unwrap_or_default(); let capacity = inner.capacity(); let link = inner.link(); let drive_data = Self { inner, is_virtual, writable, removable, disk_stats, capacity, link, }; trace!( "Gathered drive data for {}: {drive_data:?}", path.to_string_lossy() ); drive_data } } #[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)] pub enum DriveType { CdDvdBluray, Emmc, Flash, Floppy, Hdd, LoopDevice, MappedDevice, Nvme, Raid, RamDisk, Ssd, ZfsVolume, Zram, #[default] Unknown, } #[derive(Debug, Clone, Default, PartialEq, Eq, Hash)] pub enum DriveSlot { Pci(PciSlot), Ata(AtaSlot), Usb(UsbSlot), #[default] Unknown, } #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] pub struct AtaSlot { pub ata_device: u8, pub ata_link: u8, } #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct UsbSlot { pub usb_bus: u8, pub usb_device: String, } #[derive(Debug, Clone, Default, Eq)] pub struct Drive { pub model: Option, pub drive_type: DriveType, pub block_device: String, pub slot: DriveSlot, pub sysfs_path: PathBuf, } impl Display for DriveType { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!( f, "{}", match self { DriveType::CdDvdBluray => i18n("CD/DVD/Blu-ray Drive"), DriveType::Emmc => i18n("eMMC Storage"), DriveType::Flash => i18n("Flash Storage"), DriveType::Floppy => i18n("Floppy Drive"), DriveType::Hdd => i18n("Hard Disk Drive"), DriveType::LoopDevice => i18n("Loop Device"), DriveType::MappedDevice => i18n("Mapped Device"), DriveType::Nvme => i18n("NVMe Drive"), DriveType::Unknown => i18n("N/A"), DriveType::Raid => i18n("Software Raid"), DriveType::RamDisk => i18n("RAM Disk"), DriveType::Ssd => i18n("Solid State Drive"), DriveType::ZfsVolume => i18n("ZFS Volume"), DriveType::Zram => i18n("Compressed RAM Disk (zram)"), } ) } } impl PartialEq for Drive { fn eq(&self, other: &Self) -> bool { self.block_device == other.block_device } } impl Drive { /// Creates a `Drive` using a SysFS Path /// /// # Errors /// /// Will return `Err` if the are errors during /// reading or parsing pub fn from_sysfs>(sysfs_path: P) -> Drive { let path = sysfs_path.as_ref().to_path_buf(); trace!("Creating Drive object of {path:?}"); let block_device = path .file_name() .expect("sysfs path ends with \"..\"?") .to_string_lossy() .to_string(); let mut drive = Self::default(); drive.sysfs_path.clone_from(&path); drive.block_device = block_device; drive.model = drive.model().ok().map(|model| model.trim().to_string()); drive.drive_type = drive.drive_type().unwrap_or_default(); drive.slot = drive.slot().unwrap_or_default(); trace!("Created Drive object of {path:?}: {drive:?}"); drive } /// Returns the SysFS Paths of possible drives /// /// # Errors /// /// Will return `Err` if the are errors during /// reading or parsing pub fn get_sysfs_paths() -> Result> { let mut list = Vec::new(); trace!("Finding entries in {PATH_SYSFS}"); let entries = std::fs::read_dir(PATH_SYSFS)?; for entry in entries { let entry = entry?; let block_device = entry.file_name().to_string_lossy().to_string(); trace!("Found block device {block_device}"); if block_device.is_empty() { continue; } list.push(entry.path()); } Ok(list) } pub fn display_name(&self) -> String { let capacity_formatted = convert_storage(self.capacity().unwrap_or_default() as f64, true); match self.drive_type { DriveType::CdDvdBluray => i18n("CD/DVD/Blu-ray Drive"), DriveType::Floppy => i18n("Floppy Drive"), DriveType::LoopDevice => i18n_f("{} Loop Device", &[&capacity_formatted]), DriveType::MappedDevice => i18n_f("{} Mapped Device", &[&capacity_formatted]), DriveType::Raid => i18n_f("{} RAID", &[&capacity_formatted]), DriveType::RamDisk => i18n_f("{} RAM Disk", &[&capacity_formatted]), DriveType::Zram => i18n_f("{} zram Device", &[&capacity_formatted]), DriveType::ZfsVolume => i18n_f("{} ZFS Volume", &[&capacity_formatted]), _ => i18n_f("{} Drive", &[&capacity_formatted]), } } /// Returns the current SysFS stats for the drive /// /// # Errors /// /// Will return `Err` if the are errors during /// reading or parsing pub fn sys_stats(&self) -> Result> { let stat = read_parsed::(self.sysfs_path.join("stat"))?; let captures = RE_DRIVE .captures(&stat) .with_context(|| format!("unable to parse /sys/block/{}/stat", self.block_device))?; Ok(RE_DRIVE .capture_names() .flatten() .filter_map(|named_capture| { Some(( named_capture.to_string(), captures.name(named_capture)?.as_str().parse().ok()?, )) }) .collect()) } fn drive_type(&self) -> Result { if self.block_device.starts_with("nvme") { Ok(DriveType::Nvme) } else if self.block_device.starts_with("mmc") { Ok(DriveType::Emmc) } else if self.block_device.starts_with("fd") { Ok(DriveType::Floppy) } else if self.block_device.starts_with("sr") { Ok(DriveType::CdDvdBluray) } else if self.block_device.starts_with("zram") { Ok(DriveType::Zram) } else if self.block_device.starts_with("md") { Ok(DriveType::Raid) } else if self.block_device.starts_with("loop") { Ok(DriveType::LoopDevice) } else if self.block_device.starts_with("dm") { Ok(DriveType::MappedDevice) } else if self.block_device.starts_with("ram") { Ok(DriveType::RamDisk) } else if self.block_device.starts_with("zd") { Ok(DriveType::ZfsVolume) } else if let Ok(rotational) = read_parsed::(self.sysfs_path.join("queue/rotational")) { if rotational != 0 { Ok(DriveType::Hdd) } else if self.removable()? { Ok(DriveType::Flash) } else { Ok(DriveType::Ssd) } } else { Ok(DriveType::Unknown) } } /// Returns, whether the drive is removable /// /// # Errors /// /// Will return `Err` if the are errors during /// reading or parsing pub fn removable(&self) -> Result { read_parsed::(self.sysfs_path.join("removable")) .map(|rem| rem != 0) .context("unable to parse removable sysfs file") } /// Returns, whether the drive is writable /// /// # Errors /// /// Will return `Err` if the are errors during /// reading or parsing pub fn writable(&self) -> Result { read_parsed::(self.sysfs_path.join("ro")) .map(|ro| ro == 0) .context("unable to parse ro sysfs file") } /// Returns the capacity of the drive **in bytes** /// /// # Errors /// /// Will return `Err` if the are errors during /// reading or parsing pub fn capacity(&self) -> Result { read_parsed::(self.sysfs_path.join("size")) .map(|sectors| sectors * 512) .context("unable to parse size sysfs file") } /// Returns the model information of the drive /// /// # Errors /// /// Will return `Err` if the are errors during /// reading or parsing pub fn model(&self) -> Result { read_parsed(self.sysfs_path.join("device/model")) .context("unable to parse model sysfs file") } /// Returns the Link info of the drive /// /// # Errors /// /// Will return `Err` if there are errors during /// reading or parsing, or if the drive link type is not supported pub fn link(&self) -> Result { match &self.slot { DriveSlot::Pci(slot) => Ok(Link::Pcie(LinkData::from_pci_slot(slot)?)), DriveSlot::Ata(slot) => Ok(Link::Sata(LinkData::from_ata_slot(slot)?)), DriveSlot::Usb(slot) => Ok(Link::Usb(LinkData::from_usb_slot(slot)?)), DriveSlot::Unknown => bail!("unsupported drive connection type"), } } pub fn slot(&self) -> Result { if let Ok(pci_slot) = self.pci_slot() { Ok(DriveSlot::Pci(pci_slot)) } else if let Ok(ata_slot) = self.ata_slot() { Ok(DriveSlot::Ata(ata_slot)) } else if let Ok(usb_slot) = self.usb_slot() { Ok(DriveSlot::Usb(usb_slot)) } else { bail!("unsupported drive slot type") } } fn pci_slot(&self) -> Result { let pci_address_path = self.sysfs_path.join("device").join("address"); Ok(PciSlot::from_str(&read_parsed::( pci_address_path, )?)?) } fn ata_slot(&self) -> Result { let symlink = std::fs::read_link(&self.sysfs_path) .context("Could not read sysfs_path as symlink")? .to_string_lossy() .to_string(); // ../../devices/pci0000:40/0000:40:08.3/0000:47:00.0/ata25/host24/target24:0:0/24:0:0:0/block/sda let ata_sub_path_match = RE_ATA_SLOT .captures(&symlink) .context("No ata match found, probably no ata device")?; let ata_sub_path = ata_sub_path_match .get(1) .context("No ata match found, probably no ata device")? .as_str(); let ata_device = ata_sub_path_match .get(2) .context("could not match digits in ata")? .as_str() .parse::()?; let ata_path = Path::new(&self.sysfs_path).join("..").join(ata_sub_path); let dot_parsed_path = ata_path.parse_dot()?.clone(); let mut sub_dirs = std::fs::read_dir(dot_parsed_path).context("Could not read ata path")?; let ata_link = sub_dirs .find_map(|x| { x.ok().and_then(|x| { RE_ATA_LINK .captures(&x.file_name().to_string_lossy()) .and_then(|captures| captures.get(2)) .and_then(|capture| capture.as_str().parse::().ok()) }) }) .context("No ata link number found")?; Ok(AtaSlot { ata_device, ata_link, }) } fn usb_slot(&self) -> Result { let symlink = std::fs::read_link(&self.sysfs_path) .context("Could not read sysfs_path as symlink")? .to_string_lossy() .to_string(); // ../../devices/pci0000:00/0000:00:08.1/0000:0e:00.3/usb4/4-2/4-2:1.0/host6/target6:0:0/6:0:0:0/block/sdb let usb_match = RE_USB_SLOT .captures(&symlink) .context("No usb match found, probably no usb device")?; let usb_bus = usb_match .get(2) .and_then(|capture| capture.as_str().parse::().ok()) .context("could not match digits in usb")?; let usb_device = usb_match .get(3) .context("could not find usb device")? .as_str() .to_string(); Ok(UsbSlot { usb_bus, usb_device, }) } /// Returns the World-Wide Identification of the drive /// /// # Errors /// /// Will return `Err` if the are errors during /// reading or parsing pub fn wwid(&self) -> Result { read_parsed(self.sysfs_path.join("device/wwid")) } /// Returns the appropriate Icon for the type of drive pub fn icon(&self) -> Icon { match self.drive_type { DriveType::CdDvdBluray => ThemedIcon::new("cd-dvd-bluray-symbolic").into(), DriveType::Emmc => ThemedIcon::new("emmc-symbolic").into(), DriveType::Flash => ThemedIcon::new("flash-storage-symbolic").into(), DriveType::Floppy => ThemedIcon::new("floppy-symbolic").into(), DriveType::Hdd => ThemedIcon::new("hdd-symbolic").into(), DriveType::LoopDevice => ThemedIcon::new("loop-device-symbolic").into(), DriveType::MappedDevice => ThemedIcon::new("mapped-device-symbolic").into(), DriveType::Nvme => ThemedIcon::new("nvme-symbolic").into(), DriveType::Raid => ThemedIcon::new("raid-symbolic").into(), DriveType::RamDisk => ThemedIcon::new("ram-disk-symbolic").into(), DriveType::Ssd => ThemedIcon::new("ssd-symbolic").into(), DriveType::ZfsVolume => ThemedIcon::new("zfs-symbolic").into(), DriveType::Zram => ThemedIcon::new("zram-symbolic").into(), DriveType::Unknown => Self::default_icon(), } } pub fn is_virtual(&self) -> bool { match self.drive_type { DriveType::LoopDevice | DriveType::MappedDevice | DriveType::Raid | DriveType::RamDisk | DriveType::ZfsVolume | DriveType::Zram => true, _ => self.capacity().unwrap_or(0) == 0, } } pub fn default_icon() -> Icon { ThemedIcon::new("unknown-drive-type-symbolic").into() } } resources-1.9.1/src/utils/gpu/000077500000000000000000000000001510634446000162615ustar00rootroot00000000000000resources-1.9.1/src/utils/gpu/amd.rs000066400000000000000000000120301510634446000173640ustar00rootroot00000000000000use anyhow::{Context, Result, bail}; use lazy_regex::{Lazy, Regex, lazy_regex}; use log::{debug, trace, warn}; use process_data::gpu_usage::GpuIdentifier; use std::{ collections::HashMap, path::{Path, PathBuf}, sync::LazyLock, time::Instant, }; use crate::utils::{ IS_FLATPAK, pci::{self, Device}, read_parsed, }; use super::GpuImpl; static RE_AMDGPU_IDS: Lazy = lazy_regex!(r"([0-9A-F]{4}),\s*([0-9A-F]{2}),\s*(.*)"); static AMDGPU_IDS: LazyLock> = LazyLock::new(|| { AmdGpu::read_libdrm_ids() .inspect_err(|e| warn!("Unable to parse amdgpu.ids!\n{e}\n{}", e.backtrace())) .unwrap_or_default() }); #[derive(Debug, Clone, Default)] pub struct AmdGpu { pub device: Option<&'static Device>, pub gpu_identifier: GpuIdentifier, pub driver: String, sysfs_path: PathBuf, first_hwmon_path: Option, combined_media_engine: bool, } impl AmdGpu { pub fn new( device: Option<&'static Device>, gpu_identifier: GpuIdentifier, driver: String, sysfs_path: PathBuf, first_hwmon_path: Option, ) -> Self { let mut gpu = Self { device, gpu_identifier, driver, sysfs_path, first_hwmon_path, combined_media_engine: false, }; if let Ok(vcn_version) = read_parsed::( gpu.sysfs_path() .join("device/ip_discovery/die/0/UVD/0/major"), ) { if vcn_version >= 4 { gpu.combined_media_engine = true; } } gpu } pub fn read_libdrm_ids() -> Result> { let path = if *IS_FLATPAK { PathBuf::from("/run/host/usr/share/libdrm/amdgpu.ids") } else { PathBuf::from("/usr/share/libdrm/amdgpu.ids") }; debug!("Parsing {}…", path.to_string_lossy()); let start = Instant::now(); let mut map = HashMap::new(); let amdgpu_ids_raw = read_parsed::(&path)?; for capture in RE_AMDGPU_IDS.captures_iter(&amdgpu_ids_raw) { if let (Some(device_id), Some(revision), Some(name)) = (capture.get(1), capture.get(2), capture.get(3)) { let device_id = u16::from_str_radix(device_id.as_str().trim(), 16).unwrap(); let revision = u8::from_str_radix(revision.as_str().trim(), 16).unwrap(); let name = name.as_str().into(); trace!("Found {name} ({device_id:04x}, rev {revision:02x})"); map.insert((device_id, revision), name); } } let elapsed = start.elapsed(); debug!( "Successfully parsed {} within {elapsed:.2?} ({} entries)", path.to_string_lossy(), map.len() ); Ok(map) } } impl GpuImpl for AmdGpu { fn device(&self) -> Option<&'static Device> { self.device } fn gpu_identifier(&self) -> GpuIdentifier { self.gpu_identifier } fn driver(&self) -> &str { &self.driver } fn sysfs_path(&self) -> &Path { &self.sysfs_path } fn first_hwmon(&self) -> Option<&Path> { self.first_hwmon_path.as_deref() } fn name(&self) -> Result { let revision = u8::from_str_radix( read_parsed::(self.sysfs_path().join("device/revision"))? .strip_prefix("0x") .context("missing hex prefix")?, 16, )?; Ok((*AMDGPU_IDS) .get(&(self.device().map_or(0, pci::Device::pid), revision)) .cloned() .unwrap_or_else(|| { if let Ok(drm_name) = self.drm_name() { format!("AMD Radeon Graphics ({drm_name})") } else { "AMD Radeon Graphics".into() } })) } fn usage(&self) -> Result { self.drm_usage().map(|usage| usage as f64 / 100.0) } fn encode_usage(&self) -> Result { bail!("encode usage not implemented for AMD") } fn decode_usage(&self) -> Result { bail!("decode usage not implemented for AMD") } fn combined_media_engine(&self) -> Result { Ok(self.combined_media_engine) } fn used_vram(&self) -> Result { self.drm_used_vram().map(|usage| usage as u64) } fn total_vram(&self) -> Result { self.drm_total_vram().map(|usage| usage as u64) } fn temperature(&self) -> Result { self.hwmon_temperature() } fn power_usage(&self) -> Result { self.hwmon_power_usage() } fn core_frequency(&self) -> Result { self.hwmon_core_frequency() } fn vram_frequency(&self) -> Result { self.hwmon_vram_frequency() } fn power_cap(&self) -> Result { self.hwmon_power_cap() } fn power_cap_max(&self) -> Result { self.hwmon_power_cap_max() } } resources-1.9.1/src/utils/gpu/intel.rs000066400000000000000000000152041510634446000177440ustar00rootroot00000000000000use anyhow::{Result, bail}; use process_data::gpu_usage::GpuIdentifier; use strum_macros::{Display, EnumString}; use std::{ path::{Path, PathBuf}, str::FromStr, }; use crate::utils::{pci::Device, read_parsed}; use super::GpuImpl; pub const DRIVER_NAMES: &[&str] = &["i915", "xe"]; #[derive(Debug, Clone, Display, EnumString, PartialEq, PartialOrd, Eq, Ord)] #[strum(ascii_case_insensitive)] #[strum(serialize_all = "lowercase")] pub enum IntelGpuDriver { I915, Xe, #[strum(transparent)] #[strum(default)] Other(String), } impl Default for IntelGpuDriver { fn default() -> Self { Self::Other(String::new()) } } #[derive(Debug, Clone)] pub struct IntelGpu { pub device: Option<&'static Device>, pub gpu_identifier: GpuIdentifier, pub driver: IntelGpuDriver, driver_string: String, sysfs_path: PathBuf, first_hwmon_path: Option, /* // for some reason intel states used energy in joules instead of power in watts… last_energy_usage: Cell, last_energy_usage_timestamp: Cell,*/ } impl IntelGpu { pub fn new( device: Option<&'static Device>, gpu_identifier: GpuIdentifier, driver: String, sysfs_path: PathBuf, first_hwmon_path: Option, ) -> Self { Self { device, gpu_identifier, driver: IntelGpuDriver::from_str(&driver).unwrap_or_default(), driver_string: driver, sysfs_path, first_hwmon_path, /*last_energy_usage: Cell::new(0), last_energy_usage_timestamp: Cell::new(0.0),*/ } } } impl GpuImpl for IntelGpu { fn device(&self) -> Option<&'static Device> { self.device } fn gpu_identifier(&self) -> GpuIdentifier { self.gpu_identifier } fn driver(&self) -> &str { &self.driver_string } fn sysfs_path(&self) -> &Path { &self.sysfs_path } fn first_hwmon(&self) -> Option<&Path> { self.first_hwmon_path.as_deref() } fn name(&self) -> Result { self.drm_name() } fn usage(&self) -> Result { self.drm_usage().map(|usage| usage as f64 / 100.0) } fn encode_usage(&self) -> Result { bail!("encode usage not implemented for Intel") } fn decode_usage(&self) -> Result { bail!("decode usage not implemented for Intel") } fn combined_media_engine(&self) -> Result { Ok(true) } fn used_vram(&self) -> Result { self.drm_used_vram().map(|usage| usage as u64) } fn total_vram(&self) -> Result { self.drm_total_vram().map(|usage| usage as u64) } fn temperature(&self) -> Result { match self.driver { IntelGpuDriver::Xe => read_parsed::(self.hwmon_path()?.join("temp2_input")) .map(|millicelsius| millicelsius / 1000.0), _ => self.hwmon_temperature(), } } /// For Intel GPUs, this returns the average power usage since last time this function was called. /// First call will always return Err fn power_usage(&self) -> Result { /* TODO: Get this working properly (or wait until xe gets its act together) let new_energy = read_parsed::(self.hwmon_path()?.join("energy1_input")) .or_else(|_| read_parsed::(self.hwmon_path()?.join("energy2_input"))) .map(|microjoules| microjoules.saturating_div(1_000_000))?; let new_timestamp = unix_as_secs_f64(); let old_energy = self.last_energy_usage.get(); let old_timestamp = self.last_energy_usage_timestamp.get(); self.last_energy_usage.set(new_energy); self.last_energy_usage_timestamp.set(new_timestamp); if self.last_energy_usage_timestamp.get() == 0.0 { bail!("first check") } let energy_delta = (new_energy.saturating_sub(old_energy)) as f64; let timestamp_delta = new_timestamp - old_timestamp; Ok(energy_delta / timestamp_delta)*/ self.hwmon_power_usage() } fn core_frequency(&self) -> Result { match self.driver { IntelGpuDriver::Xe => Ok(read_parsed::( self.sysfs_path().join("device/tile0/gt0/freq0/cur_freq"), )? * 1_000_000.0), _ => Ok(read_parsed::(self.sysfs_path().join("gt_cur_freq_mhz"))? * 1_000_000.0), } } fn vram_frequency(&self) -> Result { self.hwmon_vram_frequency() } fn power_cap(&self) -> Result { /* TODO: Get this working properly (or wait until xe gets its act together) match self.driver { IntelGpuDriver::I915 => read_parsed::(self.hwmon_path()?.join("power1_max")) .or_else(|_| read_parsed::(self.hwmon_path()?.join("power1_crit"))) .or_else(|_| read_parsed::(self.hwmon_path()?.join("power1_rated_max"))) .map(|microwatts| microwatts / 1_000_000.0), IntelGpuDriver::Xe => read_parsed::(self.hwmon_path()?.join("power2_max")) .or_else(|_| read_parsed::(self.hwmon_path()?.join("power2_crit"))) .or_else(|_| read_parsed::(self.hwmon_path()?.join("power2_rated_max"))) .map(|microwatts| microwatts / 1_000_000.0), _ => self.hwmon_temperature(), }*/ self.hwmon_power_cap() } fn power_cap_max(&self) -> Result { self.hwmon_power_cap_max() } } #[cfg(test)] mod test { use std::str::FromStr; use super::IntelGpuDriver; use pretty_assertions::assert_eq; const I915_NAME: &str = "i915"; const XE_NAME: &str = "xe"; const OTHER_NAME: &str = "other_driver"; #[test] fn i915_driver_from_str() { let driver = IntelGpuDriver::from_str(I915_NAME).unwrap(); assert_eq!(driver, IntelGpuDriver::I915); } #[test] fn xe_driver_from_str() { let driver = IntelGpuDriver::from_str(XE_NAME).unwrap(); assert_eq!(driver, IntelGpuDriver::Xe); } #[test] fn other_driver_from_str() { let driver = IntelGpuDriver::from_str(OTHER_NAME).unwrap(); assert_eq!(driver, IntelGpuDriver::Other(OTHER_NAME.to_string())); } #[test] fn i915_driver_to_str() { assert_eq!(IntelGpuDriver::I915.to_string(), I915_NAME); } #[test] fn xe_driver_to_str() { assert_eq!(IntelGpuDriver::Xe.to_string(), XE_NAME); } #[test] fn other_driver_to_str() { assert_eq!( IntelGpuDriver::Other(OTHER_NAME.to_string()).to_string(), OTHER_NAME ); } } resources-1.9.1/src/utils/gpu/mod.rs000066400000000000000000000254601510634446000174150ustar00rootroot00000000000000mod amd; mod intel; mod nvidia; mod other; mod v3d; use anyhow::{Context, Result, bail}; use lazy_regex::{Lazy, Regex, lazy_regex}; use log::{debug, info, trace}; use process_data::{gpu_usage::GpuIdentifier, pci_slot::PciSlot}; use v3d::V3dGpu; use std::{ path::{Path, PathBuf}, str::FromStr, }; use self::{amd::AmdGpu, intel::IntelGpu, nvidia::NvidiaGpu, other::OtherGpu}; use crate::utils::{ link::{Link, LinkData}, read_parsed, }; use crate::{ i18n::i18n, utils::{pci::Device, read_uevent}, }; use glob::glob; use super::pci::Vendor; pub const VID_AMD: u16 = 0x1002; pub const VID_INTEL: u16 = 0x8086; pub const VID_NVIDIA: u16 = 0x10DE; const BLOCKLISTED_DRIVERS: &[&str] = &["simple-framebuffer", "evdi"]; static RE_CARD_ENUMARATOR: Lazy = lazy_regex!(r"(\d+)\/?$"); #[derive(Debug)] pub struct GpuData { pub gpu_identifier: GpuIdentifier, pub usage_fraction: Option, // in case of a GPU with a combined media engine, encode_fraction will contain the combined usage pub encode_fraction: Option, pub decode_fraction: Option, pub total_vram: Option, pub used_vram: Option, pub clock_speed: Option, pub vram_speed: Option, pub temperature: Option, pub power_usage: Option, pub power_cap: Option, pub power_cap_max: Option, pub link: Option, pub nvidia: bool, } impl GpuData { pub fn new(gpu: &Gpu) -> Self { let gpu_identifier = gpu.gpu_identifier(); trace!("Gathering GPU data for {gpu_identifier}…"); let usage_fraction = gpu.usage().map(|usage| usage.clamp(0.0, 1.0)).ok(); let encode_fraction = gpu.encode_usage().map(|usage| usage.clamp(0.0, 1.0)).ok(); let decode_fraction = gpu.decode_usage().map(|usage| usage.clamp(0.0, 1.0)).ok(); let total_vram = gpu.total_vram().ok(); let used_vram = gpu.used_vram().ok(); let clock_speed = gpu.core_frequency().ok(); let vram_speed = gpu.vram_frequency().ok(); let temperature = gpu.temperature().ok(); let power_usage = gpu.power_usage().ok(); let power_cap = gpu.power_cap().ok(); let power_cap_max = gpu.power_cap_max().ok(); let link = gpu.link().ok(); let nvidia = matches!(gpu, Gpu::Nvidia(_)); let gpu_data = Self { gpu_identifier, usage_fraction, encode_fraction, decode_fraction, total_vram, used_vram, clock_speed, vram_speed, temperature, power_usage, power_cap, power_cap_max, link, nvidia, }; trace!("Gathered GPU data for {gpu_identifier}: {gpu_data:?}"); gpu_data } } #[derive(Debug, Clone)] pub enum Gpu { Amd(AmdGpu), Intel(IntelGpu), Nvidia(NvidiaGpu), V3d(V3dGpu), Other(OtherGpu), } impl Default for Gpu { fn default() -> Self { Gpu::Other(OtherGpu::default()) } } pub trait GpuImpl { fn device(&self) -> Option<&'static Device>; fn gpu_identifier(&self) -> GpuIdentifier; fn driver(&self) -> &str; fn sysfs_path(&self) -> &Path; fn first_hwmon(&self) -> Option<&Path>; fn name(&self) -> Result; fn usage(&self) -> Result; fn encode_usage(&self) -> Result; fn decode_usage(&self) -> Result; fn combined_media_engine(&self) -> Result; fn used_vram(&self) -> Result; fn total_vram(&self) -> Result; fn temperature(&self) -> Result; fn power_usage(&self) -> Result; fn core_frequency(&self) -> Result; fn vram_frequency(&self) -> Result; fn power_cap(&self) -> Result; fn power_cap_max(&self) -> Result; // These are preimplemented ways of getting information through the DRM and hwmon interface. // It's also used as a fallback. fn drm_name(&self) -> Result { Ok(self.device().context("no device")?.name().to_owned()) } fn drm_usage(&self) -> Result { read_parsed(self.sysfs_path().join("device/gpu_busy_percent")) } fn drm_used_vram(&self) -> Result { read_parsed(self.sysfs_path().join("device/mem_info_vram_used")) } fn drm_total_vram(&self) -> Result { read_parsed(self.sysfs_path().join("device/mem_info_vram_total")) } fn hwmon_path(&self) -> Result<&Path> { self.first_hwmon().context("no hwmon found") } fn hwmon_temperature(&self) -> Result { read_parsed::(self.hwmon_path()?.join("temp1_input")) .map(|millicelsius| millicelsius / 1000.0) } fn hwmon_power_usage(&self) -> Result { read_parsed::(self.hwmon_path()?.join("power1_average")) .or_else(|_| read_parsed::(self.hwmon_path()?.join("power1_input"))) .map(|microwatts| microwatts / 1_000_000.0) } fn hwmon_core_frequency(&self) -> Result { read_parsed::(self.hwmon_path()?.join("freq1_input")) } fn hwmon_vram_frequency(&self) -> Result { read_parsed::(self.hwmon_path()?.join("freq2_input")) } fn hwmon_power_cap(&self) -> Result { read_parsed::(self.hwmon_path()?.join("power1_cap")) .map(|microwatts| microwatts / 1_000_000.0) } fn hwmon_power_cap_max(&self) -> Result { read_parsed::(self.hwmon_path()?.join("power1_cap_max")) .map(|microwatts| microwatts / 1_000_000.0) } } impl std::ops::Deref for Gpu { type Target = dyn GpuImpl; fn deref(&self) -> &Self::Target { match self { Gpu::Amd(gpu) => gpu, Gpu::Intel(gpu) => gpu, Gpu::Nvidia(gpu) => gpu, Gpu::V3d(gpu) => gpu, Gpu::Other(gpu) => gpu, } } } impl Gpu { /// Returns a `Vec` of all GPUs currently found in the system. /// /// # Errors /// /// Will return `Err` if there are problems detecting /// the GPUs in the system pub fn get_gpus() -> Result> { debug!("Searching for GPUs…"); let mut gpu_vec: Vec = Vec::new(); for (i, entry) in glob("/sys/class/drm/card?")?.flatten().enumerate() { if let Ok(gpu) = Self::from_sysfs_path(entry, i) { gpu_vec.push(gpu); } } debug!("{} GPUs found", gpu_vec.len()); Ok(gpu_vec) } fn from_sysfs_path>(path: P, i: usize) -> Result { let path = path.as_ref().to_path_buf(); trace!("Creating GPU object of {path:?}…"); let enumarator = RE_CARD_ENUMARATOR .captures(&path.to_string_lossy()) .and_then(|captures| captures.get(1)) .and_then(|capture| capture.as_str().parse().ok()) .unwrap_or(i); let sysfs_device_path = path.join("device"); let uevent_contents = read_uevent(sysfs_device_path.join("uevent"))?; let (device, vid, pid) = if let Some(pci_line) = uevent_contents.get("PCI_ID") { let (vid_str, pid_str) = pci_line.split_once(':').unwrap_or(("0", "0")); let vid = u16::from_str_radix(vid_str, 16).unwrap_or_default(); let pid = u16::from_str_radix(pid_str, 16).unwrap_or_default(); (Device::from_vid_pid(vid, pid), vid, pid) } else { (None, 0, 0) }; let mut hwmon_vec: Vec = Vec::new(); for hwmon in glob(&format!( "{}/hwmon/hwmon?", sysfs_device_path.to_string_lossy() ))? .flatten() { trace!("Found hwmon at {hwmon:?}"); hwmon_vec.push(hwmon); } let pci_slot = PciSlot::from_str( &uevent_contents .get("PCI_SLOT_NAME") .map_or_else(|| i18n("N/A"), std::string::ToString::to_string), ) .context("can't turn PCI string to struct"); let gpu_identifier = if let Ok(pci_slot) = pci_slot { GpuIdentifier::PciSlot(pci_slot) } else { GpuIdentifier::Enumerator(enumarator) }; let driver = uevent_contents .get("DRIVER") .map_or_else(|| i18n("N/A"), std::string::ToString::to_string); if BLOCKLISTED_DRIVERS.contains(&driver.as_str()) { bail!("blocklisted driver"); } let (gpu, gpu_category) = if vid == VID_AMD || driver == "amdgpu" { ( Gpu::Amd(AmdGpu::new( device, gpu_identifier, driver, path.to_path_buf(), hwmon_vec.first().cloned(), )), "AMD", ) } else if vid == VID_INTEL || intel::DRIVER_NAMES.contains(&driver.as_str()) { ( Gpu::Intel(IntelGpu::new( device, gpu_identifier, driver, path.to_path_buf(), hwmon_vec.first().cloned(), )), "Intel", ) } else if vid == VID_NVIDIA || driver == "nvidia" { ( Gpu::Nvidia(NvidiaGpu::new( device, gpu_identifier, driver, path.to_path_buf(), hwmon_vec.first().cloned(), )), "NVIDIA", ) } else if driver == "v3d" { ( Gpu::V3d(V3dGpu::new( device, gpu_identifier, driver, path.to_path_buf(), hwmon_vec.first().cloned(), )), "v3d", ) } else { ( Gpu::Other(OtherGpu::new( device, gpu_identifier, driver, path.to_path_buf(), hwmon_vec.first().cloned(), )), "Other", ) }; info!( "Found GPU \"{}\" (Identifier: {} · PCI ID: {vid:x}:{pid:x} · Category: {gpu_category})", gpu.name().unwrap_or("".into()), gpu.gpu_identifier(), ); trace!("Created GPU object of {path:?}: {gpu:?}"); Ok(gpu) } pub fn get_vendor(&self) -> Result<&'static Vendor> { Ok(self.device().context("no device")?.vendor()) } pub fn link(&self) -> Result { if let GpuIdentifier::PciSlot(pci_slot) = self.gpu_identifier() { let pcie_link = LinkData::from_pci_slot(&pci_slot)?; Ok(Link::Pcie(pcie_link)) } else { bail!("Could not retrieve PciSlot from Gpu"); } } } resources-1.9.1/src/utils/gpu/nvidia.rs000066400000000000000000000155001510634446000201020ustar00rootroot00000000000000use anyhow::{Context, Result}; use log::{debug, warn}; use nvml_wrapper::{ Nvml, enum_wrappers::device::{Clock, TemperatureSensor}, error::NvmlError, }; use process_data::gpu_usage::GpuIdentifier; use std::{ path::{Path, PathBuf}, sync::LazyLock, }; static NVML: LazyLock> = LazyLock::new(|| { let nvml = Nvml::init(); if let Err(error) = nvml.as_ref() { warn!("Connection to NVML failed, reason: {error}"); if *IS_FLATPAK { warn!( "This can occur when the version of the NVIDIA Flatpak runtime (org.freedesktop.Platform.GL.nvidia) \ and the version of the natively installed NVIDIA driver do not match. Consider updating both your system \ and Flatpak packages before opening an issue." ); } } else { debug!("Successfully connected to NVML"); } nvml }); use crate::utils::{IS_FLATPAK, pci::Device}; use super::GpuImpl; #[derive(Debug, Default, Clone)] pub struct NvidiaGpu { pub device: Option<&'static Device>, pub gpu_identifier: GpuIdentifier, pub driver: String, pci_slot_string: String, sysfs_path: PathBuf, first_hwmon_path: Option, } impl NvidiaGpu { pub fn new( device: Option<&'static Device>, gpu_identifier: GpuIdentifier, driver: String, sysfs_path: PathBuf, first_hwmon_path: Option, ) -> Self { Self { device, gpu_identifier, driver, pci_slot_string: gpu_identifier.to_string(), sysfs_path, first_hwmon_path, } } fn nvml_device>(pci_slot: S) -> Result> { NVML.as_ref() .context("unable to establish NVML connection") .and_then(|nvml| { nvml.device_by_pci_bus_id(pci_slot.as_ref()) .context("failed to get GPU through NVML with PCI slot") }) } } impl GpuImpl for NvidiaGpu { fn device(&self) -> Option<&'static Device> { self.device } fn gpu_identifier(&self) -> GpuIdentifier { self.gpu_identifier } fn driver(&self) -> &str { &self.driver } fn sysfs_path(&self) -> &Path { &self.sysfs_path } fn first_hwmon(&self) -> Option<&Path> { self.first_hwmon_path.as_deref() } fn name(&self) -> Result { Self::nvml_device(&self.pci_slot_string) .and_then(|dev| dev.name().context("unable to get name through NVML")) .or_else(|_| self.drm_name()) } fn usage(&self) -> Result { Self::nvml_device(&self.pci_slot_string) .and_then(|dev| { dev.utilization_rates() .context("unable to get utilization rates through NVML") }) .map(|usage| f64::from(usage.gpu) / 100.0) .or_else(|_| self.drm_usage().map(|usage| usage as f64 / 100.0)) } fn encode_usage(&self) -> Result { Self::nvml_device(&self.pci_slot_string) .and_then(|dev| { dev.encoder_utilization() .context("unable to get utilization rates through NVML") }) .map(|usage| f64::from(usage.utilization) / 100.0) .context("encode usage not implemented for NVIDIA not using the nvidia driver") } fn decode_usage(&self) -> Result { Self::nvml_device(&self.pci_slot_string) .and_then(|dev| { dev.decoder_utilization() .context("unable to get utilization rates through NVML") }) .map(|usage| f64::from(usage.utilization) / 100.0) .context("decode usage not implemented for NVIDIA not using the nvidia driver") } fn combined_media_engine(&self) -> Result { Ok(false) } fn used_vram(&self) -> Result { Self::nvml_device(&self.pci_slot_string) .and_then(|dev| { dev.memory_info() .context("unable to get memory info through NVML") }) .map(|memory_info| memory_info.used) .or_else(|_| self.drm_used_vram().map(|usage| usage as u64)) } fn total_vram(&self) -> Result { Self::nvml_device(&self.pci_slot_string) .and_then(|dev| { dev.memory_info() .context("unable to get memory info through NVML") }) .map(|memory_info| memory_info.total) .or_else(|_| self.drm_total_vram().map(|usage| usage as u64)) } fn temperature(&self) -> Result { Self::nvml_device(&self.pci_slot_string) .and_then(|dev| { dev.temperature(TemperatureSensor::Gpu) .context("unable to get temperatures through NVML") }) .map(f64::from) .or_else(|_| self.hwmon_temperature()) } fn power_usage(&self) -> Result { Self::nvml_device(&self.pci_slot_string) .and_then(|dev| { dev.power_usage() .context("unable to get power usage through NVML") }) .map(|power_usage| (f64::from(power_usage)) / 1000.0) .or_else(|_| self.hwmon_power_usage()) } fn core_frequency(&self) -> Result { Self::nvml_device(&self.pci_slot_string) .and_then(|dev| { dev.clock_info(Clock::Graphics) .context("unable to get core frequency through NVML") }) .map(|frequency| (f64::from(frequency)) * 1_000_000.0) .or_else(|_| self.hwmon_core_frequency()) } fn vram_frequency(&self) -> Result { Self::nvml_device(&self.pci_slot_string) .and_then(|dev| { dev.clock_info(Clock::Memory) .context("unable to get vram frequency through NVML") }) .map(|frequency| (f64::from(frequency)) * 1_000_000.0) .or_else(|_| self.hwmon_vram_frequency()) } fn power_cap(&self) -> Result { Self::nvml_device(&self.pci_slot_string) .and_then(|dev| { dev.power_management_limit() .context("unable to get power cap through NVML") }) .map(|cap| (f64::from(cap)) / 1000.0) .or_else(|_| self.hwmon_power_usage()) } fn power_cap_max(&self) -> Result { Self::nvml_device(&self.pci_slot_string) .and_then(|dev| { dev.power_management_limit_constraints() .context("unable to get temperatures through NVML") }) .map(|constraints| (f64::from(constraints.max_limit)) / 1000.0) .or_else(|_| self.hwmon_power_cap_max()) } } resources-1.9.1/src/utils/gpu/other.rs000066400000000000000000000045201510634446000177510ustar00rootroot00000000000000use anyhow::{Result, bail}; use process_data::gpu_usage::GpuIdentifier; use std::path::{Path, PathBuf}; use crate::utils::pci::Device; use super::GpuImpl; #[derive(Debug, Clone, Default)] pub struct OtherGpu { pub device: Option<&'static Device>, pub gpu_identifier: GpuIdentifier, pub driver: String, sysfs_path: PathBuf, first_hwmon_path: Option, } impl OtherGpu { pub fn new( device: Option<&'static Device>, gpu_identifier: GpuIdentifier, driver: String, sysfs_path: PathBuf, first_hwmon_path: Option, ) -> Self { Self { device, gpu_identifier, driver, sysfs_path, first_hwmon_path, } } } impl GpuImpl for OtherGpu { fn device(&self) -> Option<&'static Device> { self.device } fn gpu_identifier(&self) -> GpuIdentifier { self.gpu_identifier } fn driver(&self) -> &str { &self.driver } fn sysfs_path(&self) -> &Path { &self.sysfs_path } fn first_hwmon(&self) -> Option<&Path> { self.first_hwmon_path.as_deref() } fn name(&self) -> Result { self.drm_name() } fn usage(&self) -> Result { self.drm_usage().map(|usage| usage as f64 / 100.0) } fn encode_usage(&self) -> Result { bail!("encode usage not implemented for other") } fn decode_usage(&self) -> Result { bail!("decode usage not implemented for other") } fn combined_media_engine(&self) -> Result { bail!("can't know for other GPUs") } fn used_vram(&self) -> Result { self.drm_used_vram().map(|usage| usage as u64) } fn total_vram(&self) -> Result { self.drm_total_vram().map(|usage| usage as u64) } fn temperature(&self) -> Result { self.hwmon_temperature() } fn power_usage(&self) -> Result { self.hwmon_power_usage() } fn core_frequency(&self) -> Result { self.hwmon_core_frequency() } fn vram_frequency(&self) -> Result { self.hwmon_vram_frequency() } fn power_cap(&self) -> Result { self.hwmon_power_cap() } fn power_cap_max(&self) -> Result { self.hwmon_power_cap_max() } } resources-1.9.1/src/utils/gpu/v3d.rs000066400000000000000000000045741510634446000173350ustar00rootroot00000000000000use anyhow::{Result, bail}; use process_data::gpu_usage::GpuIdentifier; use std::path::{Path, PathBuf}; use crate::utils::{pci::Device, read_parsed}; use super::GpuImpl; #[derive(Debug, Clone, Default)] pub struct V3dGpu { pub device: Option<&'static Device>, pub gpu_identifier: GpuIdentifier, pub driver: String, sysfs_path: PathBuf, first_hwmon_path: Option, } impl V3dGpu { pub fn new( device: Option<&'static Device>, gpu_identifier: GpuIdentifier, driver: String, sysfs_path: PathBuf, first_hwmon_path: Option, ) -> Self { Self { device, gpu_identifier, driver, sysfs_path, first_hwmon_path, } } } impl GpuImpl for V3dGpu { fn device(&self) -> Option<&'static Device> { self.device } fn gpu_identifier(&self) -> GpuIdentifier { self.gpu_identifier } fn driver(&self) -> &str { &self.driver } fn sysfs_path(&self) -> &Path { &self.sysfs_path } fn first_hwmon(&self) -> Option<&Path> { self.first_hwmon_path.as_deref() } fn name(&self) -> Result { self.drm_name() } fn usage(&self) -> Result { self.drm_usage().map(|usage| usage as f64 / 100.0) } fn encode_usage(&self) -> Result { bail!("encode usage not implemented for v3d") } fn decode_usage(&self) -> Result { bail!("decode usage not implemented for v3d") } fn combined_media_engine(&self) -> Result { Ok(true) } fn used_vram(&self) -> Result { self.drm_used_vram().map(|usage| usage as u64) } fn total_vram(&self) -> Result { self.drm_total_vram().map(|usage| usage as u64) } fn temperature(&self) -> Result { self.hwmon_temperature() } fn power_usage(&self) -> Result { self.hwmon_power_usage() } fn core_frequency(&self) -> Result { read_parsed::(self.sysfs_path().join("gt_cur_freq_mhz")).map(|freq| freq * 1_000_000.0) } fn vram_frequency(&self) -> Result { self.hwmon_vram_frequency() } fn power_cap(&self) -> Result { self.hwmon_power_cap() } fn power_cap_max(&self) -> Result { self.hwmon_power_cap_max() } } resources-1.9.1/src/utils/link/000077500000000000000000000000001510634446000164235ustar00rootroot00000000000000resources-1.9.1/src/utils/link/mod.rs000066400000000000000000000030111510634446000175430ustar00rootroot00000000000000mod pcie; mod sata; mod usb; mod wifi; use crate::i18n::i18n; use crate::utils::link::pcie::PcieLinkData; use crate::utils::link::sata::SataSpeed; use crate::utils::link::usb::UsbSpeed; use crate::utils::link::wifi::WifiGeneration; use anyhow::Result; use std::fmt::{Display, Formatter}; #[derive(Debug, Default)] pub enum Link { Pcie(LinkData), Sata(LinkData), Usb(LinkData), Wifi(LinkData), #[default] Unknown, } #[derive(Debug)] pub struct LinkData { pub current: T, pub max: Result, } impl Display for LinkData where T: Display, T: PartialEq, { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { let has_different_max = { if let Ok(max) = self.max.as_ref() { self.current != *max } else { false } }; if has_different_max { write!(f, "{} / {}", self.current, self.max.as_ref().unwrap()) } else { write!(f, "{}", self.current) } } } impl Display for Link { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { write!( f, "{}", match self { Link::Pcie(data) => data.to_string(), Link::Sata(data) => data.to_string(), Link::Usb(data) => data.to_string(), Link::Wifi(data) => data.to_string(), Link::Unknown => i18n("N/A"), } ) } } resources-1.9.1/src/utils/link/pcie.rs000066400000000000000000000232431510634446000177150ustar00rootroot00000000000000use crate::utils::link::LinkData; use anyhow::{Context, Error, anyhow, bail}; use log::trace; use process_data::pci_slot::PciSlot; use std::fmt::{Display, Formatter}; use std::path::Path; use std::str::FromStr; #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub struct PcieLinkData { pub speed: PcieSpeed, pub width: usize, } #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub enum PcieSpeed { Pcie10, Pcie20, Pcie30, Pcie40, Pcie50, Pcie60, Pcie70, Pcie80, } impl LinkData { pub fn from_pci_slot(pci_slot: &PciSlot) -> anyhow::Result { let pcie_dir = format!("/sys/bus/pci/devices/{pci_slot}/"); let pcie_folder = Path::new(pcie_dir.as_str()); if pcie_folder.exists() { return Self::read_pcie_link_data(pcie_folder); } bail!("Could not find PCIe address entry for {pci_slot}"); } fn read_pcie_link_data>(path: P) -> anyhow::Result { let path = path.as_ref(); trace!("Reading PCIe link data for {path:?}…"); let current_pcie_speed_raw = std::fs::read_to_string(path.join("current_link_speed")) .map(|x| x.trim().to_string()) .context("Could not read current link speed")?; let current_pcie_width_raw = std::fs::read_to_string(path.join("current_link_width")) .map(|x| x.trim().to_string()) .context("Could not read current link width")?; //Consider max values as optional let max_pcie_speed_raw = std::fs::read_to_string(path.join("max_link_speed")) .map(|x| x.trim().to_string()) .context("Could not read max link speed"); let max_pcie_width_raw = std::fs::read_to_string(path.join("max_link_width")) .map(|x| x.trim().to_string()) .context("Could not read max link width"); let current = PcieLinkData::parse(¤t_pcie_speed_raw, ¤t_pcie_width_raw) .context("Could not parse PCIE link data")?; let max = if let (Ok(speed), Ok(width)) = (max_pcie_speed_raw, max_pcie_width_raw) { PcieLinkData::parse(&speed, &width) } else { Err(anyhow!("Could not parse max PCIe link")) }; Ok(Self { current, max }) } } impl PcieLinkData { pub fn parse>(speed_raw: S, width_raw: S) -> anyhow::Result { let speed = PcieSpeed::from_str(speed_raw.as_ref())?; let width = width_raw .as_ref() .parse::() .context("Could not parse PCIe width")?; Ok(PcieLinkData { speed, width }) } } impl Display for PcieLinkData { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { write!(f, "{} ×{}", self.speed, self.width) } } impl Display for PcieSpeed { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { write!( f, "{}", match self { PcieSpeed::Pcie10 => "PCIe 1.0", PcieSpeed::Pcie20 => "PCIe 2.0", PcieSpeed::Pcie30 => "PCIe 3.0", PcieSpeed::Pcie40 => "PCIe 4.0", PcieSpeed::Pcie50 => "PCIe 5.0", PcieSpeed::Pcie60 => "PCIe 6.0", PcieSpeed::Pcie70 => "PCIe 7.0", PcieSpeed::Pcie80 => "PCIe 8.0", } ) } } impl FromStr for PcieSpeed { type Err = Error; /// https://en.wikipedia.org/wiki/PCI_Express#Comparison_table fn from_str(s: &str) -> std::result::Result { match s { "2.5 GT/s PCIe" => Ok(PcieSpeed::Pcie10), "5.0 GT/s PCIe" => Ok(PcieSpeed::Pcie20), "8.0 GT/s PCIe" => Ok(PcieSpeed::Pcie30), "16.0 GT/s PCIe" => Ok(PcieSpeed::Pcie40), "32.0 GT/s PCIe" => Ok(PcieSpeed::Pcie50), "64.0 GT/s PCIe" => Ok(PcieSpeed::Pcie60), "128.0 GT/s PCIe" => Ok(PcieSpeed::Pcie70), "256.0 GT/s PCIe" => Ok(PcieSpeed::Pcie80), _ => Err(anyhow!("Could not parse PCIe speed: '{s}'")), } } } #[cfg(test)] mod test { use crate::utils::link::LinkData; use crate::utils::link::pcie::{PcieLinkData, PcieSpeed}; use anyhow::anyhow; use std::collections::HashMap; use std::str::FromStr; #[test] fn parse_pcie_link_speeds() { let map = HashMap::from([ ("2.5 GT/s PCIe", PcieSpeed::Pcie10), ("5.0 GT/s PCIe", PcieSpeed::Pcie20), ("8.0 GT/s PCIe", PcieSpeed::Pcie30), ("16.0 GT/s PCIe", PcieSpeed::Pcie40), ("32.0 GT/s PCIe", PcieSpeed::Pcie50), ("64.0 GT/s PCIe", PcieSpeed::Pcie60), ("128.0 GT/s PCIe", PcieSpeed::Pcie70), ("256.0 GT/s PCIe", PcieSpeed::Pcie80), ]); for input in map.keys() { let result = PcieSpeed::from_str(input); assert!(result.is_ok(), "Could not parse PCIe speed for '{input}'"); let expected = map[input]; pretty_assertions::assert_eq!(expected, result.unwrap()); } } #[test] fn parse_pcie_link_speeds_failure() { let invalid = vec!["999.0 GT/s PCIe", "SOMETHING_ELSE", ""]; for input in invalid { let result = PcieSpeed::from_str(input); assert!( result.is_err(), "Could parse PCIe speed for '{input}' while we don't expect that" ); } } #[test] fn display_pcie_link_speeds() { let map = HashMap::from([ (PcieSpeed::Pcie10, "PCIe 1.0"), (PcieSpeed::Pcie20, "PCIe 2.0"), (PcieSpeed::Pcie30, "PCIe 3.0"), (PcieSpeed::Pcie40, "PCIe 4.0"), (PcieSpeed::Pcie50, "PCIe 5.0"), (PcieSpeed::Pcie60, "PCIe 6.0"), (PcieSpeed::Pcie70, "PCIe 7.0"), (PcieSpeed::Pcie80, "PCIe 8.0"), ]); for input in map.keys() { let result = input.to_string(); let expected = map[input]; pretty_assertions::assert_str_eq!(expected, result); } } #[test] fn display_pcie_link_data() { let map = get_test_pcie_link_data(); for input in map.keys() { let result = input.to_string(); let expected = map[input]; pretty_assertions::assert_str_eq!(expected, result); } } #[test] fn parse_pcie_link_data_invalid_input() { let result = PcieLinkData::parse("random", "noise"); assert!(result.is_err()); } #[test] fn display_pcie_link_identical_current_max_only_once() { let map = get_test_pcie_link_data(); for link_data in map.keys() { let input = LinkData { current: *link_data, max: Ok(*link_data), }; let result = input.to_string(); let expected = map[link_data]; pretty_assertions::assert_str_eq!(expected, result); } } #[test] fn display_pcie_link_no_max() { let map = get_test_pcie_link_data(); for link_data in map.keys() { let input = LinkData { current: *link_data, max: Err(anyhow!("No max")), }; let result = input.to_string(); let expected = map[link_data]; pretty_assertions::assert_str_eq!(expected, result); } } #[test] fn display_pcie_link_different_max() { let map = get_test_pcie_link_data(); for current_data in map.keys() { for max_data in map.keys() { if current_data != max_data { let input = LinkData { current: *current_data, max: Ok(*max_data), }; let result = input.to_string(); let expected = format!("{} / {}", current_data, max_data); pretty_assertions::assert_str_eq!(expected, result); } } } } #[test] fn display_pcie_link_different_max_2() { let input = LinkData { current: PcieLinkData { speed: PcieSpeed::Pcie40, width: 8, }, max: Ok(PcieLinkData { speed: PcieSpeed::Pcie50, width: 16, }), }; let result = input.to_string(); let expected = "PCIe 4.0 ×8 / PCIe 5.0 ×16"; pretty_assertions::assert_str_eq!(expected, result); } fn get_test_pcie_link_data() -> HashMap { HashMap::from([ ( PcieLinkData { speed: PcieSpeed::Pcie10, width: 2, }, "PCIe 1.0 ×2", ), ( PcieLinkData { speed: PcieSpeed::Pcie20, width: 4, }, "PCIe 2.0 ×4", ), ( PcieLinkData { speed: PcieSpeed::Pcie30, width: 1, }, "PCIe 3.0 ×1", ), ( PcieLinkData { speed: PcieSpeed::Pcie40, width: 8, }, "PCIe 4.0 ×8", ), ( PcieLinkData { speed: PcieSpeed::Pcie50, width: 16, }, "PCIe 5.0 ×16", ), ( PcieLinkData { speed: PcieSpeed::Pcie60, width: 1, }, "PCIe 6.0 ×1", ), ]) } } resources-1.9.1/src/utils/link/sata.rs000066400000000000000000000066041510634446000177270ustar00rootroot00000000000000use crate::utils::drive::AtaSlot; use crate::utils::link::LinkData; use crate::utils::link::sata::SataSpeed::{Sata150, Sata300, Sata600}; use anyhow::{Context, Error, anyhow}; use log::trace; use std::fmt::{Display, Formatter}; use std::path::Path; use std::str::FromStr; #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub enum SataSpeed { Sata150, Sata300, Sata600, } impl LinkData { pub fn from_ata_slot(ata_slot: &AtaSlot) -> anyhow::Result { trace!("Reading ATA link data for {ata_slot:?}…"); let ata_link_path = Path::new("/sys/class/ata_link").join(format!("link{}", ata_slot.ata_link)); let current_sata_speed_raw = std::fs::read_to_string(ata_link_path.join("sata_spd")) .map(|x| x.trim().to_string()) .context("Could not read sata_spd")?; let max_sata_speed_raw = std::fs::read_to_string(ata_link_path.join("sata_spd_max")) .map(|x| x.trim().to_string()) .context("Could not read sata_spd_max"); let current = SataSpeed::from_str(¤t_sata_speed_raw) .context("Could not parse current sata speed")?; let max = max_sata_speed_raw.and_then(|raw| SataSpeed::from_str(&raw)); Ok(Self { current, max }) } } impl FromStr for SataSpeed { type Err = Error; fn from_str(s: &str) -> std::result::Result { match s { // https://en.wikipedia.org/wiki/SATA "1.5 Gbps" => Ok(Sata150), "3.0 Gbps" => Ok(Sata300), "6.0 Gbps" => Ok(Sata600), _ => Err(anyhow!("Could not parse SATA speed: '{s}'")), } } } impl Display for SataSpeed { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { write!( f, "{}", match self { Sata150 => "SATA-150", Sata300 => "SATA-300", Sata600 => "SATA-600", } ) } } #[cfg(test)] mod test { use crate::utils::link::sata::SataSpeed; use std::collections::HashMap; use std::str::FromStr; #[test] fn parse_sata_link_speeds() { let map = HashMap::from([ ("1.5 Gbps", SataSpeed::Sata150), ("3.0 Gbps", SataSpeed::Sata300), ("6.0 Gbps", SataSpeed::Sata600), ]); for input in map.keys() { let result = SataSpeed::from_str(input); assert!(result.is_ok(), "Could not parse SATA speed for '{input}'"); let expected = map[input]; pretty_assertions::assert_eq!(expected, result.unwrap()); } } #[test] fn parse_sata_link_speeds_failure() { let invalid = vec!["4.0 Gbps", "SOMETHING_ELSE", ""]; for input in invalid { let result = SataSpeed::from_str(input); assert!( result.is_err(), "Could parse SATA speed for '{input}' while we don't expect that" ); } } #[test] fn display_sata_link_speeds() { let map = HashMap::from([ (SataSpeed::Sata150, "SATA-150"), (SataSpeed::Sata300, "SATA-300"), (SataSpeed::Sata600, "SATA-600"), ]); for input in map.keys() { let result = input.to_string(); let expected = map[input]; pretty_assertions::assert_str_eq!(expected, result); } } } resources-1.9.1/src/utils/link/usb.rs000066400000000000000000000131471510634446000175700ustar00rootroot00000000000000use crate::utils::drive::UsbSlot; use crate::utils::link::LinkData; use crate::utils::units::convert_speed_bits_decimal_with_places; use anyhow::{Context, Error, anyhow}; use log::trace; use std::fmt::{Display, Formatter}; use std::path::Path; use std::str::FromStr; #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub enum UsbSpeed { // https://en.wikipedia.org/wiki/USB#Release_versions Usb1_0, Usb1_1(usize), Usb2_0(usize), Usb3_0(usize), Usb3_1(usize), Usb3_2(usize), Usb4(usize), Usb4_2_0(usize), } impl LinkData { pub fn from_usb_slot(usb_slot: &UsbSlot) -> anyhow::Result { trace!("Reading USB link data for {usb_slot:?}…"); let usb_bus_path = Path::new("/sys/bus/usb/devices/").join(format!("usb{}", usb_slot.usb_bus)); let max_usb_port_speed_raw = std::fs::read_to_string(usb_bus_path.join("speed")) .map(|x| x.trim().to_string()) .context("Could not read usb port speed"); let usb_device_speed = std::fs::read_to_string(usb_bus_path.join(&usb_slot.usb_device).join("speed")) .map(|x| x.trim().to_string()) .context("Could not read usb device speed")?; let usb_port_speed = max_usb_port_speed_raw.and_then(|x| UsbSpeed::from_str(&x)); let usb_device_speed = UsbSpeed::from_str(&usb_device_speed).context("Could not parse USB device speed")?; Ok(LinkData { current: usb_device_speed, max: usb_port_speed, }) } } impl Display for UsbSpeed { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { write!( f, "{} ({})", // https://en.wikipedia.org/wiki/USB#Release_versions match self { UsbSpeed::Usb1_0 => "USB 1.0", UsbSpeed::Usb1_1(_) => "USB 1.1", UsbSpeed::Usb2_0(_) => "USB 2.0", UsbSpeed::Usb3_0(_) => "USB 3.0", UsbSpeed::Usb3_1(_) => "USB 3.1", UsbSpeed::Usb3_2(_) => "USB 3.2", UsbSpeed::Usb4(_) => "USB4", UsbSpeed::Usb4_2_0(_) => "USB4 2.0", }, match self { UsbSpeed::Usb1_0 => convert_speed_bits_decimal_with_places(1.5 * 1_000_000.0, 1), UsbSpeed::Usb1_1(mbit) | UsbSpeed::Usb2_0(mbit) | UsbSpeed::Usb3_0(mbit) | UsbSpeed::Usb3_1(mbit) | UsbSpeed::Usb3_2(mbit) | UsbSpeed::Usb4(mbit) | UsbSpeed::Usb4_2_0(mbit) => convert_speed_bits_decimal_with_places(*mbit as f64 * 1_000_000.0, 0), } ) } } impl FromStr for UsbSpeed { type Err = Error; fn from_str(s: &str) -> std::result::Result { match s { // https://en.wikipedia.org/wiki/USB#Release_versions //https://www.kernel.org/doc/Documentation/ABI/stable/sysfs-bus-usb "1.5" => Ok(UsbSpeed::Usb1_0), "12" => Ok(UsbSpeed::Usb1_1(12)), "480" => Ok(UsbSpeed::Usb2_0(480)), "5000" => Ok(UsbSpeed::Usb3_0(5_000)), "10000" => Ok(UsbSpeed::Usb3_1(10_000)), "20000" => Ok(UsbSpeed::Usb3_2(20_000)), "40000" => Ok(UsbSpeed::Usb4(40_000)), "80000" => Ok(UsbSpeed::Usb4_2_0(80_000)), "120000" => Ok(UsbSpeed::Usb4_2_0(120_000)), _ => Err(anyhow!("Could not parse USB speed: '{s}'")), } } } #[cfg(test)] mod test { use crate::utils::link::usb::UsbSpeed; use std::collections::HashMap; use std::str::FromStr; #[test] fn parse_usb_link_speeds() { let map = HashMap::from([ ("1.5", UsbSpeed::Usb1_0), ("12", UsbSpeed::Usb1_1(12)), ("480", UsbSpeed::Usb2_0(480)), ("5000", UsbSpeed::Usb3_0(5_000)), ("10000", UsbSpeed::Usb3_1(10_000)), ("20000", UsbSpeed::Usb3_2(20_000)), ("40000", UsbSpeed::Usb4(40_000)), ("80000", UsbSpeed::Usb4_2_0(80_000)), ("120000", UsbSpeed::Usb4_2_0(120_000)), ]); for input in map.keys() { let result = UsbSpeed::from_str(input); assert!(result.is_ok(), "Could not parse USB speed for '{input}'"); let expected = map[input]; pretty_assertions::assert_eq!(expected, result.unwrap()); } } #[test] fn parse_usb_link_speeds_failure() { let invalid = vec!["4000", "160000", "SOMETHING_ELSE", ""]; for input in invalid { let result = UsbSpeed::from_str(input); assert!( result.is_err(), "Could parse USB speed for '{input}' while we don't expect that" ); } } #[test] fn display_usb_link_speeds() { let map = HashMap::from([ (UsbSpeed::Usb1_0, "USB 1.0 (1.5 Mb/s)"), (UsbSpeed::Usb1_1(12), "USB 1.1 (12 Mb/s)"), (UsbSpeed::Usb2_0(480), "USB 2.0 (480 Mb/s)"), (UsbSpeed::Usb3_0(5_000), "USB 3.0 (5 Gb/s)"), (UsbSpeed::Usb3_1(10_000), "USB 3.1 (10 Gb/s)"), (UsbSpeed::Usb3_2(20_000), "USB 3.2 (20 Gb/s)"), (UsbSpeed::Usb4(40_000), "USB4 (40 Gb/s)"), (UsbSpeed::Usb4_2_0(80_000), "USB4 2.0 (80 Gb/s)"), (UsbSpeed::Usb4_2_0(120_000), "USB4 2.0 (120 Gb/s)"), ]); for input in map.keys() { let result = input.to_string(); let expected = map[input]; pretty_assertions::assert_str_eq!(expected, result); } } } resources-1.9.1/src/utils/link/wifi.rs000066400000000000000000000315731510634446000177400ustar00rootroot00000000000000use crate::i18n::{i18n, i18n_f}; use crate::utils::link::LinkData; use crate::utils::network::{InterfaceType, NetworkInterface}; use crate::utils::units::{convert_frequency, convert_speed_bits_decimal}; use anyhow::{Context, Result, anyhow, bail}; use log::{debug, trace, warn}; use neli_wifi::{Socket, Station}; use plotters::prelude::LogScalable; use std::ffi::CString; use std::fmt::{Display, Formatter}; use std::sync::{LazyLock, Mutex}; static NELI_SOCKET: LazyLock>> = LazyLock::new(|| { Socket::connect() .inspect(|_| debug!("Successfully connected to nl80211")) .map_err(|e| anyhow!("connection to nl80211 failed: {e}")) .inspect_err(|e| warn!("Connection to nl80211 failed, reason: {e}")) .map(Mutex::new) }); #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct WifiLinkData { pub generation: Option, pub frequency_mhz: u32, pub rx_bps: usize, pub tx_bps: usize, pub ssid: Option, } #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub enum WifiGeneration { Wifi4, Wifi5, Wifi6, Wifi6e, Wifi7, } impl WifiGeneration { pub fn get_wifi_generation(station: &Station, frequency_mhz: u32) -> Option { let mut wifi_generation: Option = None; if station.ht_mcs.is_some() { wifi_generation = Some(WifiGeneration::Wifi4) } if station.vht_mcs.is_some() { wifi_generation = Some(WifiGeneration::Wifi5) } if station.he_mcs.is_some() { if (5925..=7125).contains(&frequency_mhz) { wifi_generation = Some(WifiGeneration::Wifi6e) } else { wifi_generation = Some(WifiGeneration::Wifi6) } } if station.eht_mcs.is_some() { wifi_generation = Some(WifiGeneration::Wifi7) } wifi_generation } } impl Display for WifiGeneration { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { write!( f, "{}", match self { WifiGeneration::Wifi4 => "Wi-Fi 4 (802.11n)", WifiGeneration::Wifi5 => "Wi-Fi 5 (802.11ac)", WifiGeneration::Wifi6 => "Wi-Fi 6 (802.11ax)", WifiGeneration::Wifi6e => "Wi-Fi 6E (802.11ax)", WifiGeneration::Wifi7 => "Wi-Fi 7 (802.11be)", } ) } } impl LinkData { pub fn from_wifi_adapter(interface: &NetworkInterface) -> Result { if interface.interface_type != InterfaceType::Wlan { bail!("Wifi interface type is required for wifi generation detection"); } let name = interface .interface_name .to_str() .context("unable to turn osstring to string")?; let mutex = NELI_SOCKET.as_ref().map_err(|e| anyhow!(e))?; let mut socket = mutex .try_lock() .map_err(|e| anyhow!("unable to lock neli mutex, reason: {e}"))?; let interfaces = socket .get_interfaces_info() .context("Could not get interfaces")?; let wifi_interface = interfaces.iter().find(|x| { x.name.is_some() && { if let Ok(c_name) = CString::from_vec_with_nul(x.name.clone().unwrap()) { c_name.to_string_lossy() == name } else { false } } }); if let Some(wifi_interface) = wifi_interface { let wifi_interface_name = String::from_utf8_lossy(wifi_interface.name.as_ref().unwrap()); let ssid = wifi_interface .ssid .as_ref() .map(|s| String::from_utf8_lossy(s).to_string()); trace!("Found interface '{wifi_interface_name}': {interface:?}"); let index = wifi_interface .index .context("Could not get index of wifi_interface")?; let stations = socket.get_station_info(index)?; trace!("Stations found: {}", stations.len()); if let Some(station_info) = stations.first() { trace!("Found station: {station_info:?}"); let mhz = wifi_interface.frequency.unwrap_or(0); let wifi_generation = WifiGeneration::get_wifi_generation(station_info, mhz); let rx = station_info.rx_bitrate.unwrap_or(0).saturating_mul(100_000) as usize; let tx = station_info.tx_bitrate.unwrap_or(0).saturating_mul(100_000) as usize; return Ok(LinkData { current: WifiLinkData { generation: wifi_generation, rx_bps: rx, tx_bps: tx, frequency_mhz: wifi_interface.frequency.unwrap_or(0), ssid, }, max: Err(anyhow!("No max yet supported")), }); } } bail!("Could not find matching WIFI interface"); } } impl WifiLinkData { pub fn frequency_display(&self) -> String { // https://en.wikipedia.org/wiki/List_of_WLAN_channels match self.frequency_mhz { 0 => "".to_string(), 2400..=2495 => "2.4 GHz".to_string(), 5150..=5895 => "5 GHz".to_string(), 5925..=7125 => "6 GHz".to_string(), _ => convert_frequency((self.frequency_mhz.as_f64() / 1_000.0) * 1_000.0 * 1_000_000.0), } } pub fn link_speed_display(&self) -> String { let send_string = convert_speed_bits_decimal(self.tx_bps.as_f64()); let receive_string = convert_speed_bits_decimal(self.rx_bps.as_f64()); format!( "{} · {}", &i18n_f("Receive: {}", &[&receive_string]), &i18n_f("Send: {}", &[&send_string]), ) } } impl Display for WifiLinkData { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { write!( f, "{} · {}", if let Some(generation) = self.generation { generation.to_string() } else { i18n("N/A") }, self.frequency_display(), ) } } #[cfg(test)] mod test { use crate::utils::link::wifi::{WifiGeneration, WifiLinkData}; use neli_wifi::Station; use std::collections::HashMap; #[test] fn parse_wifi_generations() { let map: HashMap = HashMap::from([ ( WifiGeneration::Wifi4, (generate_wifi_station(Some(1), None, None, None), 2400), ), ( WifiGeneration::Wifi5, (generate_wifi_station(None, Some(1), None, None), 2400), ), ( WifiGeneration::Wifi6, (generate_wifi_station(None, None, Some(1), None), 2400), ), ( WifiGeneration::Wifi6e, (generate_wifi_station(None, None, Some(1), None), 6000), ), ( WifiGeneration::Wifi7, (generate_wifi_station(None, None, None, Some(1)), 5000), ), ]); for expected in map.keys() { let (station, mhz) = &map[expected]; let result = WifiGeneration::get_wifi_generation(station, *mhz); assert_eq!( result, Some(*expected), "Could not parse Wifi generation properly for {}", expected ); } } #[test] fn parse_wifi_generations_detection_order() { let map: HashMap = HashMap::from([ ( WifiGeneration::Wifi4, (generate_wifi_station(Some(1), None, None, None), 2400), ), ( WifiGeneration::Wifi5, (generate_wifi_station(Some(1), Some(1), None, None), 2400), ), ( WifiGeneration::Wifi6, (generate_wifi_station(Some(1), Some(1), Some(1), None), 2400), ), ( WifiGeneration::Wifi6e, (generate_wifi_station(Some(1), Some(1), Some(1), None), 6000), ), ( WifiGeneration::Wifi7, ( generate_wifi_station(Some(1), Some(1), Some(1), Some(1)), 5000, ), ), ]); for expected in map.keys() { let (station, mhz) = &map[expected]; let result = WifiGeneration::get_wifi_generation(station, *mhz); assert_eq!( result, Some(*expected), "Could not parse Wifi generation properly for {}", expected ); } } #[test] fn parse_wifi_generations_failures() { let map = HashMap::from([(None, (generate_wifi_station(None, None, None, None), 2400))]); for expected in map.keys() { let (station, mhz) = &map[expected]; let result = WifiGeneration::get_wifi_generation(station, *mhz); assert_eq!( result, *expected, "Could parse Wifi generation properly while it should fail" ) } } #[test] fn display_wifi_generations() { let map: HashMap = HashMap::from([ (WifiGeneration::Wifi4, "Wi-Fi 4 (802.11n)"), (WifiGeneration::Wifi5, "Wi-Fi 5 (802.11ac)"), (WifiGeneration::Wifi6, "Wi-Fi 6 (802.11ax)"), (WifiGeneration::Wifi6e, "Wi-Fi 6E (802.11ax)"), (WifiGeneration::Wifi7, "Wi-Fi 7 (802.11be)"), ]); for input in map.keys() { let result = input.to_string(); let expected = map[input]; pretty_assertions::assert_str_eq!(expected, result); } } #[test] fn display_wifi_link_frequencies() { let map = HashMap::from([ (2401u32..=2495u32, "2.4 GHz"), (5150u32..=5895, "5 GHz"), (5925u32..=7125, "6 GHz"), ]); for mhz_range in map.keys() { for step in mhz_range.clone().into_iter() { let input = WifiLinkData { generation: None, frequency_mhz: step, rx_bps: 0, tx_bps: 0, ssid: None, }; let result = input.frequency_display(); let expected = map[mhz_range]; pretty_assertions::assert_eq!(expected, result); } } } #[test] fn display_unsupported_wifi_link_frequencies() { let map = HashMap::from([ (2400, "2.4 GHz"), (5000, "5.00 GHz"), (8000, "8.00 GHz"), (8123, "8.12 GHz"), (0, ""), ]); for mhz in map.keys() { let input = WifiLinkData { generation: None, frequency_mhz: *mhz, rx_bps: 0, tx_bps: 0, ssid: None, }; let result = input.frequency_display(); let expected = map[mhz]; pretty_assertions::assert_eq!(expected, result); } } #[test] fn display_wifi_link_speed() { let map = HashMap::from([ ("Receive: 200 b/s · Send: 100 b/s", (200, 100)), ( "Receive: 200.00 kb/s · Send: 100.00 kb/s", (200_000, 100_000), ), ( "Receive: 200.00 Mb/s · Send: 100.00 Mb/s", (200_000_000, 100_000_000), ), ( "Receive: 235.00 Mb/s · Send: 124.00 Mb/s", (235_000_000, 124_000_000), ), ( "Receive: 2.00 kb/s · Send: 124.00 Mb/s", (2_000, 124_000_000), ), ( "Receive: 124.25 Mb/s · Send: 2.30 kb/s", (124_250_000, 2_300), ), ]); for expected in map.keys() { let (receive, send) = map[expected]; let input = WifiLinkData { generation: None, frequency_mhz: 0, rx_bps: receive, tx_bps: send, ssid: None, }; let result = input.link_speed_display(); pretty_assertions::assert_eq!(*expected, result); } } fn generate_wifi_station( ht_mcs: Option, vht_mcs: Option, he_mcs: Option, eht_mcs: Option, ) -> Station { let mut station = Station::default(); station.ht_mcs = ht_mcs; station.vht_mcs = vht_mcs; station.he_mcs = he_mcs; station.eht_mcs = eht_mcs; station } } resources-1.9.1/src/utils/memory.rs000066400000000000000000000412641510634446000173530ustar00rootroot00000000000000use std::process::Command; use anyhow::{Context, Result, bail}; use lazy_regex::{Lazy, Regex, lazy_regex}; use log::{debug, trace}; use crate::utils::read_parsed; use super::{FLATPAK_APP_PATH, FLATPAK_SPAWN, IS_FLATPAK}; const PROC_MEMINFO: &str = "/proc/meminfo"; const TEMPLATE_RE_PRESENT: &str = r"MEMORY_DEVICE_%_PRESENT=(\d)"; const TEMPLATE_RE_CONFIGURED_SPEED_MTS: &str = r"MEMORY_DEVICE_%_CONFIGURED_SPEED_MTS=(\d*)"; const TEMPLATE_RE_SPEED_MTS: &str = r"MEMORY_DEVICE_%_SPEED_MTS=(\d*)"; const TEMPLATE_RE_FORM_FACTOR: &str = r"MEMORY_DEVICE_%_FORM_FACTOR=(.*)"; const TEMPLATE_RE_TYPE: &str = r"MEMORY_DEVICE_%_TYPE=(.*)"; const TEMPLATE_RE_TYPE_DETAIL: &str = r"MEMORY_DEVICE_%_TYPE_DETAIL=(.*)"; const TEMPLATE_RE_SIZE: &str = r"MEMORY_DEVICE_%_SIZE=(\d*)"; const BYTES_IN_GIB: u64 = 1_073_741_824; // 1024 * 1024 * 1024 static RE_CONFIGURED_SPEED: Lazy = lazy_regex!(r"Configured Memory Speed: (\d+) MT/s"); static RE_SPEED: Lazy = lazy_regex!(r"Speed: (\d+) MT/s"); static RE_FORMFACTOR: Lazy = lazy_regex!(r"Form Factor: (.+)"); static RE_TYPE: Lazy = lazy_regex!(r"Type: (.+)"); static RE_TYPE_DETAIL: Lazy = lazy_regex!(r"Type Detail: (.+)"); static RE_SIZE: Lazy = lazy_regex!(r"Size: (\d+) GB"); static RE_MEM_TOTAL: Lazy = lazy_regex!(r"MemTotal:\s*(\d*) kB"); static RE_MEM_AVAILABLE: Lazy = lazy_regex!(r"MemAvailable:\s*(\d*) kB"); static RE_SWAP_TOTAL: Lazy = lazy_regex!(r"SwapTotal:\s*(\d*) kB"); static RE_SWAP_FREE: Lazy = lazy_regex!(r"SwapFree:\s*(\d*) kB"); static RE_NUM_MEMORY_DEVICES: Lazy = lazy_regex!(r"MEMORY_ARRAY_NUM_DEVICES=(\d*)"); #[derive(Debug, Clone, Copy)] pub struct MemoryData { pub total_mem: usize, pub available_mem: usize, pub total_swap: usize, pub free_swap: usize, } impl MemoryData { pub fn new() -> Result { trace!("Gathering memory data…"); trace!("Reading {PROC_MEMINFO}…"); let proc_mem = read_parsed::("/proc/meminfo")?; let total_mem = RE_MEM_TOTAL .captures(&proc_mem) .context("RE_MEM_TOTAL no captures") .and_then(|captures| { captures .get(1) .context("RE_MEM_TOTAL not enough captures") .and_then(|capture| { capture .as_str() .parse::() .context("unable to parse MemTotal") .map(|int| int.saturating_mul(1024)) }) })?; let available_mem = RE_MEM_AVAILABLE .captures(&proc_mem) .context("RE_MEM_AVAILABLE no captures") .and_then(|captures| { captures .get(1) .context("RE_MEM_AVAILABLE not enough captures") .and_then(|capture| { capture .as_str() .parse::() .context("unable to parse MemAvailable") .map(|int| int.saturating_mul(1024)) }) })?; let total_swap = RE_SWAP_TOTAL .captures(&proc_mem) .context("RE_SWAP_TOTAL no captures") .and_then(|captures| { captures .get(1) .context("RE_SWAP_TOTAL not enough captures") .and_then(|capture| { capture .as_str() .parse::() .context("unable to parse SwapTotal") .map(|int| int.saturating_mul(1024)) }) })?; let free_swap = RE_SWAP_FREE .captures(&proc_mem) .context("RE_SWAP_FREE no captures") .and_then(|captures| { captures .get(1) .context("RE_SWAP_FREE not enough captures") .and_then(|capture| { capture .as_str() .parse::() .context("unable to parse SwapFree") .map(|int| int.saturating_mul(1024)) }) })?; let memory_data = Self { total_mem, available_mem, total_swap, free_swap, }; trace!("Gathered memory data: {memory_data:?}"); Ok(memory_data) } } #[derive(Debug, Clone, Default, PartialEq)] pub struct MemoryDevice { pub speed_mts: Option, pub form_factor: Option, pub r#type: Option, pub type_detail: Option, pub size: Option, pub installed: bool, } impl MemoryDevice { fn parse_dmidecode>(dmi: S) -> Vec { trace!("Parsing dmidecode output…"); let mut devices = Vec::new(); let device_strings = dmi.as_ref().split("\n\n"); for device_string in device_strings { if device_string.is_empty() { continue; } let memory_device = Self { speed_mts: RE_CONFIGURED_SPEED .captures(device_string) .or_else(|| RE_SPEED.captures(device_string)) .map(|x| x[1].parse().unwrap()), form_factor: RE_FORMFACTOR .captures(device_string) .map(|x| x[1].to_string()), r#type: RE_TYPE.captures(device_string).map(|x| x[1].to_string()), type_detail: RE_TYPE_DETAIL .captures(device_string) .map(|x| x[1].to_string()), size: RE_SIZE .captures(device_string) .map(|x| x[1].parse::().unwrap() * BYTES_IN_GIB), installed: RE_SPEED .captures(device_string) .map(|x| x[1].to_string()) .is_some(), }; trace!("Found memory device: {memory_device:?}"); devices.push(memory_device); } devices } fn virtual_dmi() -> Vec { let command = if *IS_FLATPAK { trace!("Executing udevadm outside Flatpak's sandbox…"); Command::new(FLATPAK_SPAWN) .args([ "--host", "udevadm", "info", "-p", "/sys/devices/virtual/dmi/id", ]) .output() } else { trace!("Executing udevadm…"); Command::new("udevadm") .args(["info", "-p", "/sys/devices/virtual/dmi/id"]) .output() }; let virtual_dmi_output = command .context("unable to execute udevadm") .and_then(|output| { String::from_utf8(output.stdout) .context("unable to parse stdout of udevadm to UTF-8") }) .unwrap_or_default(); Self::parse_virtual_dmi(virtual_dmi_output) } fn parse_virtual_dmi>(dmi: S) -> Vec { trace!("Parsing udevadm output…"); let dmi = dmi.as_ref(); let devices_amount: usize = RE_NUM_MEMORY_DEVICES .captures(dmi) .and_then(|captures| captures.get(1)) .and_then(|capture| capture.as_str().parse().ok()) .unwrap_or(0); let mut devices = Vec::with_capacity(devices_amount); for i in 0..devices_amount { let i = i.to_string(); let installed = Regex::new(&TEMPLATE_RE_PRESENT.replace('%', &i)) .ok() .and_then(|regex| regex.captures(dmi)) .and_then(|captures| captures.get(1)) .and_then(|capture| capture.as_str().parse::().ok()) != Some(0); let speed = if installed { Regex::new(&TEMPLATE_RE_CONFIGURED_SPEED_MTS.replace('%', &i)) .ok() .and_then(|regex| regex.captures(dmi)) .or_else(|| { Regex::new(&TEMPLATE_RE_SPEED_MTS.replace('%', &i.to_string())) .ok() .and_then(|regex| regex.captures(dmi)) }) .and_then(|captures| captures.get(1)) .and_then(|capture| capture.as_str().parse().ok()) } else { None }; let form_factor = Regex::new(&TEMPLATE_RE_FORM_FACTOR.replace('%', &i)) .ok() .and_then(|regex| regex.captures(dmi)) .and_then(|captures| captures.get(1)) .map(|capture| capture.as_str().to_string()); let r#type = Regex::new(&TEMPLATE_RE_TYPE.replace('%', &i)) .ok() .and_then(|regex| regex.captures(dmi)) .and_then(|captures| captures.get(1)) .map(|capture| capture.as_str().to_string()) .filter(|capture| capture != ""); let type_detail = Regex::new(&TEMPLATE_RE_TYPE_DETAIL.replace('%', &i)) .ok() .and_then(|regex| regex.captures(dmi)) .and_then(|captures| captures.get(1)) .map(|capture| capture.as_str().to_string()); let size = Regex::new(&TEMPLATE_RE_SIZE.replace('%', &i)) .ok() .and_then(|regex| regex.captures(dmi)) .and_then(|captures| captures.get(1)) .and_then(|capture| capture.as_str().parse().ok()); let memory_device = Self { speed_mts: speed, form_factor, r#type, type_detail, size, installed, }; trace!("Found memory device: {memory_device:?}"); devices.push(memory_device); } devices } pub fn get() -> Result> { let virtual_dmi = Self::virtual_dmi(); if virtual_dmi.is_empty() { let output = Command::new("dmidecode") .args(["-t", "17", "-q"]) .output()?; if output.status.code().unwrap_or(1) == 1 { debug!("Unable to get memory information without elevated privileges"); bail!("no permission") } debug!("Memory information obtained using dmidecode (unprivileged)"); Ok(Self::parse_dmidecode(String::from_utf8(output.stdout)?)) } else { debug!("Memory information obtained using udevadm"); Ok(virtual_dmi) } } pub fn pkexec_dmidecode() -> Result> { debug!("Using pkexec to get memory information (dmidecode)…"); let output = if *IS_FLATPAK { Command::new(FLATPAK_SPAWN) .args([ "--host", "/usr/bin/pkexec", "--disable-internal-agent", &format!("{}/bin/dmidecode", FLATPAK_APP_PATH.as_str()), "-t", "17", "-q", ]) .output()? } else { Command::new("pkexec") .args(["--disable-internal-agent", "dmidecode", "-t", "17", "-q"]) .output()? }; debug!("Memory information obtained using dmidecode (privileged)"); Ok(Self::parse_dmidecode( String::from_utf8(output.stdout)?.as_str(), )) } } #[cfg(test)] mod test { use pretty_assertions::assert_eq; use crate::utils::memory::MemoryDevice; const DMIDECODE_OUTPUT: &str = concat!( "Memory Device\n", " Total Width: Unknown\n", " Data Width: Unknown\n", " Size: No Module Installed\n", " Form Factor: Unknown\n", " Set: None\n", " Locator: DIMM 0\n", " Bank Locator: P0 CHANNEL A\n", " Type: Unknown\n", " Type Detail: Unknown\n", "\n", "Memory Device\n", " Total Width: 64 bits\n", " Data Width: 64 bits\n", " Size: 16 GB\n", " Form Factor: DIMM\n", " Set: None\n", " Locator: DIMM 1\n", " Bank Locator: P0 CHANNEL A\n", " Type: DDR4\n", " Type Detail: Synchronous Unbuffered (Unregistered)\n", " Speed: 3000 MT/s\n", " Manufacturer: Unknown\n", " Serial Number: 00000000\n", " Asset Tag: Not Specified\n", " Part Number: 123\n", " Rank: 1\n", " Configured Memory Speed: 3000 MT/s\n", " Minimum Voltage: 1.2 V\n", " Maximum Voltage: 1.2 V\n", " Configured Voltage: 1.2 V" ); const UDEVADM_OUTPUT: &str = concat!( "E: MEMORY_ARRAY_LOCATION=System Board Or Motherboard\n", "E: MEMORY_ARRAY_MAX_CAPACITY=137438953472\n", "E: MEMORY_DEVICE_0_PRESENT=0\n", "E: MEMORY_DEVICE_0_FORM_FACTOR=Unknown\n", "E: MEMORY_DEVICE_0_LOCATOR=DIMM 0\n", "E: MEMORY_DEVICE_0_BANK_LOCATOR=P0 CHANNEL A\n", "E: MEMORY_DEVICE_0_TYPE=Unknown\n", "E: MEMORY_DEVICE_0_TYPE_DETAIL=Unknown\n", "E: MEMORY_DEVICE_0_SPEED_MTS=3000\n", "E: MEMORY_DEVICE_0_MANUFACTURER=Unknown\n", "E: MEMORY_DEVICE_0_SERIAL_NUMBER=Unknown\n", "E: MEMORY_DEVICE_0_ASSET_TAG=Not Specified\n", "E: MEMORY_DEVICE_0_PART_NUMBER=Unknown\n", "E: MEMORY_DEVICE_0_CONFIGURED_SPEED_MTS=3000\n", "E: MEMORY_DEVICE_1_TOTAL_WIDTH=64\n", "E: MEMORY_DEVICE_1_DATA_WIDTH=64\n", "E: MEMORY_DEVICE_1_SIZE=17179869184\n", "E: MEMORY_DEVICE_1_FORM_FACTOR=DIMM\n", "E: MEMORY_DEVICE_1_LOCATOR=DIMM 1\n", "E: MEMORY_DEVICE_1_BANK_LOCATOR=P0 CHANNEL A\n", "E: MEMORY_DEVICE_1_TYPE=DDR4\n", "E: MEMORY_DEVICE_1_TYPE_DETAIL=Synchronous Unbuffered (Unregistered)\n", "E: MEMORY_DEVICE_1_SPEED_MTS=3000\n", "E: MEMORY_DEVICE_1_MANUFACTURER=Unknown\n", "E: MEMORY_DEVICE_1_SERIAL_NUMBER=00000000\n", "E: MEMORY_DEVICE_1_ASSET_TAG=Not Specified\n", "E: MEMORY_DEVICE_1_PART_NUMBER=123\n", "E: MEMORY_DEVICE_1_RANK=1\n", "E: MEMORY_DEVICE_1_CONFIGURED_SPEED_MTS=3000\n", "E: MEMORY_DEVICE_1_MINIMUM_VOLTAGE=1\n", "E: MEMORY_DEVICE_1_MAXIMUM_VOLTAGE=1\n", "E: MEMORY_DEVICE_1_CONFIGURED_VOLTAGE=1\n", "E: MEMORY_DEVICE_2_PRESENT=0\n", "E: MEMORY_ARRAY_NUM_DEVICES=2" ); #[test] fn valid_dmidecode_complex() { let parsed = MemoryDevice::parse_dmidecode(DMIDECODE_OUTPUT); let expected = vec![ MemoryDevice { speed_mts: None, form_factor: Some("Unknown".into()), r#type: Some("Unknown".into()), type_detail: Some("Unknown".into()), size: None, installed: false, }, MemoryDevice { speed_mts: Some(3000), form_factor: Some("DIMM".into()), r#type: Some("DDR4".into()), type_detail: Some("Synchronous Unbuffered (Unregistered)".into()), size: Some(17179869184), installed: true, }, ]; assert_eq!(expected, parsed); } #[test] fn valid_udevadm_complex() { let parsed = MemoryDevice::parse_virtual_dmi(UDEVADM_OUTPUT); let expected = vec![ MemoryDevice { speed_mts: None, form_factor: Some("Unknown".into()), r#type: Some("Unknown".into()), type_detail: Some("Unknown".into()), size: None, installed: false, }, MemoryDevice { speed_mts: Some(3000), form_factor: Some("DIMM".into()), r#type: Some("DDR4".into()), type_detail: Some("Synchronous Unbuffered (Unregistered)".into()), size: Some(17179869184), installed: true, }, ]; assert_eq!(expected, parsed); } #[test] fn udevadm_dmidecode_equal() { let dmidecode = MemoryDevice::parse_dmidecode(DMIDECODE_OUTPUT); let udevadm = MemoryDevice::parse_virtual_dmi(UDEVADM_OUTPUT); assert_eq!(dmidecode, udevadm); } } resources-1.9.1/src/utils/mod.rs000066400000000000000000000243171510634446000166220ustar00rootroot00000000000000use std::{collections::HashMap, path::Path, str::FromStr, sync::LazyLock}; use anyhow::{Context, Result}; use gtk::glib::DateTime; use ini::Ini; use log::{debug, trace}; use process_data::unix_as_millis; pub mod app; pub mod battery; pub mod cpu; pub mod drive; pub mod gpu; pub mod link; pub mod memory; pub mod network; pub mod npu; pub mod os; pub mod pci; pub mod process; pub mod settings; pub mod units; const FLATPAK_SPAWN: &str = "/usr/bin/flatpak-spawn"; static BOOT_TIMESTAMP: LazyLock> = LazyLock::new(|| { let unix_timestamp = (unix_as_millis() / 1000) as i64; read_parsed::("/proc/uptime") .context("unable to read /proc/uptime") .and_then(|procfs| { procfs .split(' ') .next() .map(str::to_string) .context("unable to split /proc/uptime") }) .and_then(|uptime_str| { uptime_str .parse::() .context("unable to parse /proc/uptime") }) .map(|uptime_secs| unix_timestamp - uptime_secs as i64) .ok() }); static FLATPAK_APP_PATH: LazyLock = LazyLock::new(|| flatpak_app_path().unwrap_or_else(|_| String::new())); pub static TICK_RATE: LazyLock = LazyLock::new(|| sysconf::sysconf(sysconf::SysconfVariable::ScClkTck).unwrap_or(100) as usize); pub static NUM_CPUS: LazyLock = LazyLock::new(num_cpus::get); // Adapted from Mission Center: https://gitlab.com/mission-center-devs/mission-center/ pub static IS_FLATPAK: LazyLock = LazyLock::new(|| { trace!("Determining whether /.flatpak-info exists…"); let is_flatpak = std::path::Path::new("/.flatpak-info").exists(); if is_flatpak { debug!("Running as Flatpak"); } else { debug!("Not running as Flatpak"); } is_flatpak }); // Adapted from Mission Center: https://gitlab.com/mission-center-devs/mission-center/ pub fn flatpak_app_path() -> Result { let ini = Ini::load_from_file("/.flatpak-info").context("unable to find ./flatpak-info")?; let section = ini .section(Some("Instance")) .context("unable to find Instance section in ./flatpak-info")?; Ok(section .get("app-path") .context("unable to find app-path in ./flatpak-info")? .to_string()) } pub fn boot_time() -> Result { BOOT_TIMESTAMP .context("couldn't get boot timestamp") .and_then(|timestamp| { DateTime::from_unix_local(timestamp).context("unable to get glib::DateTime") }) } pub fn parse_uevent_contents(contents: impl AsRef) -> Result> { contents .as_ref() .lines() .map(|line| { line.split_once('=') .map(|(a, b)| (a.to_string(), b.to_string())) .context(format!("malformed line (no '='): {line}")) }) .collect() } pub fn read_uevent(path: impl AsRef) -> Result> { let path = path.as_ref(); parse_uevent_contents(read_parsed::(path)?) .inspect(|content| trace!("Successfully parsed uevent file {path:?} → {content:?}")) .inspect_err(|e| trace!("Unable to parse uevent file {path:?} → {e}")) } pub fn read_parsed(path: impl AsRef) -> Result where ::Err: std::error::Error + Send + Sync + 'static, { let path = path.as_ref(); let content = std::fs::read_to_string(path) .map(|content| content.trim().to_string()) .inspect_err(|e| trace!("Unable to read {path:?} → {e}"))?; let type_name = std::any::type_name::(); content .parse::() .inspect(|_| trace!("Successfully read {path:?} to {type_name} → {content}",)) .inspect_err(|e| { trace!("Unable to parse {path:?} to {type_name} → {e}"); trace!("Content of {path:?} → {content}"); }) .with_context(|| format!("error parsing file {}", path.display())) } pub trait FiniteOr { /// Returns the given `x` value if the variable is NaN or infinite, /// and returns itself otherwise. #[must_use] fn finite_or(&self, x: Self) -> Self; /// Returns itself is the variable is finite (i.e. neither NaN nor infinite), otherwise returns its default fn finite_or_default(&self) -> Self; /// Returns itself is the variable is finite (i.e. neither NaN nor infinite), otherwise runs `f` fn finite_or_else Self>(&self, f: F) -> Self where Self: Sized; } impl FiniteOr for f64 { fn finite_or(&self, x: Self) -> Self { if self.is_finite() { *self } else { x } } fn finite_or_default(&self) -> Self { if self.is_finite() { *self } else { Self::default() } } fn finite_or_else Self>(&self, f: F) -> Self where Self: Sized, { if self.is_finite() { *self } else { f(*self) } } } impl FiniteOr for f32 { fn finite_or(&self, x: Self) -> Self { if self.is_finite() { *self } else { x } } fn finite_or_default(&self) -> Self { if self.is_finite() { *self } else { Self::default() } } fn finite_or_else Self>(&self, f: F) -> Self where Self: Sized, { if self.is_finite() { *self } else { f(*self) } } } #[cfg(test)] mod test { use core::f64; use pretty_assertions::assert_eq; use std::collections::HashMap; use crate::utils::{FiniteOr, parse_uevent_contents}; #[test] fn read_uevent_contents_valid_simple() { let uevent_raw = "a=b"; let parsed = parse_uevent_contents(uevent_raw).unwrap(); let expected: HashMap = HashMap::from([("a".into(), "b".into())]); assert_eq!(expected, parsed) } #[test] fn read_uevent_contents_valid_single_equals() { let uevent_raw = "="; let parsed = parse_uevent_contents(uevent_raw).unwrap(); let expected: HashMap = HashMap::from([("".into(), "".into())]); assert_eq!(expected, parsed) } #[test] fn read_uevent_contents_valid_multiple_equals() { let uevent_raw = "a=b=c"; let parsed = parse_uevent_contents(uevent_raw).unwrap(); let expected: HashMap = HashMap::from([("a".into(), "b=c".into())]); assert_eq!(expected, parsed) } #[test] fn read_uevent_contents_valid_left_empty() { let uevent_raw = "=EMPTY"; let parsed = parse_uevent_contents(uevent_raw).unwrap(); let expected: HashMap = HashMap::from([("".into(), "EMPTY".into())]); assert_eq!(expected, parsed) } #[test] fn read_uevent_contents_valid_right_empty() { let uevent_raw = "EMPTY="; let parsed = parse_uevent_contents(uevent_raw).unwrap(); let expected: HashMap = HashMap::from([("EMPTY".into(), "".into())]); assert_eq!(expected, parsed) } #[test] fn read_uevent_contents_valid_complex() { let uevent_raw = concat!( "DRIVER=driver\n", "PCI_CLASS=20000\n", "CONTAINS_EQUALS=a=b\n", "EMPTY=\n", "=" ); let parsed = parse_uevent_contents(uevent_raw).unwrap(); let expected: HashMap = HashMap::from([ ("DRIVER".into(), "driver".into()), ("PCI_CLASS".into(), "20000".into()), ("CONTAINS_EQUALS".into(), "a=b".into()), ("EMPTY".into(), "".into()), ("".into(), "".into()), ]); assert_eq!(expected, parsed) } #[test] fn read_uevent_contents_valid_empty() { let uevent_raw = ""; let parsed = parse_uevent_contents(uevent_raw).unwrap(); let expected: HashMap = HashMap::new(); assert_eq!(expected, parsed) } #[test] fn read_uevent_contents_invalid() { let uevent_raw = "NO_EQUALS"; let parsed = parse_uevent_contents(uevent_raw); assert!(parsed.is_err()) } #[test] fn finite_or_finite_f32() { let float: f32 = 1.0; let maybe = float.finite_or(8.0); assert_eq!(maybe, float); } #[test] fn finite_or_finite_f64() { let float: f64 = 1.0; let maybe = float.finite_or(8.0); assert_eq!(maybe, float); } #[test] fn finite_or_infinite_f32() { let float: f32 = f32::INFINITY; let maybe = float.finite_or(8.0); assert_eq!(maybe, 8.0); } #[test] fn finite_or_infinite_f64() { let float: f64 = f64::INFINITY; let maybe = float.finite_or(8.0); assert_eq!(maybe, 8.0); } #[test] fn finite_or_else_finite_f32() { let float: f32 = 1.0; let maybe = float.finite_or_else(|_| f32::powi(2.0, 3)); assert_eq!(maybe, float); } #[test] fn finite_or_else_finite_f64() { let float: f64 = 1.0; let maybe = float.finite_or_else(|_| f64::powi(2.0, 3)); assert_eq!(maybe, float); } #[test] fn finite_or_else_infinite_f32() { let float: f32 = f32::INFINITY; let maybe = float.finite_or_else(|_| f32::powi(2.0, 3)); assert_eq!(maybe, 8.0); } #[test] fn finite_or_else_infinite_f64() { let float: f64 = f64::INFINITY; let maybe = float.finite_or_else(|_| f64::powi(2.0, 3)); assert_eq!(maybe, 8.0); } #[test] fn finite_or_default_finite_f32() { let float: f32 = 1.0; let maybe = float.finite_or_default(); assert_eq!(maybe, float); } #[test] fn finite_or_default_finite_f64() { let float: f64 = 1.0; let maybe = float.finite_or_default(); assert_eq!(maybe, float); } #[test] fn finite_or_default_infinite_f32() { let float: f32 = f32::INFINITY; let maybe = float.finite_or_default(); assert_eq!(maybe, f32::default()); } #[test] fn finite_or_default_infinite_f64() { let float: f64 = f64::INFINITY; let maybe = float.finite_or_default(); assert_eq!(maybe, f64::default()); } } resources-1.9.1/src/utils/network.rs000066400000000000000000000236431510634446000175350ustar00rootroot00000000000000use std::{ ffi::OsString, fmt::Display, path::{Path, PathBuf}, }; use anyhow::Result; use gtk::gio::{Icon, ThemedIcon}; use log::trace; use super::{pci::Device, read_uevent}; use crate::{i18n::i18n, utils::read_parsed}; const PATH_SYSFS: &str = "/sys/class/net"; // this is a list because we don't look for exact matches but for if the device name starts with a certain string const INTERFACE_TYPE_MAP: &[(&str, InterfaceType)] = &[ ("bn", InterfaceType::Bluetooth), ("br", InterfaceType::Bridge), ("dae", InterfaceType::Vpn), ("docker", InterfaceType::Docker), ("eth", InterfaceType::Ethernet), ("en", InterfaceType::Ethernet), ("ib", InterfaceType::InfiniBand), ("sl", InterfaceType::Slip), ("tun", InterfaceType::Vpn), ("veth", InterfaceType::VirtualEthernet), ("virbr", InterfaceType::VmBridge), ("vpn", InterfaceType::Vpn), ("wg", InterfaceType::Wireguard), ("wl", InterfaceType::Wlan), ("ww", InterfaceType::Wwan), ]; #[derive(Debug)] pub struct NetworkData { pub inner: NetworkInterface, pub is_virtual: bool, pub received_bytes: Result, pub sent_bytes: Result, pub display_name: String, } impl NetworkData { pub fn new>(path: P) -> Self { let path = path.as_ref(); trace!("Gathering network data for {path:?}…"); let inner = NetworkInterface::from_sysfs(path); let is_virtual = inner.is_virtual(); let received_bytes = inner.received_bytes(); let sent_bytes = inner.sent_bytes(); let display_name = inner.display_name(); let network_data = Self { inner, is_virtual, received_bytes, sent_bytes, display_name, }; trace!( "Gathered network data for {}: {network_data:?}", path.to_string_lossy() ); network_data } } #[derive(Debug, Clone, Copy, Default, PartialEq)] pub enum InterfaceType { Bluetooth, Bridge, Docker, Ethernet, InfiniBand, Slip, VirtualEthernet, VmBridge, Vpn, Wireguard, Wlan, Wwan, #[default] Unknown, } impl InterfaceType { pub fn from_interface_name>(interface_name: S) -> Self { for (name, interface_type) in INTERFACE_TYPE_MAP { if interface_name.as_ref().starts_with(name) { return *interface_type; } } Self::Unknown } } #[derive(Debug, Clone, Default)] /// Represents a network interface found in /sys/class/net pub struct NetworkInterface { pub interface_name: OsString, pub driver_name: Option, pub interface_type: InterfaceType, pub speed: Option, pub device: Option<&'static Device>, pub device_label: Option, pub hw_address: Option, pub sysfs_path: PathBuf, received_bytes_path: PathBuf, sent_bytes_path: PathBuf, } impl Display for InterfaceType { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!( f, "{}", match self { InterfaceType::Bluetooth => i18n("Bluetooth Tether"), InterfaceType::Bridge => i18n("Network Bridge"), InterfaceType::Ethernet => i18n("Ethernet Connection"), InterfaceType::Docker => i18n("Docker Bridge"), InterfaceType::InfiniBand => i18n("InfiniBand Connection"), InterfaceType::Slip => i18n("Serial Line IP Connection"), InterfaceType::VirtualEthernet => i18n("Virtual Ethernet Device"), InterfaceType::VmBridge => i18n("VM Network Bridge"), InterfaceType::Vpn => i18n("VPN Tunnel"), InterfaceType::Wireguard => i18n("VPN Tunnel (WireGuard)"), InterfaceType::Wlan => i18n("Wi-Fi Connection"), InterfaceType::Wwan => i18n("WWAN Connection"), InterfaceType::Unknown => i18n("Network Interface"), } ) } } impl PartialEq for NetworkInterface { fn eq(&self, other: &Self) -> bool { self.interface_name == other.interface_name && self.device == other.device && self.hw_address == other.hw_address } } impl NetworkInterface { pub fn get_sysfs_paths() -> Result> { let mut list = Vec::new(); trace!("Finding entries in {PATH_SYSFS}"); let entries = std::fs::read_dir(PATH_SYSFS)?; for entry in entries { let entry = entry?; let block_device = entry.file_name().to_string_lossy().to_string(); trace!("Found block device {block_device}"); if block_device.starts_with("lo") { trace!("Skipping loopback interface {block_device}"); continue; } list.push(entry.path()); } Ok(list) } /// Returns a `NetworkInterface` based on information /// found in its sysfs path /// /// # Errors /// /// Will return `Err` if an invalid sysfs Path has /// been passed or if there has been problems parsing /// information pub fn from_sysfs(sysfs_path: &Path) -> NetworkInterface { trace!("Creating NetworkInterface object of {sysfs_path:?}…"); let dev_uevent = read_uevent(sysfs_path.join("device/uevent")).unwrap_or_default(); let interface_name = sysfs_path .file_name() .expect("invalid sysfs path") .to_owned(); let device = if let Some(pci_line) = dev_uevent.get("PCI_ID") { let (vid_str, pid_str) = pci_line.split_once(':').unwrap_or(("0", "0")); let vid = u16::from_str_radix(vid_str, 16).unwrap_or_default(); let pid = u16::from_str_radix(pid_str, 16).unwrap_or_default(); Device::from_vid_pid(vid, pid) } else { None }; let sysfs_path_clone = sysfs_path.to_owned(); let speed = read_parsed(sysfs_path_clone.join("speed")).ok(); let sysfs_path_clone = sysfs_path.to_owned(); let device_label = read_parsed(sysfs_path_clone.join("device/label")).ok(); let sysfs_path_clone = sysfs_path.to_owned(); let hw_address = read_parsed(sysfs_path_clone.join("address")).ok(); let interface_type = InterfaceType::from_interface_name(interface_name.to_string_lossy()); let driver = dev_uevent.get("DRIVER"); let network_interface = NetworkInterface { interface_name: interface_name.clone(), driver_name: driver.cloned(), interface_type, speed, device, device_label, hw_address, sysfs_path: sysfs_path.to_path_buf(), received_bytes_path: sysfs_path.join(PathBuf::from("statistics/rx_bytes")), sent_bytes_path: sysfs_path.join(PathBuf::from("statistics/tx_bytes")), }; trace!("Created NetworkInterface object of {sysfs_path:?}: {network_interface:?}"); network_interface } /// Returns a display name for this Network Interface. /// It tries to be as human readable as possible. pub fn display_name(&self) -> String { self.device_label .clone() .or_else(|| self.device.map(|device| device.name().to_string())) .unwrap_or_else(|| self.interface_name.to_string_lossy().to_string()) } /// Returns the amount of bytes sent by this Network /// Interface. /// /// # Errors /// /// Will return `Err` if the `tx_bytes` file in sysfs /// is unreadable or not parsable to a `usize` pub fn received_bytes(&self) -> Result { read_parsed(&self.received_bytes_path) } /// Returns the amount of bytes sent by this Network /// Interface /// /// # Errors /// /// Will return `Err` if the `tx_bytes` file in sysfs /// is unreadable or not parsable to a `usize` pub fn sent_bytes(&self) -> Result { read_parsed(&self.sent_bytes_path) } /// Returns the link speed of this connection in bits per second /// /// # Errors /// /// Will return `Err` if the link speed couldn't be determined (e. g. for Wi-Fi connections) pub fn link_speed(&self) -> Result { read_parsed::(self.sysfs_path.join("speed")) .map(|mbps| mbps.saturating_mul(1_000_000)) } /// Returns the appropriate Icon for the type of drive pub fn icon(&self) -> Icon { match self.interface_type { InterfaceType::Bluetooth => ThemedIcon::new("bluetooth-symbolic").into(), InterfaceType::Bridge => ThemedIcon::new("bridge-symbolic").into(), InterfaceType::Docker => ThemedIcon::new("docker-bridge-symbolic").into(), InterfaceType::Ethernet => ThemedIcon::new("ethernet-symbolic").into(), InterfaceType::InfiniBand => ThemedIcon::new("infiniband-symbolic").into(), InterfaceType::Slip => ThemedIcon::new("slip-symbolic").into(), InterfaceType::VirtualEthernet => ThemedIcon::new("virtual-ethernet").into(), InterfaceType::VmBridge => ThemedIcon::new("vm-bridge-symbolic").into(), InterfaceType::Vpn | InterfaceType::Wireguard => ThemedIcon::new("vpn-symbolic").into(), InterfaceType::Wlan => ThemedIcon::new("wlan-symbolic").into(), InterfaceType::Wwan => ThemedIcon::new("wwan-symbolic").into(), InterfaceType::Unknown => Self::default_icon(), } } pub fn is_virtual(&self) -> bool { matches!( self.interface_type, InterfaceType::Bridge | InterfaceType::Docker | InterfaceType::VirtualEthernet | InterfaceType::Vpn | InterfaceType::VmBridge | InterfaceType::Wireguard ) } pub fn default_icon() -> Icon { ThemedIcon::new("unknown-network-type-symbolic").into() } } resources-1.9.1/src/utils/npu/000077500000000000000000000000001510634446000162705ustar00rootroot00000000000000resources-1.9.1/src/utils/npu/intel.rs000066400000000000000000000053221510634446000177530ustar00rootroot00000000000000use anyhow::Result; use process_data::{pci_slot::PciSlot, unix_as_secs_f64}; use std::{ cell::Cell, path::{Path, PathBuf}, }; use crate::utils::{pci::Device, read_parsed}; use super::NpuImpl; #[derive(Debug, Clone, Default)] pub struct IntelNpu { pub device: Option<&'static Device>, pub pci_slot: PciSlot, pub driver: String, sysfs_path: PathBuf, first_hwmon_path: Option, last_busy_time_us: Cell, last_busy_time_timestamp: Cell, } impl IntelNpu { pub fn new( device: Option<&'static Device>, pci_slot: PciSlot, driver: String, sysfs_path: PathBuf, first_hwmon_path: Option, ) -> Self { Self { device, pci_slot, driver, sysfs_path, first_hwmon_path, last_busy_time_us: Cell::default(), last_busy_time_timestamp: Cell::default(), } } } impl NpuImpl for IntelNpu { fn device(&self) -> Option<&'static Device> { self.device } fn pci_slot(&self) -> PciSlot { self.pci_slot } fn driver(&self) -> &str { &self.driver } fn sysfs_path(&self) -> &Path { &self.sysfs_path } fn first_hwmon(&self) -> Option<&Path> { self.first_hwmon_path.as_deref() } fn name(&self) -> Result { self.drm_name() } fn usage(&self) -> Result { let last_timestamp = self.last_busy_time_timestamp.get(); let last_busy_time = self.last_busy_time_us.get(); let new_timestamp = unix_as_secs_f64(); let new_busy_time = read_parsed(self.sysfs_path().join("device/npu_busy_time_us"))?; self.last_busy_time_timestamp.set(new_timestamp); self.last_busy_time_us.set(new_busy_time); let delta_timestamp = new_timestamp - last_timestamp; let delta_busy_time = new_busy_time.saturating_sub(last_busy_time) as f64; Ok(delta_busy_time / delta_timestamp) } fn used_vram(&self) -> Result { self.drm_used_memory().map(|usage| usage as usize) } fn total_vram(&self) -> Result { self.drm_total_memory().map(|usage| usage as usize) } fn temperature(&self) -> Result { self.hwmon_temperature() } fn power_usage(&self) -> Result { self.hwmon_power_usage() } fn core_frequency(&self) -> Result { self.hwmon_core_frequency() } fn memory_frequency(&self) -> Result { self.hwmon_memory_frequency() } fn power_cap(&self) -> Result { self.hwmon_power_cap() } fn power_cap_max(&self) -> Result { self.hwmon_power_cap_max() } } resources-1.9.1/src/utils/npu/mod.rs000066400000000000000000000205121510634446000174150ustar00rootroot00000000000000mod intel; mod other; use anyhow::{Context, Result, bail}; use log::{debug, info, trace}; use process_data::pci_slot::PciSlot; use std::{ path::{Path, PathBuf}, str::FromStr, }; use glob::glob; use crate::{ i18n::i18n, utils::{pci::Device, read_parsed, read_uevent}, }; use self::{intel::IntelNpu, other::OtherNpu}; use super::{ link::{Link, LinkData}, pci::Vendor, }; pub const VID_INTEL: u16 = 0x8086; #[derive(Debug)] pub struct NpuData { pub pci_slot: PciSlot, pub usage_fraction: Option, pub total_memory: Option, pub used_memory: Option, pub clock_speed: Option, pub vram_speed: Option, pub temperature: Option, pub power_usage: Option, pub power_cap: Option, pub power_cap_max: Option, pub link: Option, } impl NpuData { pub fn new(npu: &Npu) -> Self { let pci_slot = npu.pci_slot(); trace!("Gathering NPU data for {pci_slot}…"); let usage_fraction = npu.usage().ok(); let total_memory = npu.total_vram().ok(); let used_memory = npu.used_vram().ok(); let clock_speed = npu.core_frequency().ok(); let vram_speed = npu.memory_frequency().ok(); let temperature = npu.temperature().ok(); let power_usage = npu.power_usage().ok(); let power_cap = npu.power_cap().ok(); let power_cap_max = npu.power_cap_max().ok(); let link = npu.link().ok(); let npu_data = Self { pci_slot, usage_fraction, total_memory, used_memory, clock_speed, vram_speed, temperature, power_usage, power_cap, power_cap_max, link, }; trace!("Gathered NPU data for {pci_slot}: {npu_data:?}"); npu_data } } #[derive(Debug, Clone)] pub enum Npu { Intel(IntelNpu), Other(OtherNpu), } impl Default for Npu { fn default() -> Self { Npu::Other(OtherNpu::default()) } } pub trait NpuImpl { fn device(&self) -> Option<&'static Device>; fn pci_slot(&self) -> PciSlot; fn driver(&self) -> &str; fn sysfs_path(&self) -> &Path; fn first_hwmon(&self) -> Option<&Path>; fn name(&self) -> Result; fn usage(&self) -> Result; fn used_vram(&self) -> Result; fn total_vram(&self) -> Result; fn temperature(&self) -> Result; fn power_usage(&self) -> Result; fn core_frequency(&self) -> Result; fn memory_frequency(&self) -> Result; fn power_cap(&self) -> Result; fn power_cap_max(&self) -> Result; // These are preimplemented ways of getting information through the DRM and hwmon interface. // It's also used as a fallback. fn drm_name(&self) -> Result { Ok(self.device().context("no device")?.name().to_owned()) } fn drm_usage(&self) -> Result { // No NPU driver actually implements this yet, this is a guess for the future based on drm_usage() for GPUs read_parsed(self.sysfs_path().join("device/npu_busy_percent")) } fn drm_used_memory(&self) -> Result { // ivpu will implement this with kernel 6.14, using this as a fallback just in case other vendors start using // this name as well read_parsed(self.sysfs_path().join("device/npu_memory_utilization")) } fn drm_total_memory(&self) -> Result { // No NPU driver actually implements this yet, this is a guess for the future based on ivpu's // npu_memory_utilization read_parsed(self.sysfs_path().join("device/npu_memory_total")) } fn hwmon_path(&self) -> Result<&Path> { self.first_hwmon().context("no hwmon found") } fn hwmon_temperature(&self) -> Result { read_parsed::(self.hwmon_path()?.join("temp1_input")) .map(|temp| temp as f64 / 1000.0) } fn hwmon_power_usage(&self) -> Result { read_parsed::(self.hwmon_path()?.join("power1_average")) .map(|power| power as f64 / 1_000_000.0) } fn hwmon_core_frequency(&self) -> Result { read_parsed::(self.hwmon_path()?.join("freq1_input")).map(|freq| freq as f64) } fn hwmon_memory_frequency(&self) -> Result { read_parsed::(self.hwmon_path()?.join("freq2_input")).map(|freq| freq as f64) } fn hwmon_power_cap(&self) -> Result { read_parsed::(self.hwmon_path()?.join("power1_cap")) .map(|power| power as f64 / 1_000_000.0) } fn hwmon_power_cap_max(&self) -> Result { read_parsed::(self.hwmon_path()?.join("power1_cap_max")) .map(|power| power as f64 / 1_000_000.0) } } impl std::ops::Deref for Npu { type Target = dyn NpuImpl; fn deref(&self) -> &Self::Target { match self { Npu::Intel(npu) => npu, Npu::Other(npu) => npu, } } } impl Npu { /// Returns a `Vec` of all NPUs currently found in the system. /// /// # Errors /// /// Will return `Err` if there are problems detecting /// the NPUs in the system pub fn get_npus() -> Result> { debug!("Searching for NPUs…"); let mut npu_vec: Vec = Vec::new(); for entry in glob("/sys/class/accel/accel?")?.flatten() { if let Ok(npu) = Self::from_sysfs_path(entry) { npu_vec.push(npu); } } debug!("{} NPUs found", npu_vec.len()); Ok(npu_vec) } fn from_sysfs_path>(path: P) -> Result { let path = path.as_ref(); trace!("Creating NPU object of {path:?}…"); let sysfs_device_path = path.join("device"); let uevent_contents = read_uevent(sysfs_device_path.join("uevent"))?; let (device, vid, pid) = if let Some(pci_line) = uevent_contents.get("PCI_ID") { let (vid_str, pid_str) = pci_line.split_once(':').unwrap_or(("0", "0")); let vid = u16::from_str_radix(vid_str, 16).unwrap_or_default(); let pid = u16::from_str_radix(pid_str, 16).unwrap_or_default(); (Device::from_vid_pid(vid, pid), vid, pid) } else { (None, 0, 0) }; let mut hwmon_vec: Vec = Vec::new(); for hwmon in glob(&format!( "{}/hwmon/hwmon?", sysfs_device_path .to_str() .context("error transforming PathBuf to str")? ))? .flatten() { hwmon_vec.push(hwmon); } let pci_slot = PciSlot::from_str( &uevent_contents .get("PCI_SLOT_NAME") .map_or_else(|| i18n("N/A"), std::string::ToString::to_string), ) .context("can't turn PCI string to struct")?; let driver = uevent_contents .get("DRIVER") .map_or_else(|| i18n("N/A"), std::string::ToString::to_string); // if the driver is simple-framebuffer, it's likely not a GPU if driver == "simple-framebuffer" { bail!("this is a simple framebuffer"); } let (npu, npu_category) = if vid == VID_INTEL || driver == "intel_vpu" { ( Npu::Intel(IntelNpu::new( device, pci_slot, driver, path.to_path_buf(), hwmon_vec.first().cloned(), )), "Intel", ) } else { ( Npu::Other(OtherNpu::new( device, pci_slot, driver, path.to_path_buf(), hwmon_vec.first().cloned(), )), "Other", ) }; info!( "Found NPU \"{}\" (PCI slot: {} · PCI ID: {vid:x}:{pid:x} · Category: {npu_category})", npu.name().unwrap_or("".into()), npu.pci_slot(), ); trace!("Created NPU object of {path:?}: {npu:?}"); Ok(npu) } pub fn get_vendor(&self) -> Result<&'static Vendor> { Ok(self.device().context("no device")?.vendor()) } pub fn link(&self) -> Result { Ok(Link::Pcie(LinkData::from_pci_slot(&self.pci_slot())?)) } } resources-1.9.1/src/utils/npu/other.rs000066400000000000000000000037431510634446000177660ustar00rootroot00000000000000use anyhow::Result; use process_data::pci_slot::PciSlot; use std::path::{Path, PathBuf}; use crate::utils::pci::Device; use super::NpuImpl; #[derive(Debug, Clone, Default)] pub struct OtherNpu { pub device: Option<&'static Device>, pub pci_slot: PciSlot, pub driver: String, sysfs_path: PathBuf, first_hwmon_path: Option, } impl OtherNpu { pub fn new( device: Option<&'static Device>, pci_slot: PciSlot, driver: String, sysfs_path: PathBuf, first_hwmon_path: Option, ) -> Self { Self { device, pci_slot, driver, sysfs_path, first_hwmon_path, } } } impl NpuImpl for OtherNpu { fn device(&self) -> Option<&'static Device> { self.device } fn pci_slot(&self) -> PciSlot { self.pci_slot } fn driver(&self) -> &str { &self.driver } fn sysfs_path(&self) -> &Path { &self.sysfs_path } fn first_hwmon(&self) -> Option<&Path> { self.first_hwmon_path.as_deref() } fn name(&self) -> Result { self.drm_name() } fn usage(&self) -> Result { self.drm_usage().map(|usage| usage as f64 / 100.0) } fn used_vram(&self) -> Result { self.drm_used_memory().map(|usage| usage as usize) } fn total_vram(&self) -> Result { self.drm_total_memory().map(|usage| usage as usize) } fn temperature(&self) -> Result { self.hwmon_temperature() } fn power_usage(&self) -> Result { self.hwmon_power_usage() } fn core_frequency(&self) -> Result { self.hwmon_core_frequency() } fn memory_frequency(&self) -> Result { self.hwmon_memory_frequency() } fn power_cap(&self) -> Result { self.hwmon_power_cap() } fn power_cap_max(&self) -> Result { self.hwmon_power_cap_max() } } resources-1.9.1/src/utils/os.rs000066400000000000000000000021051510634446000164530ustar00rootroot00000000000000use lazy_regex::{Lazy, Regex, lazy_regex}; use log::trace; use crate::utils::read_parsed; use super::IS_FLATPAK; const PATH_OS_RELEASE: &str = "/etc/os-release"; const PATH_OS_RELEASE_FLATPAK: &str = "/run/host/etc/os-release"; const PATH_KERNEL_VERSION: &str = "/proc/sys/kernel/osrelease"; static RE_PRETTY_NAME: Lazy = lazy_regex!("PRETTY_NAME=\"(.*)\""); pub struct OsInfo { pub name: Option, pub kernel_version: Option, } impl OsInfo { pub fn get() -> Self { let os_path = if *IS_FLATPAK { PATH_OS_RELEASE_FLATPAK } else { PATH_OS_RELEASE }; trace!("Path for the os-release file is determined to be `{os_path}`"); let name = RE_PRETTY_NAME .captures(&read_parsed::(os_path).unwrap_or_default()) .and_then(|captures| captures.get(1)) .map(|capture| capture.as_str().trim().to_string()); let kernel_version = read_parsed(PATH_KERNEL_VERSION).ok(); OsInfo { name, kernel_version, } } } resources-1.9.1/src/utils/pci.rs000066400000000000000000000333121510634446000166110ustar00rootroot00000000000000use std::{collections::BTreeMap, io::BufRead, sync::LazyLock, time::Instant}; use anyhow::{Context, Result}; use log::{debug, info, trace, warn}; const PATH_PCI_IDS: &str = "/usr/share/hwdata/pci.ids"; const PATH_PCI_IDS_FLATPAK: &str = "/run/host/usr/share/hwdata/pci.ids"; static VENDORS: LazyLock> = LazyLock::new(|| { init() .inspect_err(|e| warn!("Unable to parse pci.ids!\n{e}\n{}", e.backtrace())) .unwrap_or_default() }); #[derive(Clone, Debug, PartialEq, Eq)] pub struct Subdevice { id: u16, vendor_id: u16, name: String, } #[derive(Clone, PartialEq, Eq)] pub struct Device { id: u16, vendor_id: u16, name: String, sub_devices: Vec, } #[derive(Clone, PartialEq, Eq)] pub struct Vendor { id: u16, name: String, devices: BTreeMap, } impl std::fmt::Debug for Device { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.debug_struct("Device") .field("id", &self.id) .field("vendor_id", &self.vendor_id) .field("name", &self.name) .finish_non_exhaustive() } } impl Device { pub fn subdevices(&'static self) -> impl Iterator { self.sub_devices.iter() } pub fn from_vid_pid(vid: u16, pid: u16) -> Option<&'static Self> { VENDORS.get(&vid).and_then(|vendor| vendor.get_device(pid)) } pub fn vendor(&self) -> &'static Vendor { VENDORS .get(&self.vendor_id) .expect("device with no vendor?") } pub fn name(&'static self) -> &'static str { &self.name } pub fn pid(&self) -> u16 { self.id } } impl std::fmt::Debug for Vendor { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.debug_struct("Vendor") .field("id", &self.id) .field("name", &self.name) .finish_non_exhaustive() } } impl Vendor { pub fn from_vid(vid: u16) -> Option<&'static Vendor> { VENDORS.get(&vid) } pub fn devices(&'static self) -> impl Iterator { self.devices.values() } pub fn get_device(&'static self, pid: u16) -> Option<&'static Device> { self.devices.get(&pid) } pub fn name(&'static self) -> &'static str { &self.name } pub fn vid(&self) -> u16 { self.id } } fn parse_pci_ids(reader: R) -> Result> { let mut seen: BTreeMap = BTreeMap::new(); for (number, line) in reader.lines().map_while(Result::ok).enumerate() { if line.starts_with('C') { // case 1: we've reached the classes, time to stop trace!("Line {}: Classes reached, parsing done", number + 1); break; } else if line.starts_with('#') || line.is_empty() { // case 2: we're seeing a comment, don't care // case 3: we're seeing an empty line, also don't care trace!("Line {}: Empty line or comment", number + 1); } else if line.starts_with("\t\t") { // case 4: we're seeing a new sub device of the last seen device let mut split = line.trim_start().splitn(4, ' '); let sub_vid = u16::from_str_radix( split .next() .with_context(|| format!("this subdevice has no vid (line: {line})"))?, 16, )?; let sub_pid = u16::from_str_radix( split .next() .with_context(|| format!("this subdevice has no pid (line: {line})"))?, 16, )?; let name = split .last() .map(str::to_string) .with_context(|| format!("this vendor has no name (line: {line})"))?; let subdevice = Subdevice { id: sub_pid, vendor_id: sub_vid, name, }; trace!("Line {}: New subdevice found: {subdevice:?}", number + 1); seen.values_mut() .last() .and_then(|vendor| vendor.devices.values_mut().last()) .with_context(|| format!("no preceding vendor (line: {line})"))? .sub_devices .push(subdevice); } else if line.starts_with('\t') { // case 5: we're seeing a new device of the last seen vendor let mut split = line.trim_start().split(" "); let vid = *seen .keys() .last() .with_context(|| format!("no preceding device (line: {line})"))?; let pid = u16::from_str_radix( split .next() .with_context(|| format!("this device has no pid (line: {line})"))?, 16, )?; let name = split .next() .map(str::to_string) .with_context(|| format!("this vendor has no name (line: {line})"))?; let device = Device { id: pid, vendor_id: vid, name, sub_devices: Vec::new(), }; trace!("Line {}: New device found: {device:?}", number + 1); seen.values_mut() .last() .with_context(|| format!("no preceding device (line: {line})"))? .devices .insert(pid, device); } else { // case 6: we're seeing a new vendor let mut split = line.split(" "); let vid = u16::from_str_radix( split .next() .with_context(|| format!("this vendor has no vid (line: {line})"))?, 16, )?; let name = split .next() .map(str::to_string) .with_context(|| format!("this vendor has no name (line: {line})"))?; let vendor = Vendor { id: vid, name, devices: BTreeMap::new(), }; trace!("Line {}: New vendor found: {vendor:?}", number + 1); seen.insert(vid, vendor); } } Ok(seen) } fn init() -> Result> { debug!("Parsing pci.ids…"); let start = Instant::now(); // first check if we can use flatpak's FS to get to the (probably newer) host's pci.ids file // // if that doesn't work, we're either not on flatpak or we're not allowed to see the host's pci.ids for some reason, // so try to either access flatpak's own (probably older) pci.ids or the host's if we're not on flatpak let file = std::fs::File::open(PATH_PCI_IDS_FLATPAK).or_else(|_| std::fs::File::open(PATH_PCI_IDS))?; trace!("pci.ids file opened"); let reader = std::io::BufReader::new(file); trace!("Calling parse_pci_ids()"); let map = parse_pci_ids(reader)?; let vendors_count = map.len(); let devices_count: usize = map.values().map(|vendor| vendor.devices.len()).sum(); let subdevices_count: usize = map .values() .map(|vendor| { vendor .devices .values() .map(|device| device.sub_devices.len()) .sum::() }) .sum(); let elapsed = start.elapsed(); info!( "Successfully parsed pci.ids within {elapsed:.2?} (vendors: {vendors_count}, devices: {devices_count}, subdevices: {subdevices_count})" ); Ok(map) } #[cfg(test)] mod test { use pretty_assertions::assert_eq; use std::{collections::BTreeMap, io::BufReader}; use crate::utils::pci::{Device, Subdevice, Vendor, parse_pci_ids}; #[test] fn valid_empty() { let pci_ids = ""; let reader = BufReader::new(pci_ids.as_bytes()); let result = parse_pci_ids(reader).unwrap(); let expected = BTreeMap::new(); assert_eq!(expected, result); } #[test] fn valid_empty_comment() { let pci_ids = "# just a comment"; let reader = BufReader::new(pci_ids.as_bytes()); let result = parse_pci_ids(reader).unwrap(); let expected = BTreeMap::new(); assert_eq!(expected, result); } #[test] fn valid_empty_class() { let pci_ids = "C 00 Unclassified device"; let reader = BufReader::new(pci_ids.as_bytes()); let result = parse_pci_ids(reader).unwrap(); let expected = BTreeMap::new(); assert_eq!(expected, result); } #[test] fn valid_single_vendor() { let pci_ids = "1234 Example Technologies Inc."; let reader = BufReader::new(pci_ids.as_bytes()); let result = parse_pci_ids(reader).unwrap(); let expected = BTreeMap::from([( 0x1234, Vendor { id: 0x1234, name: "Example Technologies Inc.".into(), devices: BTreeMap::new(), }, )]); assert_eq!(expected, result); } #[test] fn valid_single_device() { let pci_ids = concat!( "1234 Example Technologies Inc.\n", "\t5678 Super Device 3000" ); let reader = BufReader::new(pci_ids.as_bytes()); let result = parse_pci_ids(reader).unwrap(); let expected = BTreeMap::from([( 0x1234, Vendor { id: 0x1234, name: "Example Technologies Inc.".into(), devices: BTreeMap::from([( 0x5678, Device { id: 0x5678, vendor_id: 0x1234, name: "Super Device 3000".into(), sub_devices: vec![], }, )]), }, )]); assert_eq!(expected, result); } #[test] fn valid_complex() { let pci_ids = concat!( "# interesting comment\n", "\n", "1234 Example Technologies Inc.\n", "# another interesting comment\n", "\t5678 Super Device 3000\n", "\t5679 Super Device 3000.2 Gen 2x2 5Gbps Somewhat Hi-Speed\n", "dead Zombie Computers LLC\n", "\tbeef Brain\n", "\t\tdead cafe Energy Depot\n", "\t\t1234 abcd Example Braincell\n", "# most interesting comment yet\n", "C 00 Unclassified device" ); let reader = BufReader::new(pci_ids.as_bytes()); let result = parse_pci_ids(reader).unwrap(); let expected = BTreeMap::from([ ( 0x1234, Vendor { id: 0x1234, name: "Example Technologies Inc.".into(), devices: BTreeMap::from([ ( 0x5678, Device { id: 0x5678, vendor_id: 0x1234, name: "Super Device 3000".into(), sub_devices: vec![], }, ), ( 0x5679, Device { id: 0x5679, vendor_id: 0x1234, name: "Super Device 3000.2 Gen 2x2 5Gbps Somewhat Hi-Speed".into(), sub_devices: vec![], }, ), ]), }, ), ( 0xdead, Vendor { id: 0xdead, name: "Zombie Computers LLC".into(), devices: BTreeMap::from([( 0xbeef, Device { id: 0xbeef, vendor_id: 0xdead, name: "Brain".into(), sub_devices: vec![ Subdevice { id: 0xcafe, vendor_id: 0xdead, name: "Energy Depot".into(), }, Subdevice { id: 0xabcd, vendor_id: 0x1234, name: "Example Braincell".into(), }, ], }, )]), }, ), ]); assert_eq!(expected, result) } #[test] fn invalid_no_preceding_vendor() { let pci_ids = "\tabcd Vendorless Device"; let reader = BufReader::new(pci_ids.as_bytes()); let result = parse_pci_ids(reader); assert!(result.is_err()); } #[test] fn invalid_no_preceding_device() { let pci_ids = "\t\t0123 abcd Vendorless Device"; let reader = BufReader::new(pci_ids.as_bytes()); let result = parse_pci_ids(reader); assert!(result.is_err()); } #[test] fn invalid_malformed_vendor() { let pci_ids = concat!("Vendor with no ID :(\n", "\t1234 Device"); let reader = BufReader::new(pci_ids.as_bytes()); let result = parse_pci_ids(reader); assert!(result.is_err()); } #[test] fn invalid_malformed_device() { let pci_ids = concat!("0123 Vendor\n", "\tNo device ID :("); let reader = BufReader::new(pci_ids.as_bytes()); let result = parse_pci_ids(reader); assert!(result.is_err()); } } resources-1.9.1/src/utils/process.rs000066400000000000000000000351271510634446000175220ustar00rootroot00000000000000use anyhow::{Context, Result, bail}; use config::LIBEXECDIR; use log::{debug, error, info, trace}; use process_data::{ Niceness, ProcessData, gpu_usage::{GpuIdentifier, GpuUsageStats}, }; use std::{ collections::BTreeMap, ffi::{OsStr, OsString}, io::{Read, Write}, process::{ChildStdin, ChildStdout, Command, Stdio}, sync::{LazyLock, Mutex}, time::Instant, }; use strum_macros::Display; use gtk::{ gio::{Icon, ThemedIcon}, glib::GString, }; use crate::config; use super::{ FLATPAK_APP_PATH, FLATPAK_SPAWN, FiniteOr, IS_FLATPAK, NUM_CPUS, TICK_RATE, boot_time, }; static COMPANION_PROCESS: LazyLock> = LazyLock::new(|| { let proxy_path = if *IS_FLATPAK { format!( "{}/libexec/resources/resources-processes", FLATPAK_APP_PATH.as_str() ) } else { format!("{LIBEXECDIR}/resources-processes") }; let child = if *IS_FLATPAK { debug!("Spawning resources-processes in Flatpak mode ({proxy_path})"); Command::new(FLATPAK_SPAWN) .args(["--host", proxy_path.as_str()]) .stdin(Stdio::piped()) .stdout(Stdio::piped()) .stderr(Stdio::null()) .spawn() .unwrap() } else { debug!("Spawning resources-processes in native mode ({proxy_path})"); Command::new(proxy_path) .stdin(Stdio::piped()) .stdout(Stdio::piped()) .stderr(Stdio::null()) .spawn() .unwrap() }; let stdin = child.stdin.unwrap(); let stdout = child.stdout.unwrap(); Mutex::new((stdin, stdout)) }); /// Represents a process that can be found within procfs. #[derive(Debug, Clone, PartialEq)] pub struct Process { pub data: ProcessData, pub executable_path: String, pub executable_name: String, pub icon: Icon, pub cpu_time_last: u64, pub timestamp_last: u64, pub read_bytes_last: Option, pub write_bytes_last: Option, pub gpu_usage_stats_last: BTreeMap, pub display_name: String, } // TODO: Better name? #[derive(Debug, Clone, Copy, PartialEq, Eq, Display)] pub enum ProcessAction { TERM, STOP, KILL, CONT, } impl Process { /// Returns a `Vec` containing all currently running processes. /// /// # Errors /// /// Will return `Err` if there are problems traversing and /// parsing procfs pub fn all_data() -> Result> { trace!("all_data() called"); let start = Instant::now(); let output = { trace!("Acquiring companion process lock"); let mut process = COMPANION_PROCESS.lock().unwrap(); trace!("Writing b\"\\n\" into companion process stdin"); let _ = process.0.write_all(b"\n"); trace!("Flushing"); let _ = process.0.flush(); let mut len_bytes = [0_u8; (usize::BITS / 8) as usize]; trace!("Reading companion process output length as little-endian"); process.1.read_exact(&mut len_bytes)?; let len = usize::from_le_bytes(len_bytes); trace!("Companion process output is {len} bytes long"); let mut output_bytes = vec![0; len]; trace!("Reading companion process output"); process.1.read_exact(&mut output_bytes)?; output_bytes }; let elapsed = start.elapsed(); trace!("Companion process was done in {elapsed:.2?}"); trace!("Parsing companion process output"); let parsed = rmp_serde::from_slice(&output).context("unable to decode companion process output"); let elapsed = start.elapsed(); trace!("all_data() done in {elapsed:.2?}"); parsed } pub fn from_process_data(process_data: ProcessData) -> Self { let executable_path = process_data .commandline .split('\0') .nth(0) .and_then(|nul_split| nul_split.split(" --").nth(0)) // chromium (and thus everything based on it) doesn't use \0 as delimiter .unwrap_or(&process_data.commandline) .to_string(); let executable_name = executable_path .split('/') .nth_back(0) .unwrap_or(&process_data.commandline) .to_string(); let read_bytes_last = if process_data.read_bytes.is_some() { Some(0) } else { None }; let write_bytes_last = if process_data.write_bytes.is_some() { Some(0) } else { None }; let display_name = if executable_name.starts_with(&process_data.comm) { executable_name.clone() } else { process_data.comm.clone() }; Self { executable_path, executable_name, data: process_data, icon: ThemedIcon::new("generic-process").into(), cpu_time_last: 0, timestamp_last: 0, read_bytes_last, write_bytes_last, gpu_usage_stats_last: Default::default(), display_name, } } /// Tries to run a command unprivileged and then privileged if permissions were missing fn maybe_pkexec_command, I: IntoIterator>( command: S, args: I, ) -> Result { let args = args .into_iter() .map(|s| s.as_ref().to_os_string()) .collect::>(); let status_code = if *IS_FLATPAK { debug!( "Executing command: {} --host {} {}", FLATPAK_SPAWN, command.as_ref().to_string_lossy(), args.join(&OsString::from(" ")).to_string_lossy() ); Command::new(FLATPAK_SPAWN) .arg("--host") .arg(command.as_ref()) .args(args.clone()) .output()? .status .code() .context("no status code?")? } else { debug!( "Executing command: {} {}", command.as_ref().to_string_lossy(), args.join(&OsString::from(" ")).to_string_lossy() ); Command::new(command.as_ref()) .args(args.clone()) .output()? .status .code() .context("no status code?")? }; if status_code == libc::EPERM || status_code == libc::EACCES { let pkexec_status_code = if *IS_FLATPAK { debug!( "Received EPERM, executing command: {} --host pkexec --disable-internal-agent {} {}", FLATPAK_SPAWN, command.as_ref().to_string_lossy(), args.join(&OsString::from(" ")).to_string_lossy() ); Command::new(FLATPAK_SPAWN) .args(["--host", "pkexec", "--disable-internal-agent"]) .arg(command) .args(args) .output()? .status .code() .context("no status code?")? } else { debug!( "Received EPERM or EACCES, executing command: pkexec --disable-internal-agent {} {}", command.as_ref().to_string_lossy(), args.join(&OsString::from(" ")).to_string_lossy() ); Command::new("pkexec") .arg("--disable-internal-agent") .arg(command) .args(args) .output()? .status .code() .context("no status code?")? }; Ok(pkexec_status_code) } else { Ok(status_code) } } pub fn adjust>( &self, niceness: Niceness, affinity: I, ) -> Result<()> { let adjust_path = if *IS_FLATPAK { format!( "{}/libexec/resources/resources-adjust", FLATPAK_APP_PATH.as_str() ) } else { format!("{LIBEXECDIR}/resources-adjust") }; let affinity_string = affinity .into_iter() .map(|b| if b { '1' } else { '0' }) .collect::(); debug!("Trying to adjust with niceness = {niceness} and affinity = {affinity_string}"); let result = Self::maybe_pkexec_command( adjust_path, [ self.data.pid.to_string(), niceness.to_string(), affinity_string, ], ); if let Ok(return_code) = result { if return_code == 0 { info!("Successfully adjusted {}", self.data.pid); Ok(()) } else { bail!("non-zero return code: {return_code}") } } else if let Err(err) = result { Err(err) } else { bail!("unknown error") } } pub fn execute_process_action(&self, action: ProcessAction) -> Result<()> { let action_string = action.to_string(); let kill_path = if *IS_FLATPAK { format!( "{}/libexec/resources/resources-kill", FLATPAK_APP_PATH.as_str() ) } else { format!("{LIBEXECDIR}/resources-kill") }; let result = Self::maybe_pkexec_command( kill_path, [self.data.pid.to_string(), action_string.clone()], ); if let Ok(return_code) = result { if return_code == 0 || return_code == 3 { info!("Successfully {action_string}ed {}", self.data.pid); Ok(()) } else { error!( "Couldn't {action_string} {}, return code: {return_code}", self.data.pid ); bail!("non-zero return code: {return_code}") } } else if let Err(err) = result { error!( "Unknown error while trying to {action_string} {}\n{err}\n{}", self.data.pid, err.backtrace() ); Err(err) } else { bail!("unknown error") } } #[must_use] pub fn cpu_time_ratio(&self) -> f32 { if self.cpu_time_last == 0 { 0.0 } else { let delta_cpu_time = (self .data .user_cpu_time .saturating_add(self.data.system_cpu_time)) .saturating_sub(self.cpu_time_last) as f32 * 1000.0; let delta_time = self.data.timestamp.saturating_sub(self.timestamp_last); (delta_cpu_time / (delta_time .saturating_mul(*TICK_RATE as u64) .saturating_mul(*NUM_CPUS as u64)) as f32) .finite_or_default() } } #[must_use] pub fn read_speed(&self) -> Option { if let (Some(read_bytes), Some(read_bytes_last)) = (self.data.read_bytes, self.read_bytes_last) { if self.timestamp_last == 0 { Some(0.0) } else { let bytes_delta = read_bytes.saturating_sub(read_bytes_last) as f64; let time_delta = self.data.timestamp.saturating_sub(self.timestamp_last) as f64; Some((bytes_delta / time_delta) * 1000.0) } } else { None } } #[must_use] pub fn write_speed(&self) -> Option { if let (Some(write_bytes), Some(write_bytes_last)) = (self.data.write_bytes, self.write_bytes_last) { if self.timestamp_last == 0 { Some(0.0) } else { let bytes_delta = write_bytes.saturating_sub(write_bytes_last) as f64; let time_delta = self.data.timestamp.saturating_sub(self.timestamp_last) as f64; Some((bytes_delta / time_delta) * 1000.0) } } else { None } } #[must_use] pub fn gpu_usage(&self) -> f32 { let mut returned_gpu_usage = 0.0; for (gpu, usage) in &self.data.gpu_usage_stats { if let Some(old_usage) = self.gpu_usage_stats_last.get(gpu) { let time_delta = self.data.timestamp.saturating_sub(self.timestamp_last); returned_gpu_usage += usage .gfx_fraction(old_usage, time_delta) .unwrap_or_default(); } } returned_gpu_usage } #[must_use] pub fn enc_usage(&self) -> f32 { let mut returned_gpu_usage = 0.0; for (gpu, usage) in &self.data.gpu_usage_stats { if let Some(old_usage) = self.gpu_usage_stats_last.get(gpu) { let time_delta = self.data.timestamp.saturating_sub(self.timestamp_last); returned_gpu_usage += usage .enc_fraction(old_usage, time_delta) .unwrap_or_default(); } } returned_gpu_usage } #[must_use] pub fn dec_usage(&self) -> f32 { let mut returned_gpu_usage = 0.0; for (gpu, usage) in &self.data.gpu_usage_stats { if let Some(old_usage) = self.gpu_usage_stats_last.get(gpu) { let time_delta = self.data.timestamp.saturating_sub(self.timestamp_last); returned_gpu_usage += usage .dec_fraction(old_usage, time_delta) .unwrap_or_default(); } } returned_gpu_usage } #[must_use] pub fn gpu_mem_usage(&self) -> u64 { self.data .gpu_usage_stats .values() .map(|stats| stats.mem().unwrap_or_default()) .sum() } #[must_use] pub fn starttime(&self) -> f64 { self.data.starttime as f64 / *TICK_RATE as f64 } pub fn running_since(&self) -> Result { boot_time() .and_then(|boot_time| { boot_time .add_seconds(self.starttime()) .context("unable to add seconds to boot time") }) .and_then(|time| time.format("%c").context("unable to format running_since")) } pub fn sanitize_cmdline>(cmdline: S) -> Option { let cmdline = cmdline.as_ref(); if cmdline.is_empty() { None } else { Some(cmdline.replace('\0', " ")) } } } resources-1.9.1/src/utils/settings.rs000066400000000000000000000305151510634446000177000ustar00rootroot00000000000000use std::{ops::Deref, str::FromStr, sync::LazyLock}; use adw::prelude::*; use gtk::{SortType, gio, glib}; use log::debug; use strum_macros::{Display, EnumString, FromRepr}; use paste::paste; use crate::config::APP_ID; pub static SETTINGS: LazyLock = LazyLock::new(Settings::default); macro_rules! bool_settings { ($($setting_name:ident),*) => { $( pub fn $setting_name(&self) -> bool { self.boolean(&stringify!($setting_name).replace("_", "-")) } paste! { pub fn [](&self, value: bool) -> Result<(), glib::error::BoolError> { debug!("Setting boolean {} to {value}", stringify!($setting_name).replace("_", "-")); self.set_boolean(&stringify!($setting_name).replace("_", "-"), value) } pub fn [](&self, f: F) -> glib::SignalHandlerId { self.connect_changed( Some(&stringify!($setting_name).replace("_", "-")), move |settings, _key| { f(settings.boolean(&stringify!($setting_name).replace("_", "-"))) }, ) } } )* }; } macro_rules! int_settings { ($($setting_name:ident),*) => { $( pub fn $setting_name(&self) -> i32 { self.int(&stringify!($setting_name).replace("_", "-")) } paste! { pub fn [](&self, value: i32) -> Result<(), glib::error::BoolError> { debug!("Setting int {} to {value}", stringify!($setting_name).replace("_", "-")); self.set_int(&stringify!($setting_name).replace("_", "-"), value) } pub fn [](&self, f: F) -> glib::SignalHandlerId { self.connect_changed( Some(&stringify!($setting_name).replace("_", "-")), move |settings, _key| { f(settings.int(&stringify!($setting_name).replace("_", "-"))) }, ) } } )* }; } macro_rules! uint_settings { ($($setting_name:ident),*) => { $( pub fn $setting_name(&self) -> u32 { self.uint(&stringify!($setting_name).replace("_", "-")) } paste! { pub fn [](&self, value: u32) -> Result<(), glib::error::BoolError> { debug!("Setting uint {} to {value}", stringify!($setting_name).replace("_", "-")); self.set_uint(&stringify!($setting_name).replace("_", "-"), value) } pub fn [](&self, f: F) -> glib::SignalHandlerId { self.connect_changed( Some(&stringify!($setting_name).replace("_", "-")), move |settings, _key| { f(settings.uint(&stringify!($setting_name).replace("_", "-"))) }, ) } } )* }; } #[repr(u8)] #[derive(Debug, Clone, Copy, Default, EnumString, Display, Hash, FromRepr)] pub enum Base { #[default] Decimal, Binary, } impl Base { pub const fn base(&self) -> f64 { match self { Base::Decimal => 1000.0, Base::Binary => 1024.0, } } } #[repr(u8)] #[derive(Debug, Clone, Copy, Default, EnumString, Display, Hash, FromRepr)] pub enum TemperatureUnit { #[default] Celsius, Kelvin, Fahrenheit, } #[repr(u8)] #[derive(Debug, Clone, Copy, Default, EnumString, Display, Hash, FromRepr)] pub enum RefreshSpeed { VerySlow, Slow, #[default] Normal, Fast, VeryFast, } impl RefreshSpeed { pub const fn ui_refresh_interval(&self) -> f32 { match self { RefreshSpeed::VerySlow => 3.0, RefreshSpeed::Slow => 2.0, RefreshSpeed::Normal => 1.0, RefreshSpeed::Fast => 0.5, RefreshSpeed::VeryFast => 0.25, } } } #[repr(u8)] #[derive(Debug, Clone, Copy, Default, PartialEq, EnumString, Display, Hash, FromRepr)] pub enum SidebarMeterType { #[default] ProgressBar, Graph, } #[derive(Clone, Debug, Hash)] pub struct Settings(gio::Settings); impl Settings { pub fn temperature_unit(&self) -> TemperatureUnit { TemperatureUnit::from_str(self.string("temperature-unit").as_str()).unwrap_or_default() } pub fn set_temperature_unit( &self, value: TemperatureUnit, ) -> Result<(), glib::error::BoolError> { debug!("Setting temperature-unit to {value}"); self.set_string("temperature-unit", &value.to_string()) } pub fn connect_temperature_unit( &self, f: F, ) -> glib::SignalHandlerId { self.connect_changed(Some("temperature-unit"), move |settings, _key| { f( TemperatureUnit::from_str(settings.string("temperature-unit").as_str()) .unwrap_or_default(), ); }) } pub fn base(&self) -> Base { Base::from_str(self.string("base").as_str()).unwrap_or_default() } pub fn set_base(&self, value: Base) -> Result<(), glib::error::BoolError> { debug!("Setting base to {value}"); self.set_string("base", &value.to_string()) } pub fn connect_base(&self, f: F) -> glib::SignalHandlerId { self.connect_changed(Some("base"), move |settings, _key| { f(Base::from_str(settings.string("base").as_str()).unwrap_or_default()); }) } pub fn last_viewed_page(&self) -> String { self.string("last-viewed-page").to_string() } pub fn set_last_viewed_page>( &self, value: S, ) -> Result<(), glib::error::BoolError> { debug!("Setting last-viewed-page to {}", value.as_ref()); self.set_string("last-viewed-page", value.as_ref()) } pub fn connect_last_viewed_page(&self, f: F) -> glib::SignalHandlerId { self.connect_changed(Some("last-viewed-page"), move |settings, _key| { f(settings.string("last-viewed-page").to_string()); }) } pub fn refresh_speed(&self) -> RefreshSpeed { RefreshSpeed::from_str(self.string("refresh-speed").as_str()).unwrap_or_default() } pub fn set_refresh_speed(&self, value: RefreshSpeed) -> Result<(), glib::error::BoolError> { debug!("Setting refresh-speed to {value}"); self.set_string("refresh-speed", &value.to_string()) } pub fn connect_refresh_speed( &self, f: F, ) -> glib::SignalHandlerId { self.connect_changed(Some("refresh-speed"), move |settings, _key| { f( RefreshSpeed::from_str(settings.string("refresh-speed").as_str()) .unwrap_or_default(), ); }) } pub fn sidebar_meter_type(&self) -> SidebarMeterType { SidebarMeterType::from_str(self.string("sidebar-meter-type").as_str()).unwrap_or_default() } pub fn set_sidebar_meter_type( &self, value: SidebarMeterType, ) -> Result<(), glib::error::BoolError> { debug!("Setting sidebar-meter-type to {value}"); self.set_string("sidebar-meter-type", &value.to_string()) } pub fn connect_sidebar_meter_type( &self, f: F, ) -> glib::SignalHandlerId { self.connect_changed(Some("sidebar-meter-type"), move |settings, _key| { f( SidebarMeterType::from_str(settings.string("sidebar-meter-type").as_str()) .unwrap_or_default(), ); }) } // the following three functions are kept for compatibility reasons and for not having an oddly named function // called "set_is_maximized" generated by the macro pub fn maximized(&self) -> bool { self.boolean("is-maximized") } pub fn set_maximized(&self, value: bool) -> Result<(), glib::error::BoolError> { debug!("Setting boolean is-maximized to {value}"); self.set_boolean("is-maximized", value) } pub fn connect_maximized(&self, f: F) -> glib::SignalHandlerId { self.connect_changed(Some("is-maximized"), move |settings, _key| { f(settings.boolean("is-maximized")); }) } pub fn processes_sort_by_ascending(&self) -> SortType { if self.boolean("processes-sort-by-ascending") { SortType::Ascending } else { SortType::Descending } } pub fn set_processes_sort_by_ascending( &self, value: SortType, ) -> Result<(), glib::error::BoolError> { let setting = matches!(value, SortType::Ascending); debug!("Setting boolean processes-sort-by-ascending to {setting}"); self.set_boolean("processes-sort-by-ascending", setting) } pub fn connect_processes_sort_by_ascending( &self, f: F, ) -> glib::SignalHandlerId { self.connect_changed( Some("processes-sort-by-ascending"), move |settings, _key| { let sort_type = if settings.boolean("processes-sort-by-ascending") { SortType::Ascending } else { SortType::Descending }; f(sort_type); }, ) } pub fn apps_sort_by_ascending(&self) -> SortType { if self.boolean("apps-sort-by-ascending") { SortType::Ascending } else { SortType::Descending } } pub fn set_apps_sort_by_ascending( &self, value: SortType, ) -> Result<(), glib::error::BoolError> { let setting = matches!(value, SortType::Ascending); debug!("Setting boolean apps-sort-by-ascending to {setting}"); self.set_boolean("apps-sort-by-ascending", setting) } pub fn connect_apps_sort_by_ascending( &self, f: F, ) -> glib::SignalHandlerId { self.connect_changed(Some("apps-sort-by-ascending"), move |settings, _key| { let sort_type = if settings.boolean("apps-sort-by-ascending") { SortType::Ascending } else { SortType::Descending }; f(sort_type); }) } int_settings!(window_width, window_height); uint_settings!(graph_data_points, apps_sort_by, processes_sort_by); bool_settings!( show_virtual_drives, show_virtual_network_interfaces, sidebar_details, sidebar_description, network_bits, apps_show_memory, apps_show_cpu, apps_show_drive_read_speed, apps_show_drive_read_total, apps_show_drive_write_speed, apps_show_drive_write_total, apps_show_gpu, apps_show_gpu_memory, apps_show_encoder, apps_show_decoder, apps_show_swap, apps_show_combined_memory, processes_show_id, processes_show_user, processes_show_memory, processes_show_cpu, processes_show_drive_read_speed, processes_show_drive_read_total, processes_show_drive_write_speed, processes_show_drive_write_total, processes_show_gpu, processes_show_gpu_memory, processes_show_encoder, processes_show_decoder, processes_show_total_cpu_time, processes_show_user_cpu_time, processes_show_system_cpu_time, processes_show_priority, processes_show_swap, processes_show_combined_memory, processes_show_commandline, show_logical_cpus, show_graph_grids, normalize_cpu_usage, detailed_priority ); } impl Deref for Settings { type Target = gio::Settings; fn deref(&self) -> &Self::Target { &self.0 } } impl Default for Settings { fn default() -> Self { Self(gio::Settings::new(APP_ID)) } } unsafe impl Send for Settings {} unsafe impl Sync for Settings {} resources-1.9.1/src/utils/units.rs000066400000000000000000000453361510634446000172110ustar00rootroot00000000000000use strum::IntoEnumIterator; use strum_macros::{Display, EnumIter, EnumString}; use crate::i18n::i18n_f; use super::settings::{Base, SETTINGS, TemperatureUnit}; #[repr(u8)] #[derive( Debug, Clone, Copy, Default, EnumString, Display, Hash, EnumIter, PartialEq, PartialOrd, Eq, Ord, )] enum Prefix { #[default] None, Kilo, Mega, Giga, Tera, Peta, Exa, Zetta, Yotta, Ronna, Quetta, } pub fn format_time(time_in_seconds: f64) -> String { if time_in_seconds.is_nan() || time_in_seconds.is_infinite() { return time_in_seconds.to_string().replace("inf", "∞"); } let negative = time_in_seconds.is_sign_negative(); let time_in_seconds = time_in_seconds.abs(); let millis = ((time_in_seconds - time_in_seconds.floor()) * 100.0) as u8; let seconds = (time_in_seconds % 60.0) as u8; let minutes = ((time_in_seconds / 60.0) % 60.0) as u8; let hours = (time_in_seconds / (60.0 * 60.0)) as usize; if negative { format!("-{hours}∶{minutes:02}∶{seconds:02}.{millis:02}") } else { format!("{hours}∶{minutes:02}∶{seconds:02}.{millis:02}") } } pub fn format_time_integer(time_in_seconds: isize) -> String { let negative = time_in_seconds.is_negative(); let time_in_seconds = time_in_seconds.abs(); let seconds = (time_in_seconds % 60) as u8; let minutes = ((time_in_seconds / 60) % 60) as u8; let hours = (time_in_seconds / (60 * 60)) as usize; if negative { format!("-{hours}∶{minutes:02}∶{seconds:02}") } else { format!("{hours}∶{minutes:02}∶{seconds:02}") } } fn to_largest_prefix(amount: f64, prefix_base: Base) -> (f64, Prefix) { if amount.is_nan() || amount.is_infinite() { return (amount, Prefix::None); } let negative_factor = if amount.is_sign_negative() { -1.0 } else { 1.0 }; let mut x = amount.abs(); let base = prefix_base.base(); for prefix in Prefix::iter() { if x < base { return (x * negative_factor, prefix); } x /= base; } (x * negative_factor, Prefix::Quetta) } fn celsius_to_fahrenheit(celsius: f64) -> f64 { celsius * 1.8 + 32.0 } fn celsius_to_kelvin(celsius: f64) -> f64 { celsius + 273.15 } pub fn convert_temperature(celsius: f64) -> String { match SETTINGS.temperature_unit() { TemperatureUnit::Kelvin => { i18n_f("{} K", &[&(celsius_to_kelvin(celsius).round()).to_string()]) } TemperatureUnit::Celsius => i18n_f("{} °C", &[&(celsius.round()).to_string()]), TemperatureUnit::Fahrenheit => i18n_f( "{} °F", &[&(celsius_to_fahrenheit(celsius).round()).to_string()], ), } } pub fn convert_storage(bytes: f64, integer: bool) -> String { match SETTINGS.base() { Base::Decimal => convert_storage_decimal(bytes, integer), Base::Binary => convert_storage_binary(bytes, integer), } } pub fn convert_storage_decimal(bytes: f64, integer: bool) -> String { let (mut number, prefix) = to_largest_prefix(bytes, Base::Decimal); if integer { number = number.round(); match prefix { Prefix::None => i18n_f("{} B", &[&number.to_string()]), Prefix::Kilo => i18n_f("{} kB", &[&number.to_string()]), Prefix::Mega => i18n_f("{} MB", &[&number.to_string()]), Prefix::Giga => i18n_f("{} GB", &[&number.to_string()]), Prefix::Tera => i18n_f("{} TB", &[&number.to_string()]), Prefix::Peta => i18n_f("{} PB", &[&number.to_string()]), Prefix::Exa => i18n_f("{} EB", &[&number.to_string()]), Prefix::Zetta => i18n_f("{} ZB", &[&number.to_string()]), Prefix::Yotta => i18n_f("{} YB", &[&number.to_string()]), Prefix::Ronna => i18n_f("{} RB", &[&number.to_string()]), Prefix::Quetta => i18n_f("{} QB", &[&number.to_string()]), } } else { match prefix { Prefix::None => i18n_f("{} B", &[&format!("{}", number.round())]), Prefix::Kilo => i18n_f("{} kB", &[&format!("{number:.2}")]), Prefix::Mega => i18n_f("{} MB", &[&format!("{number:.2}")]), Prefix::Giga => i18n_f("{} GB", &[&format!("{number:.2}")]), Prefix::Tera => i18n_f("{} TB", &[&format!("{number:.2}")]), Prefix::Peta => i18n_f("{} PB", &[&format!("{number:.2}")]), Prefix::Exa => i18n_f("{} EB", &[&format!("{number:.2}")]), Prefix::Zetta => i18n_f("{} ZB", &[&format!("{number:.2}")]), Prefix::Yotta => i18n_f("{} YB", &[&format!("{number:.2}")]), Prefix::Ronna => i18n_f("{} RB", &[&format!("{number:.2}")]), Prefix::Quetta => i18n_f("{} QB", &[&format!("{number:.2}")]), } } } pub fn convert_storage_binary(bytes: f64, integer: bool) -> String { let (mut number, prefix) = to_largest_prefix(bytes, Base::Binary); if integer { number = number.round(); match prefix { Prefix::None => i18n_f("{} B", &[&number.to_string()]), Prefix::Kilo => i18n_f("{} KiB", &[&number.to_string()]), Prefix::Mega => i18n_f("{} MiB", &[&number.to_string()]), Prefix::Giga => i18n_f("{} GiB", &[&number.to_string()]), Prefix::Tera => i18n_f("{} TiB", &[&number.to_string()]), Prefix::Peta => i18n_f("{} PiB", &[&number.to_string()]), Prefix::Exa => i18n_f("{} EiB", &[&number.to_string()]), Prefix::Zetta => i18n_f("{} ZiB", &[&number.to_string()]), Prefix::Yotta => i18n_f("{} YiB", &[&number.to_string()]), Prefix::Ronna => i18n_f("{} RiB", &[&number.to_string()]), Prefix::Quetta => i18n_f("{} QiB", &[&number.to_string()]), } } else { match prefix { Prefix::None => i18n_f("{} B", &[&format!("{}", number.round())]), Prefix::Kilo => i18n_f("{} KiB", &[&format!("{number:.2}")]), Prefix::Mega => i18n_f("{} MiB", &[&format!("{number:.2}")]), Prefix::Giga => i18n_f("{} GiB", &[&format!("{number:.2}")]), Prefix::Tera => i18n_f("{} TiB", &[&format!("{number:.2}")]), Prefix::Peta => i18n_f("{} PiB", &[&format!("{number:.2}")]), Prefix::Exa => i18n_f("{} EiB", &[&format!("{number:.2}")]), Prefix::Zetta => i18n_f("{} ZiB", &[&format!("{number:.2}")]), Prefix::Yotta => i18n_f("{} YiB", &[&format!("{number:.2}")]), Prefix::Ronna => i18n_f("{} RiB", &[&format!("{number:.2}")]), Prefix::Quetta => i18n_f("{} QiB", &[&format!("{number:.2}")]), } } } pub fn convert_speed(bytes_per_second: f64, network: bool) -> String { match SETTINGS.base() { Base::Decimal => { if network && SETTINGS.network_bits() { convert_speed_bits_decimal(bytes_per_second * 8.0) } else { convert_speed_decimal(bytes_per_second) } } Base::Binary => { if network && SETTINGS.network_bits() { convert_speed_bits_binary(bytes_per_second * 8.0) } else { convert_speed_binary(bytes_per_second) } } } } pub fn convert_speed_decimal(bytes_per_second: f64) -> String { let (number, prefix) = to_largest_prefix(bytes_per_second, Base::Decimal); match prefix { Prefix::None => i18n_f("{} B/s", &[&format!("{}", number.round())]), Prefix::Kilo => i18n_f("{} kB/s", &[&format!("{number:.2}")]), Prefix::Mega => i18n_f("{} MB/s", &[&format!("{number:.2}")]), Prefix::Giga => i18n_f("{} GB/s", &[&format!("{number:.2}")]), Prefix::Tera => i18n_f("{} TB/s", &[&format!("{number:.2}")]), Prefix::Peta => i18n_f("{} PB/s", &[&format!("{number:.2}")]), Prefix::Exa => i18n_f("{} EB/s", &[&format!("{number:.2}")]), Prefix::Zetta => i18n_f("{} ZB/s", &[&format!("{number:.2}")]), Prefix::Yotta => i18n_f("{} YB/s", &[&format!("{number:.2}")]), Prefix::Ronna => i18n_f("{} RB/s", &[&format!("{number:.2}")]), Prefix::Quetta => i18n_f("{} QB/s", &[&format!("{number:.2}")]), } } pub fn convert_speed_binary(bytes_per_second: f64) -> String { let (number, prefix) = to_largest_prefix(bytes_per_second, Base::Binary); match prefix { Prefix::None => i18n_f("{} B/s", &[&format!("{}", number.round())]), Prefix::Kilo => i18n_f("{} KiB/s", &[&format!("{number:.2}")]), Prefix::Mega => i18n_f("{} MiB/s", &[&format!("{number:.2}")]), Prefix::Giga => i18n_f("{} GiB/s", &[&format!("{number:.2}")]), Prefix::Tera => i18n_f("{} TiB/s", &[&format!("{number:.2}")]), Prefix::Peta => i18n_f("{} PiB/s", &[&format!("{number:.2}")]), Prefix::Exa => i18n_f("{} EiB/s", &[&format!("{number:.2}")]), Prefix::Zetta => i18n_f("{} ZiB/s", &[&format!("{number:.2}")]), Prefix::Yotta => i18n_f("{} YiB/s", &[&format!("{number:.2}")]), Prefix::Ronna => i18n_f("{} RiB/s", &[&format!("{number:.2}")]), Prefix::Quetta => i18n_f("{} QiB/s", &[&format!("{number:.2}")]), } } pub fn convert_speed_bits_decimal(bits_per_second: f64) -> String { convert_speed_bits_decimal_with_places(bits_per_second, 2) } pub fn convert_speed_bits_decimal_with_places( bits_per_second: f64, decimal_places: usize, ) -> String { let (number, prefix) = to_largest_prefix(bits_per_second, Base::Decimal); match prefix { Prefix::None => i18n_f("{} b/s", &[&format!("{}", number.round())]), Prefix::Kilo => i18n_f("{} kb/s", &[&format!("{number:.decimal_places$}")]), Prefix::Mega => i18n_f("{} Mb/s", &[&format!("{number:.decimal_places$}")]), Prefix::Giga => i18n_f("{} Gb/s", &[&format!("{number:.decimal_places$}")]), Prefix::Tera => i18n_f("{} Tb/s", &[&format!("{number:.decimal_places$}")]), Prefix::Peta => i18n_f("{} Pb/s", &[&format!("{number:.decimal_places$}")]), Prefix::Exa => i18n_f("{} Eb/s", &[&format!("{number:.decimal_places$}")]), Prefix::Zetta => i18n_f("{} Zb/s", &[&format!("{number:.decimal_places$}")]), Prefix::Yotta => i18n_f("{} Yb/s", &[&format!("{number:.decimal_places$}")]), Prefix::Ronna => i18n_f("{} Rb/s", &[&format!("{number:.decimal_places$}")]), Prefix::Quetta => i18n_f("{} Qb/s", &[&format!("{number:.decimal_places$}")]), } } pub fn convert_speed_bits_binary(bits_per_second: f64) -> String { let (number, prefix) = to_largest_prefix(bits_per_second, Base::Binary); match prefix { Prefix::None => i18n_f("{} b/s", &[&format!("{}", number.round())]), Prefix::Kilo => i18n_f("{} Kib/s", &[&format!("{number:.2}")]), Prefix::Mega => i18n_f("{} Mib/s", &[&format!("{number:.2}")]), Prefix::Giga => i18n_f("{} Gib/s", &[&format!("{number:.2}")]), Prefix::Tera => i18n_f("{} Tib/s", &[&format!("{number:.2}")]), Prefix::Peta => i18n_f("{} Pib/s", &[&format!("{number:.2}")]), Prefix::Exa => i18n_f("{} Eib/s", &[&format!("{number:.2}")]), Prefix::Zetta => i18n_f("{} Zib/s", &[&format!("{number:.2}")]), Prefix::Yotta => i18n_f("{} Yib/s", &[&format!("{number:.2}")]), Prefix::Ronna => i18n_f("{} Rib/s", &[&format!("{number:.2}")]), Prefix::Quetta => i18n_f("{} Qib/s", &[&format!("{number:.2}")]), } } pub fn convert_frequency(hertz: f64) -> String { let (number, prefix) = to_largest_prefix(hertz, Base::Decimal); match prefix { Prefix::None => i18n_f("{} Hz", &[&format!("{number:.2}")]), Prefix::Kilo => i18n_f("{} kHz", &[&format!("{number:.2}")]), Prefix::Mega => i18n_f("{} MHz", &[&format!("{number:.2}")]), Prefix::Giga => i18n_f("{} GHz", &[&format!("{number:.2}")]), Prefix::Tera => i18n_f("{} THz", &[&format!("{number:.2}")]), Prefix::Peta => i18n_f("{} PHz", &[&format!("{number:.2}")]), Prefix::Exa => i18n_f("{} EHz", &[&format!("{number:.2}")]), Prefix::Zetta => i18n_f("{} ZHz", &[&format!("{number:.2}")]), Prefix::Yotta => i18n_f("{} YHz", &[&format!("{number:.2}")]), Prefix::Ronna => i18n_f("{} RHz", &[&format!("{number:.2}")]), Prefix::Quetta => i18n_f("{} QHz", &[&format!("{number:.2}")]), } } pub fn convert_power(watts: f64) -> String { let (number, prefix) = to_largest_prefix(watts, Base::Decimal); match prefix { Prefix::None => i18n_f("{} W", &[&format!("{number:.1}")]), Prefix::Kilo => i18n_f("{} kW", &[&format!("{number:.2}")]), Prefix::Mega => i18n_f("{} MW", &[&format!("{number:.2}")]), Prefix::Giga => i18n_f("{} GW", &[&format!("{number:.2}")]), Prefix::Tera => i18n_f("{} TW", &[&format!("{number:.2}")]), Prefix::Peta => i18n_f("{} PW", &[&format!("{number:.2}")]), Prefix::Exa => i18n_f("{} EW", &[&format!("{number:.2}")]), Prefix::Zetta => i18n_f("{} ZW", &[&format!("{number:.2}")]), Prefix::Yotta => i18n_f("{} YW", &[&format!("{number:.2}")]), Prefix::Ronna => i18n_f("{} RW", &[&format!("{number:.2}")]), Prefix::Quetta => i18n_f("{} QW", &[&format!("{number:.2}")]), } } pub fn convert_energy(watthours: f64, integer: bool) -> String { let (mut number, prefix) = to_largest_prefix(watthours, Base::Decimal); if integer { number = number.round(); match prefix { Prefix::None => i18n_f("{} Wh", &[&number.to_string()]), Prefix::Kilo => i18n_f("{} kWh", &[&number.to_string()]), Prefix::Mega => i18n_f("{} MWh", &[&number.to_string()]), Prefix::Giga => i18n_f("{} GWh", &[&number.to_string()]), Prefix::Tera => i18n_f("{} TWh", &[&number.to_string()]), Prefix::Peta => i18n_f("{} PWh", &[&number.to_string()]), Prefix::Exa => i18n_f("{} EWh", &[&number.to_string()]), Prefix::Zetta => i18n_f("{} ZWh", &[&number.to_string()]), Prefix::Yotta => i18n_f("{} YWh", &[&number.to_string()]), Prefix::Ronna => i18n_f("{} RWh", &[&number.to_string()]), Prefix::Quetta => i18n_f("{} QWh", &[&number.to_string()]), } } else { match prefix { Prefix::None => i18n_f("{} Wh", &[&format!("{number:.1}")]), Prefix::Kilo => i18n_f("{} kWh", &[&format!("{number:.2}")]), Prefix::Mega => i18n_f("{} MWh", &[&format!("{number:.2}")]), Prefix::Giga => i18n_f("{} GWh", &[&format!("{number:.2}")]), Prefix::Tera => i18n_f("{} TWh", &[&format!("{number:.2}")]), Prefix::Peta => i18n_f("{} PWh", &[&format!("{number:.2}")]), Prefix::Exa => i18n_f("{} EWh", &[&format!("{number:.2}")]), Prefix::Zetta => i18n_f("{} ZWh", &[&format!("{number:.2}")]), Prefix::Yotta => i18n_f("{} YWh", &[&format!("{number:.2}")]), Prefix::Ronna => i18n_f("{} RWh", &[&format!("{number:.2}")]), Prefix::Quetta => i18n_f("{} QWh", &[&format!("{number:.2}")]), } } } #[cfg(test)] mod test { use crate::utils::{ settings::Base, units::{Prefix, celsius_to_fahrenheit, celsius_to_kelvin, to_largest_prefix}, }; use pretty_assertions::assert_eq; use super::format_time; #[test] fn format_time_negative() { let seconds = -3723.13; let formatted_time = format_time(seconds); assert_eq!("-1∶02∶03.13", formatted_time) } #[test] fn format_time_zero() { let seconds = 0.0; let formatted_time = format_time(seconds); assert_eq!("0∶00∶00.00", formatted_time) } #[test] fn format_time_positive() { let seconds = 3723.13; let formatted_time = format_time(seconds); assert_eq!("1∶02∶03.13", formatted_time) } #[test] fn format_time_nan() { let seconds = f64::NAN; let formatted_time = format_time(seconds); assert_eq!("NaN", formatted_time) } #[test] fn format_time_infinity() { let seconds = f64::INFINITY; let formatted_time = format_time(seconds); assert_eq!("∞", formatted_time) } #[test] fn format_time_neg_infinity() { let seconds = f64::NEG_INFINITY; let formatted_time = format_time(seconds); assert_eq!("-∞", formatted_time) } #[test] fn to_largest_prefix_decimal_giga_negative() { let raw = -123_400_000_000.0; let formatted = to_largest_prefix(raw, Base::Decimal); assert_eq!((-123.4f64, Prefix::Giga), formatted) } #[test] fn to_largest_prefix_binary_giga_negative() { let raw = -132_499_741_081.6; let formatted = to_largest_prefix(raw, Base::Binary); assert_eq!((-123.4f64, Prefix::Giga), formatted) } #[test] fn to_largest_prefix_decimal_none() { let raw = 123.4; let formatted = to_largest_prefix(raw, Base::Decimal); assert_eq!((123.4f64, Prefix::None), formatted) } #[test] fn to_largest_prefix_binary_none() { let raw = 123.4; let formatted = to_largest_prefix(raw, Base::Binary); assert_eq!((123.4f64, Prefix::None), formatted) } #[test] fn to_largest_prefix_decimal_giga() { let raw = 123_400_000_000.0; let formatted = to_largest_prefix(raw, Base::Decimal); assert_eq!((123.4f64, Prefix::Giga), formatted) } #[test] fn to_largest_prefix_binary_giga() { let raw = 132_499_741_081.6; let formatted = to_largest_prefix(raw, Base::Binary); assert_eq!((123.4f64, Prefix::Giga), formatted) } #[test] fn to_largest_prefix_nan() { let raw = f64::NAN; let formatted = to_largest_prefix(raw, Base::Binary); // normal assert_eq! is not possible because NaN != NaN assert_eq!(formatted.0.is_nan(), true); assert_eq!(formatted.1, Prefix::None); } #[test] fn to_largest_prefix_infinity() { let raw = f64::INFINITY; let formatted = to_largest_prefix(raw, Base::Binary); assert_eq!((f64::INFINITY, Prefix::None), formatted) } #[test] fn to_largest_prefix_neg_infinity() { let raw = f64::NEG_INFINITY; let formatted = to_largest_prefix(raw, Base::Binary); assert_eq!((f64::NEG_INFINITY, Prefix::None), formatted) } #[test] fn celsius_to_kelvin_valid() { let celsius = 20.0; let kelvin = celsius_to_kelvin(celsius); assert_eq!(293.15, kelvin); } #[test] fn celsius_to_fahrenheit_valid() { let celsius = 20.0; let fahrenheit = celsius_to_fahrenheit(celsius); assert_eq!(68.0, fahrenheit); } }